--- a/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -310,3 +310,5 @@
4915246064b2f89d5f00c96e758686b7fdad36a6 jdk9-b65
ff3fc75f3214ad7e03595be1b0d0f38d887b6f0e jdk9-b66
56166ce66037952fa21e9f680b31bf8eb47312c0 jdk9-b67
+5b500c93ce4822d47061cd518ff3f72d9d8cb5b5 jdk9-b68
+d69c968463f0ae5d0b45de3fc14fe65171b23948 jdk9-b69
--- a/.hgtags-top-repo Wed Jun 24 17:45:44 2015 +0200
+++ b/.hgtags-top-repo Thu Jun 25 07:13:27 2015 +0000
@@ -310,3 +310,5 @@
7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65
dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
+70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68
+1bcfd6b8726582cff5a42dbfc75903e36f9dd4fe jdk9-b69
--- a/common/autoconf/basics.m4 Wed Jun 24 17:45:44 2015 +0200
+++ b/common/autoconf/basics.m4 Thu Jun 25 07:13:27 2015 +0000
@@ -436,7 +436,6 @@
BASIC_PATH_PROGS(CYGPATH, cygpath)
BASIC_PATH_PROGS(READLINK, [greadlink readlink])
BASIC_PATH_PROGS(DF, df)
- BASIC_PATH_PROGS(SETFILE, SetFile)
BASIC_PATH_PROGS(CPIO, [cpio bsdcpio])
])
@@ -574,10 +573,11 @@
)
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
- # detect if Xcode is installed by running xcodebuild -version
+ # If a devkit has been supplied, find xcodebuild in the toolchain_path.
+ # If not, detect if Xcode is installed by running xcodebuild -version
# if no Xcode installed, xcodebuild exits with 1
# if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
- if /usr/bin/xcodebuild -version >/dev/null 2>&1; then
+ if test "x$DEVKIT_ROOT" != x || /usr/bin/xcodebuild -version >/dev/null 2>&1; then
# We need to use xcodebuild in the toolchain dir provided by the user, this will
# fall back on the stub binary in /usr/bin/xcodebuild
AC_PATH_PROG([XCODEBUILD], [xcodebuild], [/usr/bin/xcodebuild], [$TOOLCHAIN_PATH])
@@ -961,6 +961,7 @@
AC_MSG_RESULT([yes])
fi
fi
+ BASIC_REQUIRE_PROGS(SETFILE, SetFile)
fi
])
--- a/common/autoconf/build-aux/config.guess Wed Jun 24 17:45:44 2015 +0200
+++ b/common/autoconf/build-aux/config.guess Thu Jun 25 07:13:27 2015 +0000
@@ -86,4 +86,11 @@
fi
fi
+# Test and fix cpu on Macosx when C preprocessor is not on the path
+echo $OUT | grep i386-apple-darwin > /dev/null 2> /dev/null
+if test $? = 0; then
+ REAL_CPU=`uname -m`
+ OUT=$REAL_CPU`echo $OUT | sed -e 's/[^-]*//'`
+fi
+
echo $OUT
--- a/common/autoconf/generated-configure.sh Wed Jun 24 17:45:44 2015 +0200
+++ b/common/autoconf/generated-configure.sh Thu Jun 25 07:13:27 2015 +0000
@@ -855,6 +855,7 @@
OS_VERSION_MAJOR
PKG_CONFIG
BASH_ARGS
+SETFILE
CODESIGN
XATTR
DSYMUTIL
@@ -946,7 +947,6 @@
build_cpu
build
CPIO
-SETFILE
DF
READLINK
CYGPATH
@@ -1167,7 +1167,6 @@
CYGPATH
READLINK
DF
-SETFILE
CPIO
UNZIP
ZIP
@@ -1180,6 +1179,7 @@
DSYMUTIL
XATTR
CODESIGN
+SETFILE
PKG_CONFIG
JAVA
JAVAC
@@ -2049,7 +2049,6 @@
CYGPATH Override default value for CYGPATH
READLINK Override default value for READLINK
DF Override default value for DF
- SETFILE Override default value for SETFILE
CPIO Override default value for CPIO
UNZIP Override default value for UNZIP
ZIP Override default value for ZIP
@@ -2062,6 +2061,7 @@
DSYMUTIL Override default value for DSYMUTIL
XATTR Override default value for XATTR
CODESIGN Override default value for CODESIGN
+ SETFILE Override default value for SETFILE
PKG_CONFIG path to pkg-config utility
JAVA Override default value for JAVA
JAVAC Override default value for JAVAC
@@ -4364,7 +4364,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1433337614
+DATE_WHEN_GENERATED=1434614912
###############################################################################
#
@@ -13058,192 +13058,6 @@
# Publish this variable in the help.
- if test "x$SETFILE" = x; then
- # The variable is not set by user, try to locate tool using the code snippet
- for ac_prog in SetFile
-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_SETFILE+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $SETFILE in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
-SETFILE=$ac_cv_path_SETFILE
-if test -n "$SETFILE"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
-$as_echo "$SETFILE" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$SETFILE" && break
-done
-
- else
- # The variable is set, but is it from the command line or the environment?
-
- # Try to remove the string !SETFILE! from our list.
- try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!SETFILE!/}
- 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 "xSETFILE" != xBASH; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&5
-$as_echo "$as_me: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&2;}
- fi
- # Try to locate tool using the code snippet
- for ac_prog in SetFile
-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_SETFILE+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $SETFILE in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
-SETFILE=$ac_cv_path_SETFILE
-if test -n "$SETFILE"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
-$as_echo "$SETFILE" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- test -n "$SETFILE" && 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 the provided tool contains a complete path.
- tool_specified="$SETFILE"
- 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 SETFILE=$tool_basename" >&5
-$as_echo "$as_me: Will search for user supplied tool SETFILE=$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_SETFILE+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- case $SETFILE in
- [\\/]* | ?:[\\/]*)
- ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
-SETFILE=$ac_cv_path_SETFILE
-if test -n "$SETFILE"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
-$as_echo "$SETFILE" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-
- if test "x$SETFILE" = 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 SETFILE=$tool_specified" >&5
-$as_echo "$as_me: Will use user supplied tool SETFILE=$tool_specified" >&6;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SETFILE" >&5
-$as_echo_n "checking for SETFILE... " >&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 SETFILE=$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
-
-
-
-
- # Publish this variable in the help.
-
-
if test "x$CPIO" = x; then
# The variable is not set by user, try to locate tool using the code snippet
for ac_prog in cpio bsdcpio
@@ -15140,10 +14954,11 @@
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
- # detect if Xcode is installed by running xcodebuild -version
+ # If a devkit has been supplied, find xcodebuild in the toolchain_path.
+ # If not, detect if Xcode is installed by running xcodebuild -version
# if no Xcode installed, xcodebuild exits with 1
# if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
- if /usr/bin/xcodebuild -version >/dev/null 2>&1; then
+ if test "x$DEVKIT_ROOT" != x || /usr/bin/xcodebuild -version >/dev/null 2>&1; then
# We need to use xcodebuild in the toolchain dir provided by the user, this will
# fall back on the stub binary in /usr/bin/xcodebuild
# Extract the first word of "xcodebuild", so it can be a program name with args.
@@ -19653,6 +19468,199 @@
$as_echo "yes" >&6; }
fi
fi
+
+
+
+ # Publish this variable in the help.
+
+
+ if test "x$SETFILE" = x; then
+ # The variable is not set by user, try to locate tool using the code snippet
+ for ac_prog in SetFile
+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_SETFILE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $SETFILE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
+SETFILE=$ac_cv_path_SETFILE
+if test -n "$SETFILE"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
+$as_echo "$SETFILE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$SETFILE" && break
+done
+
+ else
+ # The variable is set, but is it from the command line or the environment?
+
+ # Try to remove the string !SETFILE! from our list.
+ try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!SETFILE!/}
+ 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 "xSETFILE" != xBASH; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&5
+$as_echo "$as_me: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&2;}
+ fi
+ # Try to locate tool using the code snippet
+ for ac_prog in SetFile
+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_SETFILE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $SETFILE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
+SETFILE=$ac_cv_path_SETFILE
+if test -n "$SETFILE"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
+$as_echo "$SETFILE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ test -n "$SETFILE" && 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 the provided tool contains a complete path.
+ tool_specified="$SETFILE"
+ 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 SETFILE=$tool_basename" >&5
+$as_echo "$as_me: Will search for user supplied tool SETFILE=$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_SETFILE+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ case $SETFILE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
+SETFILE=$ac_cv_path_SETFILE
+if test -n "$SETFILE"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
+$as_echo "$SETFILE" >&6; }
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+ if test "x$SETFILE" = 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 SETFILE=$tool_specified" >&5
+$as_echo "$as_me: Will use user supplied tool SETFILE=$tool_specified" >&6;}
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SETFILE" >&5
+$as_echo_n "checking for SETFILE... " >&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 SETFILE=$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
+
+
+
+ if test "x$SETFILE" = x; then
+ as_fn_error $? "Could not find required tool for SETFILE" "$LINENO" 5
+ fi
+
+
fi
--- a/corba/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/corba/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -310,3 +310,5 @@
afc1e295c4bf83f9a5dd539c29914edd4a754a3f jdk9-b65
44ee68f7dbacab24a45115fd6a8ccdc7eb6e8f0b jdk9-b66
4418697e56f1f43597f55c7cb6573549c6117868 jdk9-b67
+8efad64f40eb8cd4df376c0a5275892eeb396bbd jdk9-b68
+de8acedcb5b5870f1dc54cba575aaa5d33897ea2 jdk9-b69
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/BoundsHelper.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.omg.CORBA;
+
+
+/**
+ * This Helper class is used to facilitate the marshalling of <tt>Bounds</tt>.
+ * For more information on Helper files, see
+ * <a href="doc-files/generatedfiles.html#helper">
+ * "Generated Files: Helper Files"</a>.<P>
+ */
+
+abstract public class BoundsHelper
+{
+ private static String _id = "IDL:omg.org/CORBA/Bounds:1.0";
+
+ public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.Bounds that)
+ {
+ org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
+ a.type (type ());
+ write (out, that);
+ a.read_value (out.create_input_stream (), type ());
+ }
+
+ public static org.omg.CORBA.Bounds extract (org.omg.CORBA.Any a)
+ {
+ return read (a.create_input_stream ());
+ }
+
+ private static org.omg.CORBA.TypeCode __typeCode = null;
+ private static boolean __active = false;
+ synchronized public static org.omg.CORBA.TypeCode type ()
+ {
+ if (__typeCode == null)
+ {
+ synchronized (org.omg.CORBA.TypeCode.class)
+ {
+ if (__typeCode == null)
+ {
+ if (__active)
+ {
+ return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
+ }
+ __active = true;
+ org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
+ org.omg.CORBA.TypeCode _tcOf_members0 = null;
+ __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.BoundsHelper.id (), "Bounds", _members0);
+ __active = false;
+ }
+ }
+ }
+ return __typeCode;
+ }
+
+ public static String id ()
+ {
+ return _id;
+ }
+
+ public static org.omg.CORBA.Bounds read (org.omg.CORBA.portable.InputStream istream)
+ {
+ org.omg.CORBA.Bounds value = new org.omg.CORBA.Bounds ();
+ // read and discard the repository ID
+ istream.read_string ();
+ return value;
+ }
+
+ public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.Bounds value)
+ {
+ // write the repository ID
+ ostream.write_string (id ());
+ }
+
+}
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/DynAny.java Wed Jun 24 17:45:44 2015 +0200
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/DynAny.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -52,8 +52,8 @@
*
* @param dyn_any the <code>DynAny</code> object whose contents
* are assigned to this <code>DynAny</code>.
- * @throws Invalid if the source <code>DynAny</code> is
- * invalid
+ * @throws org.omg.CORBA.DynAnyPackage.Invalid if the source
+ * <code>DynAny</code> is invalid
*/
public void assign(org.omg.CORBA.DynAny dyn_any)
throws org.omg.CORBA.DynAnyPackage.Invalid;
@@ -63,8 +63,8 @@
* object.
*
* @param value the <code>Any</code> object.
- * @throws Invalid if the source <code>Any</code> object is
- * empty or bad
+ * @throws org.omg.CORBA.DynAnyPackage.Invalid if the source
+ * <code>Any</code> object is empty or bad
*/
public void from_any(org.omg.CORBA.Any value)
throws org.omg.CORBA.DynAnyPackage.Invalid;
@@ -74,8 +74,8 @@
* object.
*
* @return the <code>Any</code> object.
- * @throws Invalid if this <code>DynAny</code> is empty or
- * bad.
+ * @throws org.omg.CORBA.DynAnyPackage.Invalid if this
+ * <code>DynAny</code> is empty or bad.
* created or does not contain a meaningful value
*/
public org.omg.CORBA.Any to_any()
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/DynArray.java Wed Jun 24 17:45:44 2015 +0200
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/DynArray.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -48,7 +48,8 @@
* <code>DynArray</code> object to the given array.
*
* @param value the array of <code>Any</code> objects
- * @exception InvalidSeq if the sequence is bad
+ * @exception org.omg.CORBA.DynAnyPackage.InvalidSeq if the
+ * sequence is bad
* @see #get_elements
*/
public void set_elements(org.omg.CORBA.Any[] value)
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/DynSequence.java Wed Jun 24 17:45:44 2015 +0200
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/DynSequence.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -65,7 +65,8 @@
* array.
*
* @param value the array of <code>Any</code> objects to be set
- * @exception InvalidSeq if the array of values is bad
+ * @exception org.omg.CORBA.DynAnyPackage.InvalidSeq if the array
+ * of values is bad
* @see #get_elements
*/
public void set_elements(org.omg.CORBA.Any[] value)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/ORBPackage/InvalidNameHelper.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.omg.CORBA.ORBPackage;
+
+
+/**
+ * This Helper class is used to facilitate the marshalling of
+ * <tt>ORBPackage/InvalidName</tt>.
+ * For more information on Helper files, see
+ * <a href="doc-files/generatedfiles.html#helper">
+ * "Generated Files: Helper Files"</a>.<P>
+ */
+
+abstract public class InvalidNameHelper
+{
+ private static String _id = "IDL:omg.org.CORBA/ORB/InvalidName:1.0";
+
+ public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.ORBPackage.InvalidName that)
+ {
+ org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
+ a.type (type ());
+ write (out, that);
+ a.read_value (out.create_input_stream (), type ());
+ }
+
+ public static org.omg.CORBA.ORBPackage.InvalidName extract (org.omg.CORBA.Any a)
+ {
+ return read (a.create_input_stream ());
+ }
+
+ private static org.omg.CORBA.TypeCode __typeCode = null;
+ private static boolean __active = false;
+ synchronized public static org.omg.CORBA.TypeCode type ()
+ {
+ if (__typeCode == null)
+ {
+ synchronized (org.omg.CORBA.TypeCode.class)
+ {
+ if (__typeCode == null)
+ {
+ if (__active)
+ {
+ return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
+ }
+ __active = true;
+ org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
+ org.omg.CORBA.TypeCode _tcOf_members0 = null;
+ __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.ORBPackage.InvalidNameHelper.id (), "InvalidName", _members0);
+ __active = false;
+ }
+ }
+ }
+ return __typeCode;
+ }
+
+ public static String id ()
+ {
+ return _id;
+ }
+
+ public static org.omg.CORBA.ORBPackage.InvalidName read (org.omg.CORBA.portable.InputStream istream)
+ {
+ org.omg.CORBA.ORBPackage.InvalidName value = new org.omg.CORBA.ORBPackage.InvalidName ();
+ // read and discard the repository ID
+ istream.read_string ();
+ return value;
+ }
+
+ public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.ORBPackage.InvalidName value)
+ {
+ // write the repository ID
+ ostream.write_string (id ());
+ }
+
+}
--- a/corba/src/java.corba/share/classes/org/omg/CORBA/ServerRequest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/ServerRequest.java Thu Jun 25 07:13:27 2015 +0000
@@ -248,7 +248,7 @@
* contain an exception will result in a BAD_PARAM system exception. Passing
* in an unlisted user exception will result in either the DIR receiving a
* BAD_PARAM system exception or in the client receiving an
- * UNKNOWN_EXCEPTION system exception.
+ * UNKNOWN system exception.
*
* @param any the <code>Any</code> object containing the exception
* @deprecated use set_exception()
@@ -272,13 +272,13 @@
* will cause a BAD_PARAM system exception to be thrown. Passing
* in an unlisted user exception will result in either the DIR receiving a
* BAD_PARAM system exception or in the client receiving an
- * UNKNOWN_EXCEPTION system exception.
+ * UNKNOWN system exception.
*
* @param any the <code>Any</code> object containing the exception
* @exception BAD_PARAM if the given <code>Any</code> object does not
* contain an exception or the exception is an
* unlisted user exception
- * @exception UNKNOWN_EXCEPTION if the given exception is an unlisted
+ * @exception UNKNOWN if the given exception is an unlisted
* user exception and the DIR did not
* receive a BAD_PARAM exception
* @see <a href="package-summary.html#unimpl"><code>CORBA</code>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BadKindHelper.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.omg.CORBA.TypeCodePackage;
+
+
+/**
+ * This Helper class is used to facilitate the marshalling of
+ * <tt>TypeCodePackage/BadKind</tt>.
+ * For more information on Helper files, see
+ * <a href="doc-files/generatedfiles.html#helper">
+ * "Generated Files: Helper Files"</a>.<P>
+ */
+
+abstract public class BadKindHelper
+{
+ private static String _id = "IDL:omg.org.CORBA/TypeCode/BadKind:1.0";
+
+ public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.TypeCodePackage.BadKind that)
+ {
+ org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
+ a.type (type ());
+ write (out, that);
+ a.read_value (out.create_input_stream (), type ());
+ }
+
+ public static org.omg.CORBA.TypeCodePackage.BadKind extract (org.omg.CORBA.Any a)
+ {
+ return read (a.create_input_stream ());
+ }
+
+ private static org.omg.CORBA.TypeCode __typeCode = null;
+ private static boolean __active = false;
+ synchronized public static org.omg.CORBA.TypeCode type ()
+ {
+ if (__typeCode == null)
+ {
+ synchronized (org.omg.CORBA.TypeCode.class)
+ {
+ if (__typeCode == null)
+ {
+ if (__active)
+ {
+ return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
+ }
+ __active = true;
+ org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
+ org.omg.CORBA.TypeCode _tcOf_members0 = null;
+ __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.TypeCodePackage.BadKindHelper.id (), "BadKind", _members0);
+ __active = false;
+ }
+ }
+ }
+ return __typeCode;
+ }
+
+ public static String id ()
+ {
+ return _id;
+ }
+
+ public static org.omg.CORBA.TypeCodePackage.BadKind read (org.omg.CORBA.portable.InputStream istream)
+ {
+ org.omg.CORBA.TypeCodePackage.BadKind value = new org.omg.CORBA.TypeCodePackage.BadKind ();
+ // read and discard the repository ID
+ istream.read_string ();
+ return value;
+ }
+
+ public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.TypeCodePackage.BadKind value)
+ {
+ // write the repository ID
+ ostream.write_string (id ());
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BoundsHelper.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package org.omg.CORBA.TypeCodePackage;
+
+
+/**
+ * This Helper class is used to facilitate the marshalling of
+ * <tt>TypeCodePackage/Bounds</tt>.
+ * For more information on Helper files, see
+ * <a href="doc-files/generatedfiles.html#helper">
+ * "Generated Files: Helper Files"</a>.<P>
+ */
+
+abstract public class BoundsHelper
+{
+ private static String _id = "IDL:omg.org.CORBA/TypeCode/Bounds:1.0";
+
+ public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.TypeCodePackage.Bounds that)
+ {
+ org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
+ a.type (type ());
+ write (out, that);
+ a.read_value (out.create_input_stream (), type ());
+ }
+
+ public static org.omg.CORBA.TypeCodePackage.Bounds extract (org.omg.CORBA.Any a)
+ {
+ return read (a.create_input_stream ());
+ }
+
+ private static org.omg.CORBA.TypeCode __typeCode = null;
+ private static boolean __active = false;
+ synchronized public static org.omg.CORBA.TypeCode type ()
+ {
+ if (__typeCode == null)
+ {
+ synchronized (org.omg.CORBA.TypeCode.class)
+ {
+ if (__typeCode == null)
+ {
+ if (__active)
+ {
+ return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
+ }
+ __active = true;
+ org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
+ org.omg.CORBA.TypeCode _tcOf_members0 = null;
+ __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.TypeCodePackage.BoundsHelper.id (), "Bounds", _members0);
+ __active = false;
+ }
+ }
+ }
+ return __typeCode;
+ }
+
+ public static String id ()
+ {
+ return _id;
+ }
+
+ public static org.omg.CORBA.TypeCodePackage.Bounds read (org.omg.CORBA.portable.InputStream istream)
+ {
+ org.omg.CORBA.TypeCodePackage.Bounds value = new org.omg.CORBA.TypeCodePackage.Bounds ();
+ // read and discard the repository ID
+ istream.read_string ();
+ return value;
+ }
+
+ public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.TypeCodePackage.Bounds value)
+ {
+ // write the repository ID
+ ostream.write_string (id ());
+ }
+
+}
--- a/hotspot/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -470,3 +470,5 @@
e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66
d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
+11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68
+ff0929a59ced0e144201aa05819ae2e47d6f2c61 jdk9-b69
--- a/hotspot/make/linux/makefiles/dtrace.make Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/make/linux/makefiles/dtrace.make Thu Jun 25 07:13:27 2015 +0000
@@ -31,8 +31,8 @@
REASON = "This JDK does not support SDT probes"
else
-# We need a recent GCC for the default
-ifeq "$(shell expr \( $(CC_VER_MAJOR) \>= 4 \) \& \( $(CC_VER_MINOR) \>= 4 \) )" "0"
+# We need a recent GCC for the default (4.4 or later)
+ifeq "$(shell expr \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 4 \) \) \| \( $(CC_VER_MAJOR) \>= 5 \) )" "0"
REASON = "gcc version is too old"
else
--- a/hotspot/make/test/JtregNative.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/make/test/JtregNative.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -44,6 +44,7 @@
$(HOTSPOT_TOPDIR)/test/native_sanity \
$(HOTSPOT_TOPDIR)/test/runtime/jni/8025979 \
$(HOTSPOT_TOPDIR)/test/runtime/jni/8033445 \
+ $(HOTSPOT_TOPDIR)/test/runtime/jni/ToStringInInterfaceTest \
#
BUILD_HOTSPOT_JTREG_OUTPUT_DIR := $(BUILD_OUTPUT)/support/test/hotspot/jtreg/native
--- a/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Thu Jun 25 07:13:27 2015 +0000
@@ -3372,6 +3372,25 @@
interface(CONST_INTER);
%}
+// Integer Immediate: 0-bit
+operand immI0() %{
+ predicate(n->get_int() == 0);
+ match(ConI);
+ op_cost(0);
+
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
+// Integer Immediate: 5-bit
+operand immI5() %{
+ predicate(Assembler::is_simm5(n->get_int()));
+ match(ConI);
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
// Integer Immediate: 8-bit
operand immI8() %{
predicate(Assembler::is_simm8(n->get_int()));
@@ -3381,6 +3400,25 @@
interface(CONST_INTER);
%}
+// Integer Immediate: the value 10
+operand immI10() %{
+ predicate(n->get_int() == 10);
+ match(ConI);
+ op_cost(0);
+
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
+// Integer Immediate: 11-bit
+operand immI11() %{
+ predicate(Assembler::is_simm11(n->get_int()));
+ match(ConI);
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
// Integer Immediate: 13-bit
operand immI13() %{
predicate(Assembler::is_simm13(n->get_int()));
@@ -3410,84 +3448,6 @@
interface(CONST_INTER);
%}
-// Unsigned Integer Immediate: 12-bit (non-negative that fits in simm13)
-operand immU12() %{
- predicate((0 <= n->get_int()) && Assembler::is_simm13(n->get_int()));
- match(ConI);
- op_cost(0);
-
- format %{ %}
- interface(CONST_INTER);
-%}
-
-// Integer Immediate: 6-bit
-operand immU6() %{
- predicate(n->get_int() >= 0 && n->get_int() <= 63);
- match(ConI);
- op_cost(0);
- format %{ %}
- interface(CONST_INTER);
-%}
-
-// Integer Immediate: 11-bit
-operand immI11() %{
- predicate(Assembler::is_simm11(n->get_int()));
- match(ConI);
- op_cost(0);
- format %{ %}
- interface(CONST_INTER);
-%}
-
-// Integer Immediate: 5-bit
-operand immI5() %{
- predicate(Assembler::is_simm5(n->get_int()));
- match(ConI);
- op_cost(0);
- format %{ %}
- interface(CONST_INTER);
-%}
-
-// Int Immediate non-negative
-operand immU31()
-%{
- predicate(n->get_int() >= 0);
- match(ConI);
-
- op_cost(0);
- format %{ %}
- interface(CONST_INTER);
-%}
-
-// Integer Immediate: 0-bit
-operand immI0() %{
- predicate(n->get_int() == 0);
- match(ConI);
- op_cost(0);
-
- format %{ %}
- interface(CONST_INTER);
-%}
-
-// Integer Immediate: the value 10
-operand immI10() %{
- predicate(n->get_int() == 10);
- match(ConI);
- op_cost(0);
-
- format %{ %}
- interface(CONST_INTER);
-%}
-
-// Integer Immediate: the values 0-31
-operand immU5() %{
- predicate(n->get_int() >= 0 && n->get_int() <= 31);
- match(ConI);
- op_cost(0);
-
- format %{ %}
- interface(CONST_INTER);
-%}
-
// Integer Immediate: the values 1-31
operand immI_1_31() %{
predicate(n->get_int() >= 1 && n->get_int() <= 31);
@@ -3529,7 +3489,6 @@
format %{ %}
interface(CONST_INTER);
%}
-
// Integer Immediate: the value 255
operand immI_255() %{
predicate( n->get_int() == 255 );
@@ -3550,6 +3509,46 @@
interface(CONST_INTER);
%}
+// Integer Immediate: the values 0-31
+operand immU5() %{
+ predicate(n->get_int() >= 0 && n->get_int() <= 31);
+ match(ConI);
+ op_cost(0);
+
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
+// Integer Immediate: 6-bit
+operand immU6() %{
+ predicate(n->get_int() >= 0 && n->get_int() <= 63);
+ match(ConI);
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
+// Unsigned Integer Immediate: 12-bit (non-negative that fits in simm13)
+operand immU12() %{
+ predicate((0 <= n->get_int()) && Assembler::is_simm13(n->get_int()));
+ match(ConI);
+ op_cost(0);
+
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
+// Integer Immediate non-negative
+operand immU31()
+%{
+ predicate(n->get_int() >= 0);
+ match(ConI);
+
+ op_cost(0);
+ format %{ %}
+ interface(CONST_INTER);
+%}
+
// Long Immediate: the value FF
operand immL_FF() %{
predicate( n->get_long() == 0xFFL );
@@ -5653,17 +5652,17 @@
ins_pipe(iload_mem);
%}
-// Load Unsigned Byte (8 bit UNsigned) with 8-bit mask into Long Register
-instruct loadUB2L_immI8(iRegL dst, memory mem, immI8 mask) %{
+// Load Unsigned Byte (8 bit UNsigned) with 32-bit mask into Long Register
+instruct loadUB2L_immI(iRegL dst, memory mem, immI mask) %{
match(Set dst (ConvI2L (AndI (LoadUB mem) mask)));
ins_cost(MEMORY_REF_COST + DEFAULT_COST);
size(2*4);
- format %{ "LDUB $mem,$dst\t# ubyte & 8-bit mask -> long\n\t"
- "AND $dst,$mask,$dst" %}
+ format %{ "LDUB $mem,$dst\t# ubyte & 32-bit mask -> long\n\t"
+ "AND $dst,right_n_bits($mask, 8),$dst" %}
ins_encode %{
__ ldub($mem$$Address, $dst$$Register);
- __ and3($dst$$Register, $mask$$constant, $dst$$Register);
+ __ and3($dst$$Register, $mask$$constant & right_n_bits(8), $dst$$Register);
%}
ins_pipe(iload_mem);
%}
@@ -5776,20 +5775,20 @@
ins_pipe(iload_mem);
%}
-// Load Unsigned Short/Char (16bit UNsigned) with a 16-bit mask into a Long Register
-instruct loadUS2L_immI16(iRegL dst, memory mem, immI16 mask, iRegL tmp) %{
+// Load Unsigned Short/Char (16bit UNsigned) with a 32-bit mask into a Long Register
+instruct loadUS2L_immI(iRegL dst, memory mem, immI mask, iRegL tmp) %{
match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
effect(TEMP dst, TEMP tmp);
ins_cost(MEMORY_REF_COST + 2*DEFAULT_COST);
- format %{ "LDUH $mem,$dst\t! ushort/char & 16-bit mask -> long\n\t"
- "SET $mask,$tmp\n\t"
+ format %{ "LDUH $mem,$dst\t! ushort/char & 32-bit mask -> long\n\t"
+ "SET right_n_bits($mask, 16),$tmp\n\t"
"AND $dst,$tmp,$dst" %}
ins_encode %{
Register Rdst = $dst$$Register;
Register Rtmp = $tmp$$Register;
__ lduh($mem$$Address, Rdst);
- __ set($mask$$constant, Rtmp);
+ __ set($mask$$constant & right_n_bits(16), Rtmp);
__ and3(Rdst, Rtmp, Rdst);
%}
ins_pipe(iload_mem);
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -2813,6 +2813,13 @@
emit_arith(0x0B, 0xC0, dst, src);
}
+void Assembler::orl(Address dst, Register src) {
+ InstructionMark im(this);
+ prefix(dst, src);
+ emit_int8(0x09);
+ emit_operand(src, dst);
+}
+
void Assembler::packuswb(XMMRegister dst, Address src) {
NOT_LP64(assert(VM_Version::supports_sse2(), ""));
assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes");
@@ -6907,6 +6914,19 @@
}
}
+void Assembler::rcrq(Register dst, int imm8) {
+ assert(isShiftCount(imm8 >> 1), "illegal shift count");
+ int encode = prefixq_and_encode(dst->encoding());
+ if (imm8 == 1) {
+ emit_int8((unsigned char)0xD1);
+ emit_int8((unsigned char)(0xD8 | encode));
+ } else {
+ emit_int8((unsigned char)0xC1);
+ emit_int8((unsigned char)(0xD8 | encode));
+ emit_int8(imm8);
+ }
+}
+
void Assembler::rorq(Register dst, int imm8) {
assert(isShiftCount(imm8 >> 1), "illegal shift count");
int encode = prefixq_and_encode(dst->encoding());
--- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -1594,6 +1594,7 @@
void orl(Register dst, int32_t imm32);
void orl(Register dst, Address src);
void orl(Register dst, Register src);
+ void orl(Address dst, Register src);
void orq(Address dst, int32_t imm32);
void orq(Register dst, int32_t imm32);
@@ -1694,6 +1695,8 @@
void rclq(Register dst, int imm8);
+ void rcrq(Register dst, int imm8);
+
void rdtsc();
void ret(int imm16);
--- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -7750,6 +7750,503 @@
pop(tmp2);
pop(tmp1);
}
+
+//Helper functions for square_to_len()
+
+/**
+ * Store the squares of x[], right shifted one bit (divided by 2) into z[]
+ * Preserves x and z and modifies rest of the registers.
+ */
+
+void MacroAssembler::square_rshift(Register x, Register xlen, Register z, Register tmp1, Register tmp3, Register tmp4, Register tmp5, Register rdxReg, Register raxReg) {
+ // Perform square and right shift by 1
+ // Handle odd xlen case first, then for even xlen do the following
+ // jlong carry = 0;
+ // for (int j=0, i=0; j < xlen; j+=2, i+=4) {
+ // huge_128 product = x[j:j+1] * x[j:j+1];
+ // z[i:i+1] = (carry << 63) | (jlong)(product >>> 65);
+ // z[i+2:i+3] = (jlong)(product >>> 1);
+ // carry = (jlong)product;
+ // }
+
+ xorq(tmp5, tmp5); // carry
+ xorq(rdxReg, rdxReg);
+ xorl(tmp1, tmp1); // index for x
+ xorl(tmp4, tmp4); // index for z
+
+ Label L_first_loop, L_first_loop_exit;
+
+ testl(xlen, 1);
+ jccb(Assembler::zero, L_first_loop); //jump if xlen is even
+
+ // Square and right shift by 1 the odd element using 32 bit multiply
+ movl(raxReg, Address(x, tmp1, Address::times_4, 0));
+ imulq(raxReg, raxReg);
+ shrq(raxReg, 1);
+ adcq(tmp5, 0);
+ movq(Address(z, tmp4, Address::times_4, 0), raxReg);
+ incrementl(tmp1);
+ addl(tmp4, 2);
+
+ // Square and right shift by 1 the rest using 64 bit multiply
+ bind(L_first_loop);
+ cmpptr(tmp1, xlen);
+ jccb(Assembler::equal, L_first_loop_exit);
+
+ // Square
+ movq(raxReg, Address(x, tmp1, Address::times_4, 0));
+ rorq(raxReg, 32); // convert big-endian to little-endian
+ mulq(raxReg); // 64-bit multiply rax * rax -> rdx:rax
+
+ // Right shift by 1 and save carry
+ shrq(tmp5, 1); // rdx:rax:tmp5 = (tmp5:rdx:rax) >>> 1
+ rcrq(rdxReg, 1);
+ rcrq(raxReg, 1);
+ adcq(tmp5, 0);
+
+ // Store result in z
+ movq(Address(z, tmp4, Address::times_4, 0), rdxReg);
+ movq(Address(z, tmp4, Address::times_4, 8), raxReg);
+
+ // Update indices for x and z
+ addl(tmp1, 2);
+ addl(tmp4, 4);
+ jmp(L_first_loop);
+
+ bind(L_first_loop_exit);
+}
+
+
+/**
+ * Perform the following multiply add operation using BMI2 instructions
+ * carry:sum = sum + op1*op2 + carry
+ * op2 should be in rdx
+ * op2 is preserved, all other registers are modified
+ */
+void MacroAssembler::multiply_add_64_bmi2(Register sum, Register op1, Register op2, Register carry, Register tmp2) {
+ // assert op2 is rdx
+ mulxq(tmp2, op1, op1); // op1 * op2 -> tmp2:op1
+ addq(sum, carry);
+ adcq(tmp2, 0);
+ addq(sum, op1);
+ adcq(tmp2, 0);
+ movq(carry, tmp2);
+}
+
+/**
+ * Perform the following multiply add operation:
+ * carry:sum = sum + op1*op2 + carry
+ * Preserves op1, op2 and modifies rest of registers
+ */
+void MacroAssembler::multiply_add_64(Register sum, Register op1, Register op2, Register carry, Register rdxReg, Register raxReg) {
+ // rdx:rax = op1 * op2
+ movq(raxReg, op2);
+ mulq(op1);
+
+ // rdx:rax = sum + carry + rdx:rax
+ addq(sum, carry);
+ adcq(rdxReg, 0);
+ addq(sum, raxReg);
+ adcq(rdxReg, 0);
+
+ // carry:sum = rdx:sum
+ movq(carry, rdxReg);
+}
+
+/**
+ * Add 64 bit long carry into z[] with carry propogation.
+ * Preserves z and carry register values and modifies rest of registers.
+ *
+ */
+void MacroAssembler::add_one_64(Register z, Register zlen, Register carry, Register tmp1) {
+ Label L_fourth_loop, L_fourth_loop_exit;
+
+ movl(tmp1, 1);
+ subl(zlen, 2);
+ addq(Address(z, zlen, Address::times_4, 0), carry);
+
+ bind(L_fourth_loop);
+ jccb(Assembler::carryClear, L_fourth_loop_exit);
+ subl(zlen, 2);
+ jccb(Assembler::negative, L_fourth_loop_exit);
+ addq(Address(z, zlen, Address::times_4, 0), tmp1);
+ jmp(L_fourth_loop);
+ bind(L_fourth_loop_exit);
+}
+
+/**
+ * Shift z[] left by 1 bit.
+ * Preserves x, len, z and zlen registers and modifies rest of the registers.
+ *
+ */
+void MacroAssembler::lshift_by_1(Register x, Register len, Register z, Register zlen, Register tmp1, Register tmp2, Register tmp3, Register tmp4) {
+
+ Label L_fifth_loop, L_fifth_loop_exit;
+
+ // Fifth loop
+ // Perform primitiveLeftShift(z, zlen, 1)
+
+ const Register prev_carry = tmp1;
+ const Register new_carry = tmp4;
+ const Register value = tmp2;
+ const Register zidx = tmp3;
+
+ // int zidx, carry;
+ // long value;
+ // carry = 0;
+ // for (zidx = zlen-2; zidx >=0; zidx -= 2) {
+ // (carry:value) = (z[i] << 1) | carry ;
+ // z[i] = value;
+ // }
+
+ movl(zidx, zlen);
+ xorl(prev_carry, prev_carry); // clear carry flag and prev_carry register
+
+ bind(L_fifth_loop);
+ decl(zidx); // Use decl to preserve carry flag
+ decl(zidx);
+ jccb(Assembler::negative, L_fifth_loop_exit);
+
+ if (UseBMI2Instructions) {
+ movq(value, Address(z, zidx, Address::times_4, 0));
+ rclq(value, 1);
+ rorxq(value, value, 32);
+ movq(Address(z, zidx, Address::times_4, 0), value); // Store back in big endian form
+ }
+ else {
+ // clear new_carry
+ xorl(new_carry, new_carry);
+
+ // Shift z[i] by 1, or in previous carry and save new carry
+ movq(value, Address(z, zidx, Address::times_4, 0));
+ shlq(value, 1);
+ adcl(new_carry, 0);
+
+ orq(value, prev_carry);
+ rorq(value, 0x20);
+ movq(Address(z, zidx, Address::times_4, 0), value); // Store back in big endian form
+
+ // Set previous carry = new carry
+ movl(prev_carry, new_carry);
+ }
+ jmp(L_fifth_loop);
+
+ bind(L_fifth_loop_exit);
+}
+
+
+/**
+ * Code for BigInteger::squareToLen() intrinsic
+ *
+ * rdi: x
+ * rsi: len
+ * r8: z
+ * rcx: zlen
+ * r12: tmp1
+ * r13: tmp2
+ * r14: tmp3
+ * r15: tmp4
+ * rbx: tmp5
+ *
+ */
+void MacroAssembler::square_to_len(Register x, Register len, Register z, Register zlen, Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register rdxReg, Register raxReg) {
+
+ Label L_second_loop, L_second_loop_exit, L_third_loop, L_third_loop_exit, fifth_loop, fifth_loop_exit, L_last_x, L_multiply;
+ push(tmp1);
+ push(tmp2);
+ push(tmp3);
+ push(tmp4);
+ push(tmp5);
+
+ // First loop
+ // Store the squares, right shifted one bit (i.e., divided by 2).
+ square_rshift(x, len, z, tmp1, tmp3, tmp4, tmp5, rdxReg, raxReg);
+
+ // Add in off-diagonal sums.
+ //
+ // Second, third (nested) and fourth loops.
+ // zlen +=2;
+ // for (int xidx=len-2,zidx=zlen-4; xidx > 0; xidx-=2,zidx-=4) {
+ // carry = 0;
+ // long op2 = x[xidx:xidx+1];
+ // for (int j=xidx-2,k=zidx; j >= 0; j-=2) {
+ // k -= 2;
+ // long op1 = x[j:j+1];
+ // long sum = z[k:k+1];
+ // carry:sum = multiply_add_64(sum, op1, op2, carry, tmp_regs);
+ // z[k:k+1] = sum;
+ // }
+ // add_one_64(z, k, carry, tmp_regs);
+ // }
+
+ const Register carry = tmp5;
+ const Register sum = tmp3;
+ const Register op1 = tmp4;
+ Register op2 = tmp2;
+
+ push(zlen);
+ push(len);
+ addl(zlen,2);
+ bind(L_second_loop);
+ xorq(carry, carry);
+ subl(zlen, 4);
+ subl(len, 2);
+ push(zlen);
+ push(len);
+ cmpl(len, 0);
+ jccb(Assembler::lessEqual, L_second_loop_exit);
+
+ // Multiply an array by one 64 bit long.
+ if (UseBMI2Instructions) {
+ op2 = rdxReg;
+ movq(op2, Address(x, len, Address::times_4, 0));
+ rorxq(op2, op2, 32);
+ }
+ else {
+ movq(op2, Address(x, len, Address::times_4, 0));
+ rorq(op2, 32);
+ }
+
+ bind(L_third_loop);
+ decrementl(len);
+ jccb(Assembler::negative, L_third_loop_exit);
+ decrementl(len);
+ jccb(Assembler::negative, L_last_x);
+
+ movq(op1, Address(x, len, Address::times_4, 0));
+ rorq(op1, 32);
+
+ bind(L_multiply);
+ subl(zlen, 2);
+ movq(sum, Address(z, zlen, Address::times_4, 0));
+
+ // Multiply 64 bit by 64 bit and add 64 bits lower half and upper 64 bits as carry.
+ if (UseBMI2Instructions) {
+ multiply_add_64_bmi2(sum, op1, op2, carry, tmp2);
+ }
+ else {
+ multiply_add_64(sum, op1, op2, carry, rdxReg, raxReg);
+ }
+
+ movq(Address(z, zlen, Address::times_4, 0), sum);
+
+ jmp(L_third_loop);
+ bind(L_third_loop_exit);
+
+ // Fourth loop
+ // Add 64 bit long carry into z with carry propogation.
+ // Uses offsetted zlen.
+ add_one_64(z, zlen, carry, tmp1);
+
+ pop(len);
+ pop(zlen);
+ jmp(L_second_loop);
+
+ // Next infrequent code is moved outside loops.
+ bind(L_last_x);
+ movl(op1, Address(x, 0));
+ jmp(L_multiply);
+
+ bind(L_second_loop_exit);
+ pop(len);
+ pop(zlen);
+ pop(len);
+ pop(zlen);
+
+ // Fifth loop
+ // Shift z left 1 bit.
+ lshift_by_1(x, len, z, zlen, tmp1, tmp2, tmp3, tmp4);
+
+ // z[zlen-1] |= x[len-1] & 1;
+ movl(tmp3, Address(x, len, Address::times_4, -4));
+ andl(tmp3, 1);
+ orl(Address(z, zlen, Address::times_4, -4), tmp3);
+
+ pop(tmp5);
+ pop(tmp4);
+ pop(tmp3);
+ pop(tmp2);
+ pop(tmp1);
+}
+
+/**
+ * Helper function for mul_add()
+ * Multiply the in[] by int k and add to out[] starting at offset offs using
+ * 128 bit by 32 bit multiply and return the carry in tmp5.
+ * Only quad int aligned length of in[] is operated on in this function.
+ * k is in rdxReg for BMI2Instructions, for others it is in tmp2.
+ * This function preserves out, in and k registers.
+ * len and offset point to the appropriate index in "in" & "out" correspondingly
+ * tmp5 has the carry.
+ * other registers are temporary and are modified.
+ *
+ */
+void MacroAssembler::mul_add_128_x_32_loop(Register out, Register in,
+ Register offset, Register len, Register tmp1, Register tmp2, Register tmp3,
+ Register tmp4, Register tmp5, Register rdxReg, Register raxReg) {
+
+ Label L_first_loop, L_first_loop_exit;
+
+ movl(tmp1, len);
+ shrl(tmp1, 2);
+
+ bind(L_first_loop);
+ subl(tmp1, 1);
+ jccb(Assembler::negative, L_first_loop_exit);
+
+ subl(len, 4);
+ subl(offset, 4);
+
+ Register op2 = tmp2;
+ const Register sum = tmp3;
+ const Register op1 = tmp4;
+ const Register carry = tmp5;
+
+ if (UseBMI2Instructions) {
+ op2 = rdxReg;
+ }
+
+ movq(op1, Address(in, len, Address::times_4, 8));
+ rorq(op1, 32);
+ movq(sum, Address(out, offset, Address::times_4, 8));
+ rorq(sum, 32);
+ if (UseBMI2Instructions) {
+ multiply_add_64_bmi2(sum, op1, op2, carry, raxReg);
+ }
+ else {
+ multiply_add_64(sum, op1, op2, carry, rdxReg, raxReg);
+ }
+ // Store back in big endian from little endian
+ rorq(sum, 0x20);
+ movq(Address(out, offset, Address::times_4, 8), sum);
+
+ movq(op1, Address(in, len, Address::times_4, 0));
+ rorq(op1, 32);
+ movq(sum, Address(out, offset, Address::times_4, 0));
+ rorq(sum, 32);
+ if (UseBMI2Instructions) {
+ multiply_add_64_bmi2(sum, op1, op2, carry, raxReg);
+ }
+ else {
+ multiply_add_64(sum, op1, op2, carry, rdxReg, raxReg);
+ }
+ // Store back in big endian from little endian
+ rorq(sum, 0x20);
+ movq(Address(out, offset, Address::times_4, 0), sum);
+
+ jmp(L_first_loop);
+ bind(L_first_loop_exit);
+}
+
+/**
+ * Code for BigInteger::mulAdd() intrinsic
+ *
+ * rdi: out
+ * rsi: in
+ * r11: offs (out.length - offset)
+ * rcx: len
+ * r8: k
+ * r12: tmp1
+ * r13: tmp2
+ * r14: tmp3
+ * r15: tmp4
+ * rbx: tmp5
+ * Multiply the in[] by word k and add to out[], return the carry in rax
+ */
+void MacroAssembler::mul_add(Register out, Register in, Register offs,
+ Register len, Register k, Register tmp1, Register tmp2, Register tmp3,
+ Register tmp4, Register tmp5, Register rdxReg, Register raxReg) {
+
+ Label L_carry, L_last_in, L_done;
+
+// carry = 0;
+// for (int j=len-1; j >= 0; j--) {
+// long product = (in[j] & LONG_MASK) * kLong +
+// (out[offs] & LONG_MASK) + carry;
+// out[offs--] = (int)product;
+// carry = product >>> 32;
+// }
+//
+ push(tmp1);
+ push(tmp2);
+ push(tmp3);
+ push(tmp4);
+ push(tmp5);
+
+ Register op2 = tmp2;
+ const Register sum = tmp3;
+ const Register op1 = tmp4;
+ const Register carry = tmp5;
+
+ if (UseBMI2Instructions) {
+ op2 = rdxReg;
+ movl(op2, k);
+ }
+ else {
+ movl(op2, k);
+ }
+
+ xorq(carry, carry);
+
+ //First loop
+
+ //Multiply in[] by k in a 4 way unrolled loop using 128 bit by 32 bit multiply
+ //The carry is in tmp5
+ mul_add_128_x_32_loop(out, in, offs, len, tmp1, tmp2, tmp3, tmp4, tmp5, rdxReg, raxReg);
+
+ //Multiply the trailing in[] entry using 64 bit by 32 bit, if any
+ decrementl(len);
+ jccb(Assembler::negative, L_carry);
+ decrementl(len);
+ jccb(Assembler::negative, L_last_in);
+
+ movq(op1, Address(in, len, Address::times_4, 0));
+ rorq(op1, 32);
+
+ subl(offs, 2);
+ movq(sum, Address(out, offs, Address::times_4, 0));
+ rorq(sum, 32);
+
+ if (UseBMI2Instructions) {
+ multiply_add_64_bmi2(sum, op1, op2, carry, raxReg);
+ }
+ else {
+ multiply_add_64(sum, op1, op2, carry, rdxReg, raxReg);
+ }
+
+ // Store back in big endian from little endian
+ rorq(sum, 0x20);
+ movq(Address(out, offs, Address::times_4, 0), sum);
+
+ testl(len, len);
+ jccb(Assembler::zero, L_carry);
+
+ //Multiply the last in[] entry, if any
+ bind(L_last_in);
+ movl(op1, Address(in, 0));
+ movl(sum, Address(out, offs, Address::times_4, -4));
+
+ movl(raxReg, k);
+ mull(op1); //tmp4 * eax -> edx:eax
+ addl(sum, carry);
+ adcl(rdxReg, 0);
+ addl(sum, raxReg);
+ adcl(rdxReg, 0);
+ movl(carry, rdxReg);
+
+ movl(Address(out, offs, Address::times_4, -4), sum);
+
+ bind(L_carry);
+ //return tmp5/carry as carry in rax
+ movl(rax, carry);
+
+ bind(L_done);
+ pop(tmp5);
+ pop(tmp4);
+ pop(tmp3);
+ pop(tmp2);
+ pop(tmp1);
+}
#endif
/**
--- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -1241,6 +1241,25 @@
Register carry2);
void multiply_to_len(Register x, Register xlen, Register y, Register ylen, Register z, Register zlen,
Register tmp1, Register tmp2, Register tmp3, Register tmp4, Register tmp5);
+
+ void square_rshift(Register x, Register len, Register z, Register tmp1, Register tmp3,
+ Register tmp4, Register tmp5, Register rdxReg, Register raxReg);
+ void multiply_add_64_bmi2(Register sum, Register op1, Register op2, Register carry,
+ Register tmp2);
+ void multiply_add_64(Register sum, Register op1, Register op2, Register carry,
+ Register rdxReg, Register raxReg);
+ void add_one_64(Register z, Register zlen, Register carry, Register tmp1);
+ void lshift_by_1(Register x, Register len, Register z, Register zlen, Register tmp1, Register tmp2,
+ Register tmp3, Register tmp4);
+ void square_to_len(Register x, Register len, Register z, Register zlen, Register tmp1, Register tmp2,
+ Register tmp3, Register tmp4, Register tmp5, Register rdxReg, Register raxReg);
+
+ void mul_add_128_x_32_loop(Register out, Register in, Register offset, Register len, Register tmp1,
+ Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register rdxReg,
+ Register raxReg);
+ void mul_add(Register out, Register in, Register offset, Register len, Register k, Register tmp1,
+ Register tmp2, Register tmp3, Register tmp4, Register tmp5, Register rdxReg,
+ Register raxReg);
#endif
// CRC32 code for java.util.zip.CRC32::updateBytes() instrinsic.
--- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -3785,6 +3785,107 @@
return start;
}
+/**
+ * Arguments:
+ *
+ // Input:
+ // c_rarg0 - x address
+ // c_rarg1 - x length
+ // c_rarg2 - z address
+ // c_rarg3 - z lenth
+ *
+ */
+ address generate_squareToLen() {
+
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", "squareToLen");
+
+ address start = __ pc();
+ // Win64: rcx, rdx, r8, r9 (c_rarg0, c_rarg1, ...)
+ // Unix: rdi, rsi, rdx, rcx (c_rarg0, c_rarg1, ...)
+ const Register x = rdi;
+ const Register len = rsi;
+ const Register z = r8;
+ const Register zlen = rcx;
+
+ const Register tmp1 = r12;
+ const Register tmp2 = r13;
+ const Register tmp3 = r14;
+ const Register tmp4 = r15;
+ const Register tmp5 = rbx;
+
+ BLOCK_COMMENT("Entry:");
+ __ enter(); // required for proper stackwalking of RuntimeStub frame
+
+ setup_arg_regs(4); // x => rdi, len => rsi, z => rdx
+ // zlen => rcx
+ // r9 and r10 may be used to save non-volatile registers
+ __ movptr(r8, rdx);
+ __ square_to_len(x, len, z, zlen, tmp1, tmp2, tmp3, tmp4, tmp5, rdx, rax);
+
+ restore_arg_regs();
+
+ __ leave(); // required for proper stackwalking of RuntimeStub frame
+ __ ret(0);
+
+ return start;
+ }
+
+ /**
+ * Arguments:
+ *
+ * Input:
+ * c_rarg0 - out address
+ * c_rarg1 - in address
+ * c_rarg2 - offset
+ * c_rarg3 - len
+ * not Win64
+ * c_rarg4 - k
+ * Win64
+ * rsp+40 - k
+ */
+ address generate_mulAdd() {
+ __ align(CodeEntryAlignment);
+ StubCodeMark mark(this, "StubRoutines", "mulAdd");
+
+ address start = __ pc();
+ // Win64: rcx, rdx, r8, r9 (c_rarg0, c_rarg1, ...)
+ // Unix: rdi, rsi, rdx, rcx, r8, r9 (c_rarg0, c_rarg1, ...)
+ const Register out = rdi;
+ const Register in = rsi;
+ const Register offset = r11;
+ const Register len = rcx;
+ const Register k = r8;
+
+ // Next registers will be saved on stack in mul_add().
+ const Register tmp1 = r12;
+ const Register tmp2 = r13;
+ const Register tmp3 = r14;
+ const Register tmp4 = r15;
+ const Register tmp5 = rbx;
+
+ BLOCK_COMMENT("Entry:");
+ __ enter(); // required for proper stackwalking of RuntimeStub frame
+
+ setup_arg_regs(4); // out => rdi, in => rsi, offset => rdx
+ // len => rcx, k => r8
+ // r9 and r10 may be used to save non-volatile registers
+#ifdef _WIN64
+ // last argument is on stack on Win64
+ __ movl(k, Address(rsp, 6 * wordSize));
+#endif
+ __ movptr(r11, rdx); // move offset in rdx to offset(r11)
+ __ mul_add(out, in, offset, len, k, tmp1, tmp2, tmp3, tmp4, tmp5, rdx, rax);
+
+ restore_arg_regs();
+
+ __ leave(); // required for proper stackwalking of RuntimeStub frame
+ __ ret(0);
+
+ return start;
+ }
+
+
#undef __
#define __ masm->
@@ -4030,6 +4131,12 @@
if (UseMultiplyToLenIntrinsic) {
StubRoutines::_multiplyToLen = generate_multiplyToLen();
}
+ if (UseSquareToLenIntrinsic) {
+ StubRoutines::_squareToLen = generate_squareToLen();
+ }
+ if (UseMulAddIntrinsic) {
+ StubRoutines::_mulAdd = generate_mulAdd();
+ }
#endif
}
--- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -33,7 +33,7 @@
enum platform_dependent_constants {
code_size1 = 19000, // simply increase if too small (assembler will crash if too small)
- code_size2 = 22000 // simply increase if too small (assembler will crash if too small)
+ code_size2 = 23000 // simply increase if too small (assembler will crash if too small)
};
class x86 {
--- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -790,6 +790,12 @@
if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
UseMultiplyToLenIntrinsic = true;
}
+ if (FLAG_IS_DEFAULT(UseSquareToLenIntrinsic)) {
+ UseSquareToLenIntrinsic = true;
+ }
+ if (FLAG_IS_DEFAULT(UseMulAddIntrinsic)) {
+ UseMulAddIntrinsic = true;
+ }
#else
if (UseMultiplyToLenIntrinsic) {
if (!FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
@@ -797,6 +803,18 @@
}
FLAG_SET_DEFAULT(UseMultiplyToLenIntrinsic, false);
}
+ if (UseSquareToLenIntrinsic) {
+ if (!FLAG_IS_DEFAULT(UseSquareToLenIntrinsic)) {
+ warning("squareToLen intrinsic is not available in 32-bit VM");
+ }
+ FLAG_SET_DEFAULT(UseSquareToLenIntrinsic, false);
+ }
+ if (UseMulAddIntrinsic) {
+ if (!FLAG_IS_DEFAULT(UseMulAddIntrinsic)) {
+ warning("mulAdd intrinsic is not available in 32-bit VM");
+ }
+ FLAG_SET_DEFAULT(UseMulAddIntrinsic, false);
+ }
#endif
#endif // COMPILER2
--- a/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Thu Jun 25 07:13:27 2015 +0000
@@ -5431,18 +5431,18 @@
%}
// Load Unsigned Byte (8 bit UNsigned) with mask into Long Register
-instruct loadUB2L_immI8(eRegL dst, memory mem, immI8 mask, eFlagsReg cr) %{
+instruct loadUB2L_immI(eRegL dst, memory mem, immI mask, eFlagsReg cr) %{
match(Set dst (ConvI2L (AndI (LoadUB mem) mask)));
effect(KILL cr);
- format %{ "MOVZX8 $dst.lo,$mem\t# ubyte & 8-bit mask -> long\n\t"
+ format %{ "MOVZX8 $dst.lo,$mem\t# ubyte & 32-bit mask -> long\n\t"
"XOR $dst.hi,$dst.hi\n\t"
- "AND $dst.lo,$mask" %}
+ "AND $dst.lo,right_n_bits($mask, 8)" %}
ins_encode %{
Register Rdst = $dst$$Register;
__ movzbl(Rdst, $mem$$Address);
__ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
- __ andl(Rdst, $mask$$constant);
+ __ andl(Rdst, $mask$$constant & right_n_bits(8));
%}
ins_pipe(ialu_reg_mem);
%}
@@ -5550,19 +5550,19 @@
ins_pipe(ialu_reg_mem);
%}
-// Load Unsigned Short/Char (16 bit UNsigned) with a 16-bit mask into Long Register
-instruct loadUS2L_immI16(eRegL dst, memory mem, immI16 mask, eFlagsReg cr) %{
+// Load Unsigned Short/Char (16 bit UNsigned) with a 32-bit mask into Long Register
+instruct loadUS2L_immI(eRegL dst, memory mem, immI mask, eFlagsReg cr) %{
match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
effect(KILL cr);
- format %{ "MOVZX $dst.lo, $mem\t# ushort/char & 16-bit mask -> long\n\t"
+ format %{ "MOVZX $dst.lo, $mem\t# ushort/char & 32-bit mask -> long\n\t"
"XOR $dst.hi,$dst.hi\n\t"
- "AND $dst.lo,$mask" %}
+ "AND $dst.lo,right_n_bits($mask, 16)" %}
ins_encode %{
Register Rdst = $dst$$Register;
__ movzwl(Rdst, $mem$$Address);
__ xorl(HIGH_FROM_LOW(Rdst), HIGH_FROM_LOW(Rdst));
- __ andl(Rdst, $mask$$constant);
+ __ andl(Rdst, $mask$$constant & right_n_bits(16));
%}
ins_pipe(ialu_reg_mem);
%}
--- a/hotspot/src/cpu/x86/vm/x86_64.ad Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Thu Jun 25 07:13:27 2015 +0000
@@ -4753,17 +4753,17 @@
ins_pipe(ialu_reg_mem);
%}
-// Load Unsigned Byte (8 bit UNsigned) with a 8-bit mask into Long Register
-instruct loadUB2L_immI8(rRegL dst, memory mem, immI8 mask, rFlagsReg cr) %{
+// Load Unsigned Byte (8 bit UNsigned) with 32-bit mask into Long Register
+instruct loadUB2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{
match(Set dst (ConvI2L (AndI (LoadUB mem) mask)));
effect(KILL cr);
- format %{ "movzbq $dst, $mem\t# ubyte & 8-bit mask -> long\n\t"
- "andl $dst, $mask" %}
+ format %{ "movzbq $dst, $mem\t# ubyte & 32-bit mask -> long\n\t"
+ "andl $dst, right_n_bits($mask, 8)" %}
ins_encode %{
Register Rdst = $dst$$Register;
__ movzbq(Rdst, $mem$$Address);
- __ andl(Rdst, $mask$$constant);
+ __ andl(Rdst, $mask$$constant & right_n_bits(8));
%}
ins_pipe(ialu_reg_mem);
%}
@@ -4863,17 +4863,17 @@
ins_pipe(ialu_reg_mem);
%}
-// Load Unsigned Short/Char (16 bit UNsigned) with mask into Long Register
-instruct loadUS2L_immI16(rRegL dst, memory mem, immI16 mask, rFlagsReg cr) %{
+// Load Unsigned Short/Char (16 bit UNsigned) with 32-bit mask into Long Register
+instruct loadUS2L_immI(rRegL dst, memory mem, immI mask, rFlagsReg cr) %{
match(Set dst (ConvI2L (AndI (LoadUS mem) mask)));
effect(KILL cr);
- format %{ "movzwq $dst, $mem\t# ushort/char & 16-bit mask -> long\n\t"
- "andl $dst, $mask" %}
+ format %{ "movzwq $dst, $mem\t# ushort/char & 32-bit mask -> long\n\t"
+ "andl $dst, right_n_bits($mask, 16)" %}
ins_encode %{
Register Rdst = $dst$$Register;
__ movzwq(Rdst, $mem$$Address);
- __ andl(Rdst, $mask$$constant);
+ __ andl(Rdst, $mask$$constant & right_n_bits(16));
%}
ins_pipe(ialu_reg_mem);
%}
--- a/hotspot/src/os/aix/vm/os_aix.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1267,10 +1267,6 @@
// Note: os::abort() might be called very early during initialization, or
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
- abort(dump_core, NULL, NULL);
-}
-
void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1131,10 +1131,6 @@
// Note: os::abort() might be called very early during initialization, or
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
- abort(dump_core, NULL, NULL);
-}
-
void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
--- a/hotspot/src/os/linux/vm/os_linux.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1478,10 +1478,6 @@
// Note: os::abort() might be called very early during initialization, or
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
- abort(dump_core, NULL, NULL);
-}
-
void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
--- a/hotspot/src/os/solaris/vm/os_solaris.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1520,10 +1520,6 @@
// Note: os::abort() might be called very early during initialization, or
// called from signal handler. Before adding something to os::abort(), make
// sure it is async-safe and can handle partially initialized VM.
-void os::abort(bool dump_core) {
- abort(dump_core, NULL, NULL);
-}
-
void os::abort(bool dump_core, void* siginfo, void* context) {
os::shutdown();
if (dump_core) {
--- a/hotspot/src/os/windows/vm/os_windows.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -997,7 +997,16 @@
if (!FLAG_IS_DEFAULT(CreateCoredumpOnCrash) && !CreateCoredumpOnCrash) {
jio_snprintf(buffer, buffsz, "CreateCoredumpOnCrash is disabled from command line");
status = false;
- } else {
+ }
+
+#ifndef ASSERT
+ if (!os::win32::is_windows_server() && FLAG_IS_DEFAULT(CreateCoredumpOnCrash)) {
+ jio_snprintf(buffer, buffsz, "Minidumps are not enabled by default on client versions of Windows");
+ status = false;
+ }
+#endif
+
+ if (status) {
const char* cwd = get_current_directory(NULL, 0);
int pid = current_process_id();
if (cwd != NULL) {
@@ -1086,10 +1095,6 @@
win32::exit_process_or_thread(win32::EPT_PROCESS, 1);
}
-void os::abort(bool dump_core) {
- abort(dump_core, NULL, NULL);
-}
-
// Die immediately, no exit hook, no abort hook, no cleanup.
void os::die() {
win32::exit_process_or_thread(win32::EPT_PROCESS_DIE, -1);
--- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -59,8 +59,8 @@
extern sigjmp_buf* get_jmp_buf_for_continuation();
address os::current_stack_pointer() {
- address dummy = (address) &dummy;
- return dummy;
+ // return the address of the current function
+ return (address)__builtin_frame_address(0);
}
frame os::get_sender_for_C_frame(frame* fr) {
--- a/hotspot/src/share/vm/ci/ciCallSite.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/ci/ciCallSite.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -50,25 +50,6 @@
}
// ------------------------------------------------------------------
-// ciCallSite::get_context
-//
-// Return the target MethodHandle of this CallSite.
-ciKlass* ciCallSite::get_context() {
- assert(!is_constant_call_site(), "");
-
- VM_ENTRY_MARK;
- oop call_site_oop = get_oop();
- InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site_oop);
- if (ctxk == NULL) {
- // The call site doesn't have a context associated. Set it to the default context.
- oop def_context_oop = java_lang_invoke_CallSite::default_context();
- java_lang_invoke_CallSite::set_context_cas(call_site_oop, def_context_oop, /*expected=*/NULL);
- ctxk = MethodHandles::get_call_site_context(call_site_oop);
- }
- return (CURRENT_ENV->get_metadata(ctxk))->as_klass();
-}
-
-// ------------------------------------------------------------------
// ciCallSite::print
//
// Print debugging information about the CallSite.
--- a/hotspot/src/share/vm/ci/ciCallSite.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/ci/ciCallSite.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -43,7 +43,6 @@
// Return the target MethodHandle of this CallSite.
ciMethodHandle* get_target() const;
- ciKlass* get_context();
void print();
};
--- a/hotspot/src/share/vm/ci/ciEnv.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -709,24 +709,23 @@
KlassHandle h_holder(THREAD, holder);
LinkResolver::check_klass_accessability(h_accessor, h_holder, KILL_COMPILE_ON_FATAL_(NULL));
methodHandle dest_method;
+ LinkInfo link_info(h_holder, name, sig, h_accessor, /*check_access*/true);
switch (bc) {
case Bytecodes::_invokestatic:
dest_method =
- LinkResolver::resolve_static_call_or_null(h_holder, name, sig, h_accessor);
+ LinkResolver::resolve_static_call_or_null(link_info);
break;
case Bytecodes::_invokespecial:
dest_method =
- LinkResolver::resolve_special_call_or_null(h_holder, name, sig, h_accessor);
+ LinkResolver::resolve_special_call_or_null(link_info);
break;
case Bytecodes::_invokeinterface:
dest_method =
- LinkResolver::linktime_resolve_interface_method_or_null(h_holder, name, sig,
- h_accessor, true);
+ LinkResolver::linktime_resolve_interface_method_or_null(link_info);
break;
case Bytecodes::_invokevirtual:
dest_method =
- LinkResolver::linktime_resolve_virtual_method_or_null(h_holder, name, sig,
- h_accessor, true);
+ LinkResolver::linktime_resolve_virtual_method_or_null(link_info);
break;
default: ShouldNotReachHere();
}
--- a/hotspot/src/share/vm/ci/ciField.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/ci/ciField.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -352,11 +352,11 @@
}
}
+ LinkInfo link_info(_holder->get_instanceKlass(),
+ _name->get_symbol(), _signature->get_symbol(),
+ accessing_klass->get_Klass());
fieldDescriptor result;
- LinkResolver::resolve_field(result, _holder->get_instanceKlass(),
- _name->get_symbol(), _signature->get_symbol(),
- accessing_klass->get_Klass(), bc, true, false,
- KILL_COMPILE_ON_FATAL_(false));
+ LinkResolver::resolve_field(result, link_info, bc, false, KILL_COMPILE_ON_FATAL_(false));
// update the hit-cache, unless there is a problem with memory scoping:
if (accessing_klass->is_shared() || !is_shared()) {
--- a/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -453,8 +453,12 @@
if (fields == NULL) {
// This can happen if this class (java.lang.Class) has invisible fields.
- _nonstatic_fields = super_fields;
- return super_fields->length();
+ if (super_fields != NULL) {
+ _nonstatic_fields = super_fields;
+ return super_fields->length();
+ } else {
+ return 0;
+ }
}
int flen = fields->length();
--- a/hotspot/src/share/vm/ci/ciMethod.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 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
@@ -786,6 +786,7 @@
Symbol* h_name = name()->get_symbol();
Symbol* h_signature = signature()->get_symbol();
+ LinkInfo link_info(h_resolved, h_name, h_signature, caller_klass, check_access);
methodHandle m;
// Only do exact lookup if receiver klass has been linked. Otherwise,
// the vtable has not been setup, and the LinkResolver will fail.
@@ -793,9 +794,9 @@
||
InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
if (holder()->is_interface()) {
- m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass, check_access);
+ m = LinkResolver::resolve_interface_call_or_null(h_recv, link_info);
} else {
- m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass, check_access);
+ m = LinkResolver::resolve_virtual_call_or_null(h_recv, link_info);
}
}
@@ -839,7 +840,8 @@
Symbol* h_name = name()->get_symbol();
Symbol* h_signature = signature()->get_symbol();
- vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, h_recv, h_name, h_signature, caller_klass);
+ LinkInfo link_info(h_recv, h_name, h_signature, caller_klass);
+ vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, link_info);
if (vtable_index == Method::nonvirtual_vtable_index) {
// A statically bound method. Return "no such index".
vtable_index = Method::invalid_vtable_index;
@@ -1285,10 +1287,8 @@
EXCEPTION_MARK;
HandleMark hm(THREAD);
constantPoolHandle pool (THREAD, get_Method()->constants());
- methodHandle spec_method;
- KlassHandle spec_klass;
Bytecodes::Code code = (is_static ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual);
- LinkResolver::resolve_method_statically(spec_method, spec_klass, code, pool, refinfo_index, THREAD);
+ methodHandle spec_method = LinkResolver::resolve_method_statically(code, pool, refinfo_index, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return false;
--- a/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -2967,47 +2967,42 @@
int java_lang_invoke_CallSite::_target_offset;
int java_lang_invoke_CallSite::_context_offset;
-int java_lang_invoke_CallSite::_default_context_offset;
void java_lang_invoke_CallSite::compute_offsets() {
Klass* k = SystemDictionary::CallSite_klass();
if (k != NULL) {
compute_offset(_target_offset, k, vmSymbols::target_name(), vmSymbols::java_lang_invoke_MethodHandle_signature());
- compute_offset(_context_offset, k, vmSymbols::context_name(), vmSymbols::sun_misc_Cleaner_signature());
- compute_offset(_default_context_offset, k,
- vmSymbols::DEFAULT_CONTEXT_name(), vmSymbols::sun_misc_Cleaner_signature(),
- /*is_static=*/true, /*allow_super=*/false);
+ compute_offset(_context_offset, k, vmSymbols::context_name(),
+ vmSymbols::java_lang_invoke_MethodHandleNatives_CallSiteContext_signature());
}
}
-oop java_lang_invoke_CallSite::context_volatile(oop call_site) {
- assert(java_lang_invoke_CallSite::is_instance(call_site), "");
-
- oop dep_oop = call_site->obj_field_volatile(_context_offset);
- return dep_oop;
-}
-
-void java_lang_invoke_CallSite::set_context_volatile(oop call_site, oop context) {
+oop java_lang_invoke_CallSite::context(oop call_site) {
assert(java_lang_invoke_CallSite::is_instance(call_site), "");
- call_site->obj_field_put_volatile(_context_offset, context);
-}
-
-bool java_lang_invoke_CallSite::set_context_cas(oop call_site, oop context, oop expected) {
- assert(java_lang_invoke_CallSite::is_instance(call_site), "");
- HeapWord* context_addr = call_site->obj_field_addr<HeapWord>(_context_offset);
- oop res = oopDesc::atomic_compare_exchange_oop(context, context_addr, expected, true);
- bool success = (res == expected);
- if (success) {
- update_barrier_set((void*)context_addr, context);
+
+ oop dep_oop = call_site->obj_field(_context_offset);
+ return dep_oop;
+}
+
+// Support for java_lang_invoke_MethodHandleNatives_CallSiteContext
+
+int java_lang_invoke_MethodHandleNatives_CallSiteContext::_vmdependencies_offset;
+
+void java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets() {
+ Klass* k = SystemDictionary::Context_klass();
+ if (k != NULL) {
+ CALLSITECONTEXT_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
}
- return success;
-}
-
-oop java_lang_invoke_CallSite::default_context() {
- InstanceKlass* ik = InstanceKlass::cast(SystemDictionary::CallSite_klass());
- oop def_context_oop = ik->java_mirror()->obj_field(_default_context_offset);
- assert(!oopDesc::is_null(def_context_oop), "");
- return def_context_oop;
+}
+
+nmethodBucket* java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(oop call_site) {
+ assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
+ return (nmethodBucket*) (address) call_site->long_field(_vmdependencies_offset);
+}
+
+void java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(oop call_site, nmethodBucket* context) {
+ assert(java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(call_site), "");
+ call_site->long_field_put(_vmdependencies_offset, (jlong) (address) context);
}
// Support for java_security_AccessControlContext
@@ -3403,6 +3398,7 @@
java_lang_invoke_LambdaForm::compute_offsets();
java_lang_invoke_MethodType::compute_offsets();
java_lang_invoke_CallSite::compute_offsets();
+ java_lang_invoke_MethodHandleNatives_CallSiteContext::compute_offsets();
java_security_AccessControlContext::compute_offsets();
// Initialize reflection classes. The layouts of these classes
// changed with the new reflection implementation in JDK 1.4, and
--- a/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -1170,8 +1170,6 @@
private:
static int _target_offset;
static int _context_offset;
- static int _default_context_offset;
-
static void compute_offsets();
@@ -1181,11 +1179,7 @@
static void set_target( oop site, oop target);
static void set_target_volatile( oop site, oop target);
- static oop context_volatile(oop site);
- static void set_context_volatile(oop site, oop context);
- static bool set_context_cas (oop site, oop context, oop expected);
-
- static oop default_context();
+ static oop context(oop site);
// Testers
static bool is_subclass(Klass* klass) {
@@ -1197,6 +1191,31 @@
static int target_offset_in_bytes() { return _target_offset; }
};
+// Interface to java.lang.invoke.MethodHandleNatives$CallSiteContext objects
+
+#define CALLSITECONTEXT_INJECTED_FIELDS(macro) \
+ macro(java_lang_invoke_MethodHandleNatives_CallSiteContext, vmdependencies, intptr_signature, false)
+
+class java_lang_invoke_MethodHandleNatives_CallSiteContext : AllStatic {
+ friend class JavaClasses;
+
+private:
+ static int _vmdependencies_offset;
+
+ static void compute_offsets();
+
+public:
+ // Accessors
+ static nmethodBucket* vmdependencies(oop context);
+ static void set_vmdependencies(oop context, nmethodBucket* bucket);
+
+ // Testers
+ static bool is_subclass(Klass* klass) {
+ return klass->is_subclass_of(SystemDictionary::Context_klass());
+ }
+ static bool is_instance(oop obj);
+};
+
// Interface to java.security.AccessControlContext objects
class java_security_AccessControlContext: AllStatic {
@@ -1406,7 +1425,8 @@
#define ALL_INJECTED_FIELDS(macro) \
CLASS_INJECTED_FIELDS(macro) \
CLASSLOADER_INJECTED_FIELDS(macro) \
- MEMBERNAME_INJECTED_FIELDS(macro)
+ MEMBERNAME_INJECTED_FIELDS(macro) \
+ CALLSITECONTEXT_INJECTED_FIELDS(macro)
// Interface to hard-coded offset checking
--- a/hotspot/src/share/vm/classfile/javaClasses.inline.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/classfile/javaClasses.inline.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -49,6 +49,10 @@
return obj != NULL && is_subclass(obj->klass());
}
+inline bool java_lang_invoke_MethodHandleNatives_CallSiteContext::is_instance(oop obj) {
+ return obj != NULL && is_subclass(obj->klass());
+}
+
inline bool java_lang_invoke_MemberName::is_instance(oop obj) {
return obj != NULL && is_subclass(obj->klass());
}
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -159,6 +159,7 @@
do_klass(MethodType_klass, java_lang_invoke_MethodType, Pre ) \
do_klass(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre ) \
do_klass(CallSite_klass, java_lang_invoke_CallSite, Pre ) \
+ do_klass(Context_klass, java_lang_invoke_MethodHandleNatives_CallSiteContext, Pre ) \
do_klass(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre ) \
do_klass(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre ) \
do_klass(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre ) \
--- a/hotspot/src/share/vm/classfile/verifier.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -45,6 +45,8 @@
#include "runtime/javaCalls.hpp"
#include "runtime/orderAccess.inline.hpp"
#include "runtime/os.hpp"
+#include "runtime/thread.hpp"
+#include "services/threadService.hpp"
#include "utilities/bytes.hpp"
#define NOFAILOVER_MAJOR_VERSION 51
@@ -130,6 +132,16 @@
return true;
}
+ // Timer includes any side effects of class verification (resolution,
+ // etc), but not recursive calls to Verifier::verify().
+ JavaThread* jt = (JavaThread*)THREAD;
+ PerfClassTraceTime timer(ClassLoader::perf_class_verify_time(),
+ ClassLoader::perf_class_verify_selftime(),
+ ClassLoader::perf_classes_verified(),
+ jt->get_thread_stat()->perf_recursion_counts_addr(),
+ jt->get_thread_stat()->perf_timers_addr(),
+ PerfClassTraceTime::CLASS_VERIFY);
+
// If the class should be verified, first see if we can use the split
// verifier. If not, or if verification fails and FailOverToOldVerifier
// is set, then call the inference verifier.
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -274,12 +274,14 @@
/* internal classes known only to the JVM: */ \
template(java_lang_invoke_MemberName, "java/lang/invoke/MemberName") \
template(java_lang_invoke_MethodHandleNatives, "java/lang/invoke/MethodHandleNatives") \
+ template(java_lang_invoke_MethodHandleNatives_CallSiteContext, "java/lang/invoke/MethodHandleNatives$CallSiteContext") \
template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \
template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \
template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \
template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \
template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \
+ template(java_lang_invoke_MethodHandleNatives_CallSiteContext_signature, "Ljava/lang/invoke/MethodHandleNatives$CallSiteContext;") \
/* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */ \
template(findMethodHandleType_name, "findMethodHandleType") \
template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \
@@ -401,7 +403,7 @@
template(protection_domain_name, "protection_domain") \
template(signers_name, "signers_name") \
template(loader_data_name, "loader_data") \
- template(dependencies_name, "dependencies") \
+ template(vmdependencies_name, "vmdependencies") \
template(input_stream_void_signature, "(Ljava/io/InputStream;)V") \
template(getFileURL_name, "getFileURL") \
template(getFileURL_signature, "(Ljava/io/File;)Ljava/net/URL;") \
@@ -797,6 +799,14 @@
do_name( multiplyToLen_name, "multiplyToLen") \
do_signature(multiplyToLen_signature, "([II[II[I)[I") \
\
+ do_intrinsic(_squareToLen, java_math_BigInteger, squareToLen_name, squareToLen_signature, F_S) \
+ do_name( squareToLen_name, "implSquareToLen") \
+ do_signature(squareToLen_signature, "([II[II)[I") \
+ \
+ do_intrinsic(_mulAdd, java_math_BigInteger, mulAdd_name, mulAdd_signature, F_S) \
+ do_name( mulAdd_name, "implMulAdd") \
+ do_signature(mulAdd_signature, "([I[IIII)I") \
+ \
/* java/lang/ref/Reference */ \
do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \
\
--- a/hotspot/src/share/vm/code/codeCache.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/code/codeCache.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1047,40 +1047,6 @@
}
}
-// Flushes compiled methods dependent on a particular CallSite
-// instance when its target is different than the given MethodHandle.
-void CodeCache::flush_dependents_on(Handle call_site, Handle method_handle) {
- assert_lock_strong(Compile_lock);
-
- if (number_of_nmethods_with_dependencies() == 0) return;
-
- // CodeCache can only be updated by a thread_in_VM and they will all be
- // stopped during the safepoint so CodeCache will be safe to update without
- // holding the CodeCache_lock.
-
- CallSiteDepChange changes(call_site(), method_handle());
-
- // Compute the dependent nmethods that have a reference to a
- // CallSite object. We use InstanceKlass::mark_dependent_nmethod
- // directly instead of CodeCache::mark_for_deoptimization because we
- // want dependents on the call site class only not all classes in
- // the ContextStream.
- int marked = 0;
- {
- MutexLockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
- InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site());
- if (ctxk == NULL) {
- return; // No dependencies to invalidate yet.
- }
- marked = ctxk->mark_dependent_nmethods(changes);
- }
- if (marked > 0) {
- // At least one nmethod has been marked for deoptimization
- VM_Deoptimize op;
- VMThread::execute(&op);
- }
-}
-
#ifdef HOTSWAP
// Flushes compiled methods dependent on dependee in the evolutionary sense
void CodeCache::flush_evol_dependents_on(instanceKlassHandle ev_k_h) {
--- a/hotspot/src/share/vm/code/codeCache.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/code/codeCache.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -224,7 +224,6 @@
// Flushing and deoptimization
static void flush_dependents_on(instanceKlassHandle dependee);
- static void flush_dependents_on(Handle call_site, Handle method_handle);
#ifdef HOTSWAP
// Flushing and deoptimization in case of evolution
static void flush_evol_dependents_on(instanceKlassHandle dependee);
--- a/hotspot/src/share/vm/code/dependencies.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/code/dependencies.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -117,9 +117,7 @@
}
void Dependencies::assert_call_site_target_value(ciCallSite* call_site, ciMethodHandle* method_handle) {
- ciKlass* ctxk = call_site->get_context();
- check_ctxk(ctxk);
- assert_common_3(call_site_target_value, ctxk, call_site, method_handle);
+ assert_common_2(call_site_target_value, call_site, method_handle);
}
// Helper function. If we are adding a new dep. under ctxk2,
@@ -175,7 +173,6 @@
}
}
} else {
- assert(dep_implicit_context_arg(dept) == 0, "sanity");
if (note_dep_seen(dept, x0) && note_dep_seen(dept, x1)) {
// look in this bucket for redundant assertions
const int stride = 2;
@@ -389,7 +386,7 @@
3, // unique_concrete_subtypes_2 ctxk, k1, k2
3, // unique_concrete_methods_2 ctxk, m1, m2
1, // no_finalizable_subclasses ctxk
- 3 // call_site_target_value ctxk, call_site, method_handle
+ 2 // call_site_target_value call_site, method_handle
};
const char* Dependencies::dep_name(Dependencies::DepType dept) {
@@ -1515,16 +1512,11 @@
return find_finalizable_subclass(search_at);
}
-Klass* Dependencies::check_call_site_target_value(Klass* recorded_ctxk, oop call_site, oop method_handle, CallSiteDepChange* changes) {
+Klass* Dependencies::check_call_site_target_value(oop call_site, oop method_handle, CallSiteDepChange* changes) {
+ assert(!oopDesc::is_null(call_site), "sanity");
+ assert(!oopDesc::is_null(method_handle), "sanity");
assert(call_site->is_a(SystemDictionary::CallSite_klass()), "sanity");
- assert(!oopDesc::is_null(method_handle), "sanity");
- Klass* call_site_ctxk = MethodHandles::get_call_site_context(call_site);
- assert(!Klass::is_null(call_site_ctxk), "call site context should be initialized already");
- if (recorded_ctxk != call_site_ctxk) {
- // Stale context
- return recorded_ctxk;
- }
if (changes == NULL) {
// Validate all CallSites
if (java_lang_invoke_CallSite::target(call_site) != method_handle)
@@ -1599,7 +1591,7 @@
Klass* witness = NULL;
switch (type()) {
case call_site_target_value:
- witness = check_call_site_target_value(context_type(), argument_oop(1), argument_oop(2), changes);
+ witness = check_call_site_target_value(argument_oop(0), argument_oop(1), changes);
break;
default:
witness = NULL;
--- a/hotspot/src/share/vm/code/dependencies.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/code/dependencies.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -173,7 +173,7 @@
non_klass_types = (1 << call_site_target_value),
klass_types = all_types & ~non_klass_types,
- non_ctxk_types = (1 << evol_method),
+ non_ctxk_types = (1 << evol_method) | (1 << call_site_target_value),
implicit_ctxk_types = 0,
explicit_ctxk_types = all_types & ~(non_ctxk_types | implicit_ctxk_types),
@@ -330,7 +330,7 @@
static Klass* check_exclusive_concrete_methods(Klass* ctxk, Method* m1, Method* m2,
KlassDepChange* changes = NULL);
static Klass* check_has_no_finalizable_subclasses(Klass* ctxk, KlassDepChange* changes = NULL);
- static Klass* check_call_site_target_value(Klass* recorded_ctxk, oop call_site, oop method_handle, CallSiteDepChange* changes = NULL);
+ static Klass* check_call_site_target_value(oop call_site, oop method_handle, CallSiteDepChange* changes = NULL);
// A returned Klass* is NULL if the dependency assertion is still
// valid. A non-NULL Klass* is a 'witness' to the assertion
// failure, a point in the class hierarchy where the assertion has
@@ -496,7 +496,7 @@
bool next();
DepType type() { return _type; }
- bool is_oop_argument(int i) { return type() == call_site_target_value && i > 0; }
+ bool is_oop_argument(int i) { return type() == call_site_target_value; }
uintptr_t get_identifier(int i);
int argument_count() { return dep_args(type()); }
--- a/hotspot/src/share/vm/code/nmethod.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/code/nmethod.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -565,13 +565,18 @@
// the number of methods compiled. For applications with a lot
// classes the slow way is too slow.
for (Dependencies::DepStream deps(nm); deps.next(); ) {
- Klass* klass = deps.context_type();
- if (klass == NULL) {
- continue; // ignore things like evol_method
+ if (deps.type() == Dependencies::call_site_target_value) {
+ // CallSite dependencies are managed on per-CallSite instance basis.
+ oop call_site = deps.argument_oop(0);
+ MethodHandles::add_dependent_nmethod(call_site, nm);
+ } else {
+ Klass* klass = deps.context_type();
+ if (klass == NULL) {
+ continue; // ignore things like evol_method
+ }
+ // record this nmethod as dependent on this klass
+ InstanceKlass::cast(klass)->add_dependent_nmethod(nm);
}
-
- // record this nmethod as dependent on this klass
- InstanceKlass::cast(klass)->add_dependent_nmethod(nm);
}
NOT_PRODUCT(nmethod_stats.note_nmethod(nm));
if (PrintAssembly || CompilerOracle::has_option_string(method, "PrintAssembly")) {
@@ -1464,13 +1469,20 @@
if (!has_flushed_dependencies()) {
set_has_flushed_dependencies();
for (Dependencies::DepStream deps(this); deps.next(); ) {
- Klass* klass = deps.context_type();
- if (klass == NULL) continue; // ignore things like evol_method
-
- // During GC the is_alive closure is non-NULL, and is used to
- // determine liveness of dependees that need to be updated.
- if (is_alive == NULL || klass->is_loader_alive(is_alive)) {
- InstanceKlass::cast(klass)->remove_dependent_nmethod(this);
+ if (deps.type() == Dependencies::call_site_target_value) {
+ // CallSite dependencies are managed on per-CallSite instance basis.
+ oop call_site = deps.argument_oop(0);
+ MethodHandles::remove_dependent_nmethod(call_site, this);
+ } else {
+ Klass* klass = deps.context_type();
+ if (klass == NULL) {
+ continue; // ignore things like evol_method
+ }
+ // During GC the is_alive closure is non-NULL, and is used to
+ // determine liveness of dependees that need to be updated.
+ if (is_alive == NULL || klass->is_loader_alive(is_alive)) {
+ InstanceKlass::cast(klass)->remove_dependent_nmethod(this);
+ }
}
}
}
--- a/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -254,9 +254,9 @@
if (_gc_cause != GCCause::_gc_locker &&
gch->total_full_collections_completed() <= _full_gc_count_before) {
// maybe we should change the condition to test _gc_cause ==
- // GCCause::_java_lang_system_gc, instead of
- // _gc_cause != GCCause::_gc_locker
- assert(_gc_cause == GCCause::_java_lang_system_gc,
+ // GCCause::_java_lang_system_gc or GCCause::_dcmd_gc_run,
+ // instead of _gc_cause != GCCause::_gc_locker
+ assert(GCCause::is_user_requested_gc(_gc_cause),
"the only way to get here if this was a System.gc()-induced GC");
assert(ExplicitGCInvokesConcurrent, "Error");
// Now, wait for witnessing concurrent gc cycle to complete,
--- a/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -43,7 +43,7 @@
}
// Run a task; returns when the task is done, or the workers yield,
-// or the task is aborted, or the work gang is terminated via stop().
+// or the task is aborted.
// A task that has been yielded can be continued via this interface
// by using the same task repeatedly as the argument to the call.
// It is expected that the YieldingFlexibleGangTask carries the appropriate
@@ -297,16 +297,9 @@
WorkData data;
int id;
while (true) {
- // Check if there is work to do or if we have been asked
- // to terminate
+ // Check if there is work to do.
gang()->internal_worker_poll(&data);
- if (data.terminate()) {
- // We have been asked to terminate.
- assert(gang()->task() == NULL, "No task binding");
- // set_status(TERMINATED);
- return;
- } else if (data.task() != NULL &&
- data.sequence_number() != previous_sequence_number) {
+ if (data.task() != NULL && data.sequence_number() != previous_sequence_number) {
// There is work to be done.
// First check if we need to become active or if there
// are already the requisite number of workers
--- a/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -176,7 +176,7 @@
GangWorker* allocate_worker(uint which);
// Run a task; returns when the task is done, or the workers yield,
- // or the task is aborted, or the work gang is terminated via stop().
+ // or the task is aborted.
// A task that has been yielded can be continued via this same interface
// by using the same task repeatedly as the argument to the call.
// It is expected that the YieldingFlexibleGangTask carries the appropriate
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1183,7 +1183,7 @@
IsGCActiveMark x;
// Timing
- assert(gc_cause() != GCCause::_java_lang_system_gc || explicit_gc, "invariant");
+ assert(!GCCause::is_user_requested_gc(gc_cause()) || explicit_gc, "invariant");
TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
{
@@ -2199,6 +2199,7 @@
switch (cause) {
case GCCause::_gc_locker: return GCLockerInvokesConcurrent;
case GCCause::_java_lang_system_gc: return ExplicitGCInvokesConcurrent;
+ case GCCause::_dcmd_gc_run: return ExplicitGCInvokesConcurrent;
case GCCause::_g1_humongous_allocation: return true;
case GCCause::_update_allocation_context_stats_inc: return true;
case GCCause::_wb_conc_mark: return true;
--- a/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -324,7 +324,8 @@
// explicitly started if:
// (a) cause == _gc_locker and +GCLockerInvokesConcurrent, or
// (b) cause == _java_lang_system_gc and +ExplicitGCInvokesConcurrent.
- // (c) cause == _g1_humongous_allocation
+ // (c) cause == _dcmd_gc_run and +ExplicitGCInvokesConcurrent.
+ // (d) cause == _g1_humongous_allocation
bool should_do_concurrent_full_gc(GCCause::Cause cause);
// Keeps track of how many "old marking cycles" (i.e., Full GCs or
--- a/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -168,7 +168,7 @@
// +ExplicitGCInvokesConcurrent, we have to wait here for the cycle
// that just started (or maybe one that was already in progress) to
// finish.
- if (_gc_cause == GCCause::_java_lang_system_gc &&
+ if (GCCause::is_user_requested_gc(_gc_cause) &&
_should_initiate_conc_mark) {
assert(ExplicitGCInvokesConcurrent,
"the only way to be here is if ExplicitGCInvokesConcurrent is set");
--- a/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -130,7 +130,7 @@
// Update the pause time.
_major_timer.stop();
- if (gc_cause != GCCause::_java_lang_system_gc ||
+ if (!GCCause::is_user_requested_gc(gc_cause) ||
UseAdaptiveSizePolicyWithSystemGC) {
double major_pause_in_seconds = _major_timer.seconds();
double major_pause_in_ms = major_pause_in_seconds * MILLIUNITS;
--- a/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -272,7 +272,7 @@
// Don't check if the size_policy is ready here. Let
// the size_policy check that internally.
if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
- ((gc_cause != GCCause::_java_lang_system_gc) ||
+ (!GCCause::is_user_requested_gc(gc_cause) ||
UseAdaptiveSizePolicyWithSystemGC)) {
// Swap the survivor spaces if from_space is empty. The
// resize_young_gen() called below is normally used after
--- a/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -2053,7 +2053,7 @@
marking_phase(vmthread_cm, maximum_heap_compaction, &_gc_tracer);
bool max_on_system_gc = UseMaximumCompactionOnSystemGC
- && gc_cause == GCCause::_java_lang_system_gc;
+ && GCCause::is_user_requested_gc(gc_cause);
summary_phase(vmthread_cm, maximum_heap_compaction || max_on_system_gc);
COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity"));
@@ -2089,7 +2089,7 @@
// Don't check if the size_policy is ready here. Let
// the size_policy check that internally.
if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
- ((gc_cause != GCCause::_java_lang_system_gc) ||
+ (!GCCause::is_user_requested_gc(gc_cause) ||
UseAdaptiveSizePolicyWithSystemGC)) {
// Swap the survivor spaces if from_space is empty. The
// resize_young_gen() called below is normally used after
--- a/hotspot/src/share/vm/gc/parallel/psScavenge.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/parallel/psScavenge.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -290,7 +290,7 @@
AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
- if ((gc_cause != GCCause::_java_lang_system_gc) ||
+ if (!GCCause::is_user_requested_gc(gc_cause) ||
UseAdaptiveSizePolicyWithSystemGC) {
// Gather the feedback data for eden occupancy.
young_gen->eden_space()->accumulate_statistics();
--- a/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -960,7 +960,7 @@
GCCause::to_string(gch->gc_cause()));
}
assert(gch->gc_cause() == GCCause::_scavenge_alot ||
- (gch->gc_cause() == GCCause::_java_lang_system_gc && UseConcMarkSweepGC && ExplicitGCInvokesConcurrent) ||
+ (GCCause::is_user_requested_gc(gch->gc_cause()) && UseConcMarkSweepGC && ExplicitGCInvokesConcurrent) ||
!gch->incremental_collection_failed(),
"Twice in a row");
seen_incremental_collection_failed = false;
--- a/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -244,7 +244,7 @@
// Update the pause time.
_minor_timer.stop();
- if (gc_cause != GCCause::_java_lang_system_gc ||
+ if (!GCCause::is_user_requested_gc(gc_cause) ||
UseAdaptiveSizePolicyWithSystemGC) {
double minor_pause_in_seconds = _minor_timer.seconds();
double minor_pause_in_ms = minor_pause_in_seconds * MILLIUNITS;
--- a/hotspot/src/share/vm/gc/shared/gcCause.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/shared/gcCause.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -103,6 +103,9 @@
case _last_ditch_collection:
return "Last ditch collection";
+ case _dcmd_gc_run:
+ return "Diagnostic Command";
+
case _last_gc_cause:
return "ILLEGAL VALUE - last gc cause - ILLEGAL VALUE";
--- a/hotspot/src/share/vm/gc/shared/gcCause.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/shared/gcCause.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -74,12 +74,15 @@
_g1_humongous_allocation,
_last_ditch_collection,
+
+ _dcmd_gc_run,
+
_last_gc_cause
};
inline static bool is_user_requested_gc(GCCause::Cause cause) {
return (cause == GCCause::_java_lang_system_gc ||
- cause == GCCause::_jvmti_force_gc);
+ cause == GCCause::_dcmd_gc_run);
}
inline static bool is_serviceability_requested_gc(GCCause::Cause
--- a/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -304,9 +304,16 @@
}
bool GenCollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
- return UseConcMarkSweepGC &&
- ((cause == GCCause::_gc_locker && GCLockerInvokesConcurrent) ||
- (cause == GCCause::_java_lang_system_gc && ExplicitGCInvokesConcurrent));
+ if (!UseConcMarkSweepGC) {
+ return false;
+ }
+
+ switch (cause) {
+ case GCCause::_gc_locker: return GCLockerInvokesConcurrent;
+ case GCCause::_java_lang_system_gc:
+ case GCCause::_dcmd_gc_run: return ExplicitGCInvokesConcurrent;
+ default: return false;
+ }
}
void GenCollectedHeap::collect_generation(Generation* gen, bool full, size_t size,
--- a/hotspot/src/share/vm/gc/shared/workgroup.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/shared/workgroup.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -47,7 +47,6 @@
/* allow_vm_block */ are_GC_task_threads,
Monitor::_safepoint_check_sometimes);
assert(monitor() != NULL, "Failed to allocate monitor");
- _terminate = false;
_task = NULL;
_sequence_number = 0;
_started_workers = 0;
@@ -106,18 +105,6 @@
return true;
}
-AbstractWorkGang::~AbstractWorkGang() {
- if (TraceWorkGang) {
- tty->print_cr("Destructing work gang %s", name());
- }
- stop(); // stop all the workers
- for (uint worker = 0; worker < total_workers(); worker += 1) {
- delete gang_worker(worker);
- }
- delete gang_workers();
- delete monitor();
-}
-
GangWorker* AbstractWorkGang::gang_worker(uint i) const {
// Array index bounds checking.
GangWorker* result = NULL;
@@ -175,28 +162,9 @@
WorkGang::run_task(task, (uint) active_workers());
}
-void AbstractWorkGang::stop() {
- // Tell all workers to terminate, then wait for them to become inactive.
- MutexLockerEx ml(monitor(), Mutex::_no_safepoint_check_flag);
- if (TraceWorkGang) {
- tty->print_cr("Stopping work gang %s task %s", name(), task()->name());
- }
- _task = NULL;
- _terminate = true;
- monitor()->notify_all();
- while (finished_workers() < active_workers()) {
- if (TraceWorkGang) {
- tty->print_cr("Waiting in work gang %s: %u/%u finished",
- name(), finished_workers(), active_workers());
- }
- monitor()->wait(/* no_safepoint_check */ true);
- }
-}
-
void AbstractWorkGang::internal_worker_poll(WorkData* data) const {
assert(monitor()->owned_by_self(), "worker_poll is an internal method");
assert(data != NULL, "worker data is null");
- data->set_terminate(terminate());
data->set_task(task());
data->set_sequence_number(sequence_number());
}
@@ -259,7 +227,7 @@
void GangWorker::loop() {
int previous_sequence_number = 0;
Monitor* gang_monitor = gang()->monitor();
- for ( ; /* !terminate() */; ) {
+ for ( ; ; ) {
WorkData data;
int part; // Initialized below.
{
@@ -272,8 +240,6 @@
if (TraceWorkGang) {
tty->print("Polled outside for work in gang %s worker %u",
gang()->name(), id());
- tty->print(" terminate: %s",
- data.terminate() ? "true" : "false");
tty->print(" sequence: %d (prev: %d)",
data.sequence_number(), previous_sequence_number);
if (data.task() != NULL) {
@@ -283,13 +249,7 @@
}
tty->cr();
}
- for ( ; /* break or return */; ) {
- // Terminate if requested.
- if (data.terminate()) {
- gang()->internal_note_finish();
- gang_monitor->notify_all();
- return;
- }
+ for ( ; /* break */; ) {
// Check for new work.
if ((data.task() != NULL) &&
(data.sequence_number() != previous_sequence_number)) {
@@ -306,8 +266,6 @@
if (TraceWorkGang) {
tty->print("Polled inside for work in gang %s worker %u",
gang()->name(), id());
- tty->print(" terminate: %s",
- data.terminate() ? "true" : "false");
tty->print(" sequence: %d (prev: %d)",
data.sequence_number(), previous_sequence_number);
if (data.task() != NULL) {
--- a/hotspot/src/share/vm/gc/shared/workgroup.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/gc/shared/workgroup.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -103,16 +103,15 @@
// An abstract class representing a gang of workers.
// You subclass this to supply an implementation of run_task().
class AbstractWorkGang: public CHeapObj<mtInternal> {
- // Here's the public interface to this class.
+protected:
+ // Work gangs are never deleted, so no need to cleanup.
+ ~AbstractWorkGang() { ShouldNotReachHere(); }
public:
- // Constructor and destructor.
+ // Constructor.
AbstractWorkGang(const char* name, bool are_GC_task_threads,
bool are_ConcurrentGC_threads);
- ~AbstractWorkGang();
// Run a task, returns when the task is done (or terminated).
virtual void run_task(AbstractGangTask* task) = 0;
- // Stop and terminate all workers.
- virtual void stop();
// Return true if more workers should be applied to the task.
virtual bool needs_more_workers() const { return true; }
public:
@@ -129,8 +128,6 @@
Monitor* _monitor;
// The count of the number of workers in the gang.
uint _total_workers;
- // Whether the workers should terminate.
- bool _terminate;
// The array of worker threads for this gang.
// This is only needed for cleaning up.
GangWorker** _gang_workers;
@@ -153,9 +150,6 @@
virtual uint active_workers() const {
return _total_workers;
}
- bool terminate() const {
- return _terminate;
- }
GangWorker** gang_workers() const {
return _gang_workers;
}
@@ -205,21 +199,16 @@
class WorkData: public StackObj {
// This would be a struct, but I want accessor methods.
private:
- bool _terminate;
AbstractGangTask* _task;
int _sequence_number;
public:
// Constructor and destructor
WorkData() {
- _terminate = false;
_task = NULL;
_sequence_number = 0;
}
~WorkData() {
}
- // Accessors and modifiers
- bool terminate() const { return _terminate; }
- void set_terminate(bool value) { _terminate = value; }
AbstractGangTask* task() const { return _task; }
void set_task(AbstractGangTask* value) { _task = value; }
int sequence_number() const { return _sequence_number; }
--- a/hotspot/src/share/vm/interpreter/bytecode.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/interpreter/bytecode.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -147,13 +147,10 @@
methodHandle Bytecode_invoke::static_target(TRAPS) {
- methodHandle m;
- KlassHandle resolved_klass;
constantPoolHandle constants(THREAD, this->constants());
Bytecodes::Code bc = invoke_code();
- LinkResolver::resolve_method_statically(m, resolved_klass, bc, constants, index(), CHECK_(methodHandle()));
- return m;
+ return LinkResolver::resolve_method_statically(bc, constants, index(), THREAD);
}
Handle Bytecode_invoke::appendix(TRAPS) {
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -52,13 +52,17 @@
// Implementation of CallInfo
-void CallInfo::set_static(KlassHandle resolved_klass, methodHandle resolved_method, TRAPS) {
+void CallInfo::set_static(KlassHandle resolved_klass, const methodHandle& resolved_method, TRAPS) {
int vtable_index = Method::nonvirtual_vtable_index;
set_common(resolved_klass, resolved_klass, resolved_method, resolved_method, CallInfo::direct_call, vtable_index, CHECK);
}
-void CallInfo::set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index, TRAPS) {
+void CallInfo::set_interface(KlassHandle resolved_klass,
+ KlassHandle selected_klass,
+ const methodHandle& resolved_method,
+ const methodHandle& selected_method,
+ int itable_index, TRAPS) {
// This is only called for interface methods. If the resolved_method
// comes from java/lang/Object, it can be the subject of a virtual call, so
// we should pick the vtable index from the resolved method.
@@ -68,7 +72,11 @@
set_common(resolved_klass, selected_klass, resolved_method, selected_method, CallInfo::itable_call, itable_index, CHECK);
}
-void CallInfo::set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index, TRAPS) {
+void CallInfo::set_virtual(KlassHandle resolved_klass,
+ KlassHandle selected_klass,
+ const methodHandle& resolved_method,
+ const methodHandle& selected_method,
+ int vtable_index, TRAPS) {
assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, "valid index");
assert(vtable_index < 0 || !resolved_method->has_vtable_index() || vtable_index == resolved_method->vtable_index(), "");
CallKind kind = (vtable_index >= 0 && !resolved_method->can_be_statically_bound() ? CallInfo::vtable_call : CallInfo::direct_call);
@@ -76,7 +84,9 @@
assert(!resolved_method->is_compiled_lambda_form(), "these must be handled via an invokehandle call");
}
-void CallInfo::set_handle(methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS) {
+void CallInfo::set_handle(const methodHandle& resolved_method,
+ Handle resolved_appendix,
+ Handle resolved_method_type, TRAPS) {
if (resolved_method.is_null()) {
THROW_MSG(vmSymbols::java_lang_InternalError(), "resolved method is null");
}
@@ -93,8 +103,8 @@
void CallInfo::set_common(KlassHandle resolved_klass,
KlassHandle selected_klass,
- methodHandle resolved_method,
- methodHandle selected_method,
+ const methodHandle& resolved_method,
+ const methodHandle& selected_method,
CallKind kind,
int index,
TRAPS) {
@@ -210,8 +220,52 @@
}
#endif //ASSERT
+#ifndef PRODUCT
+void CallInfo::print() {
+ ResourceMark rm;
+ const char* kindstr = "unknown";
+ switch (_call_kind) {
+ case direct_call: kindstr = "direct"; break;
+ case vtable_call: kindstr = "vtable"; break;
+ case itable_call: kindstr = "itable"; break;
+ }
+ tty->print_cr("Call %s@%d %s", kindstr, _call_index,
+ _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
+}
+#endif
+//------------------------------------------------------------------------------------------------------------------------
+// Implementation of LinkInfo
+LinkInfo::LinkInfo(constantPoolHandle pool, int index, TRAPS) {
+ // resolve klass
+ Klass* result = pool->klass_ref_at(index, CHECK);
+ _resolved_klass = KlassHandle(THREAD, result);
+
+ // Get name, signature, and static klass
+ _name = pool->name_ref_at(index);
+ _signature = pool->signature_ref_at(index);
+ _current_klass = KlassHandle(THREAD, pool->pool_holder());
+
+ // Coming from the constant pool always checks access
+ _check_access = true;
+}
+
+char* LinkInfo::method_string() const {
+ return Method::name_and_sig_as_C_string(_resolved_klass(), _name, _signature);
+}
+
+#ifndef PRODUCT
+void LinkInfo::print() {
+ ResourceMark rm;
+ tty->print_cr("Link resolved_klass=%s name=%s signature=%s current_klass=%s check_access=%s",
+ _resolved_klass->name()->as_C_string(),
+ _name->as_C_string(),
+ _signature->as_C_string(),
+ _current_klass.is_null() ? "(none)" : _current_klass->name()->as_C_string(),
+ _check_access ? "true" : "false");
+}
+#endif // PRODUCT
//------------------------------------------------------------------------------------------------------------------------
// Klass resolution
@@ -231,11 +285,6 @@
}
}
-void LinkResolver::resolve_klass(KlassHandle& result, constantPoolHandle pool, int index, TRAPS) {
- Klass* result_oop = pool->klass_ref_at(index, CHECK);
- result = KlassHandle(THREAD, result_oop);
-}
-
//------------------------------------------------------------------------------------------------------------------------
// Method resolution
//
@@ -243,76 +292,84 @@
// Look up method in klasses, including static methods
// Then look up local default methods
-void LinkResolver::lookup_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS) {
+methodHandle LinkResolver::lookup_method_in_klasses(const LinkInfo& link_info,
+ bool checkpolymorphism,
+ bool in_imethod_resolve, TRAPS) {
+ KlassHandle klass = link_info.resolved_klass();
+ Symbol* name = link_info.name();
+ Symbol* signature = link_info.signature();
+
// Ignore overpasses so statics can be found during resolution
- Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
+ Method* result = klass->uncached_lookup_method(name, signature, Klass::skip_overpass);
if (klass->oop_is_array()) {
// Only consider klass and super klass for arrays
- result = methodHandle(THREAD, result_oop);
- return;
+ return methodHandle(THREAD, result);
}
// JDK 8, JVMS 5.4.3.4: Interface method resolution should
// ignore static and non-public methods of java.lang.Object,
// like clone, finalize, registerNatives.
if (in_imethod_resolve &&
- result_oop != NULL &&
+ result != NULL &&
klass->is_interface() &&
- (result_oop->is_static() || !result_oop->is_public()) &&
- result_oop->method_holder() == SystemDictionary::Object_klass()) {
- result_oop = NULL;
+ (result->is_static() || !result->is_public()) &&
+ result->method_holder() == SystemDictionary::Object_klass()) {
+ result = NULL;
}
// Before considering default methods, check for an overpass in the
// current class if a method has not been found.
- if (result_oop == NULL) {
- result_oop = InstanceKlass::cast(klass())->find_method(name, signature);
+ if (result == NULL) {
+ result = InstanceKlass::cast(klass())->find_method(name, signature);
}
- if (result_oop == NULL) {
+ if (result == NULL) {
Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
if (default_methods != NULL) {
- result_oop = InstanceKlass::find_method(default_methods, name, signature);
+ result = InstanceKlass::find_method(default_methods, name, signature);
}
}
- if (checkpolymorphism && result_oop != NULL) {
- vmIntrinsics::ID iid = result_oop->intrinsic_id();
+ if (checkpolymorphism && result != NULL) {
+ vmIntrinsics::ID iid = result->intrinsic_id();
if (MethodHandles::is_signature_polymorphic(iid)) {
// Do not link directly to these. The VM must produce a synthetic one using lookup_polymorphic_method.
- return;
+ return NULL;
}
}
- result = methodHandle(THREAD, result_oop);
+ return methodHandle(THREAD, result);
}
// returns first instance method
// Looks up method in classes, then looks up local default methods
-void LinkResolver::lookup_instance_method_in_klasses(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
- Method* result_oop = klass->uncached_lookup_method(name, signature, Klass::find_overpass);
- result = methodHandle(THREAD, result_oop);
- while (!result.is_null() && result->is_static() && result->method_holder()->super() != NULL) {
- KlassHandle super_klass = KlassHandle(THREAD, result->method_holder()->super());
- result = methodHandle(THREAD, super_klass->uncached_lookup_method(name, signature, Klass::find_overpass));
+methodHandle LinkResolver::lookup_instance_method_in_klasses(KlassHandle klass,
+ Symbol* name,
+ Symbol* signature, TRAPS) {
+ Method* result = klass->uncached_lookup_method(name, signature, Klass::find_overpass);
+
+ while (result != NULL && result->is_static() && result->method_holder()->super() != NULL) {
+ Klass* super_klass = result->method_holder()->super();
+ result = super_klass->uncached_lookup_method(name, signature, Klass::find_overpass);
}
if (klass->oop_is_array()) {
// Only consider klass and super klass for arrays
- return;
+ return methodHandle(THREAD, result);
}
- if (result.is_null()) {
+ if (result == NULL) {
Array<Method*>* default_methods = InstanceKlass::cast(klass())->default_methods();
if (default_methods != NULL) {
- result = methodHandle(InstanceKlass::find_method(default_methods, name, signature));
- assert(result.is_null() || !result->is_static(), "static defaults not allowed");
+ result = InstanceKlass::find_method(default_methods, name, signature);
+ assert(result == NULL || !result->is_static(), "static defaults not allowed");
}
}
+ return methodHandle(THREAD, result);
}
int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
- methodHandle resolved_method) {
+ const methodHandle& resolved_method) {
int vtable_index = Method::invalid_vtable_index;
Symbol* name = resolved_method->name();
@@ -336,21 +393,26 @@
return vtable_index;
}
-void LinkResolver::lookup_method_in_interfaces(methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
- InstanceKlass *ik = InstanceKlass::cast(klass());
+methodHandle LinkResolver::lookup_method_in_interfaces(const LinkInfo& cp_info, TRAPS) {
+ InstanceKlass *ik = InstanceKlass::cast(cp_info.resolved_klass()());
// Specify 'true' in order to skip default methods when searching the
// interfaces. Function lookup_method_in_klasses() already looked for
// the method in the default methods table.
- result = methodHandle(THREAD, ik->lookup_method_in_all_interfaces(name, signature, Klass::skip_defaults));
+ return methodHandle(THREAD,
+ ik->lookup_method_in_all_interfaces(cp_info.name(), cp_info.signature(),
+ Klass::skip_defaults));
}
-void LinkResolver::lookup_polymorphic_method(methodHandle& result,
- KlassHandle klass, Symbol* name, Symbol* full_signature,
- KlassHandle current_klass,
+methodHandle LinkResolver::lookup_polymorphic_method(
+ const LinkInfo& link_info,
Handle *appendix_result_or_null,
Handle *method_type_result,
TRAPS) {
+ KlassHandle klass = link_info.resolved_klass();
+ Symbol* name = link_info.name();
+ Symbol* full_signature = link_info.signature();
+
vmIntrinsics::ID iid = MethodHandles::signature_polymorphic_name_id(name);
if (TraceMethodHandles) {
ResourceMark rm(THREAD);
@@ -365,7 +427,7 @@
// Do not erase last argument type (MemberName) if it is a static linkTo method.
bool keep_last_arg = MethodHandles::is_signature_polymorphic_static(iid);
TempNewSymbol basic_signature =
- MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK);
+ MethodHandles::lookup_basic_type_signature(full_signature, keep_last_arg, CHECK_NULL);
if (TraceMethodHandles) {
ResourceMark rm(THREAD);
tty->print_cr("lookup_polymorphic_method %s %s => basic %s",
@@ -373,9 +435,9 @@
full_signature->as_C_string(),
basic_signature->as_C_string());
}
- result = SystemDictionary::find_method_handle_intrinsic(iid,
+ methodHandle result = SystemDictionary::find_method_handle_intrinsic(iid,
basic_signature,
- CHECK);
+ CHECK_NULL);
if (result.not_null()) {
assert(result->is_method_handle_intrinsic(), "MH.invokeBasic or MH.linkTo* intrinsic");
assert(result->intrinsic_id() != vmIntrinsics::_invokeGeneric, "wrong place to find this");
@@ -384,8 +446,8 @@
tty->print("lookup_polymorphic_method => intrinsic ");
result->print_on(tty);
}
- return;
}
+ return result;
} else if (iid == vmIntrinsics::_invokeGeneric
&& !THREAD->is_Compiler_thread()
&& appendix_result_or_null != NULL) {
@@ -399,18 +461,19 @@
Handle(),
Handle(),
true,
- CHECK);
+ CHECK_NULL);
}
}
Handle appendix;
Handle method_type;
- result = SystemDictionary::find_method_handle_invoker(name,
+ methodHandle result = SystemDictionary::find_method_handle_invoker(
+ name,
full_signature,
- current_klass,
+ link_info.current_klass(),
&appendix,
&method_type,
- CHECK);
+ CHECK_NULL);
if (TraceMethodHandles) {
tty->print("lookup_polymorphic_method => (via Java) ");
result->print_on(tty);
@@ -423,7 +486,7 @@
ResourceMark rm(THREAD);
TempNewSymbol basic_signature =
- MethodHandles::lookup_basic_type_signature(full_signature, CHECK);
+ MethodHandles::lookup_basic_type_signature(full_signature, CHECK_NULL);
int actual_size_of_params = result->size_of_parameters();
int expected_size_of_params = ArgumentSizeComputer(basic_signature).size();
// +1 for MethodHandle.this, +1 for trailing MethodType
@@ -441,16 +504,17 @@
assert(appendix_result_or_null != NULL, "");
(*appendix_result_or_null) = appendix;
(*method_type_result) = method_type;
- return;
}
+ return result;
}
}
+ return NULL;
}
void LinkResolver::check_method_accessability(KlassHandle ref_klass,
KlassHandle resolved_klass,
KlassHandle sel_klass,
- methodHandle sel_method,
+ const methodHandle& sel_method,
TRAPS) {
AccessFlags flags = sel_method->access_flags();
@@ -493,8 +557,8 @@
}
}
-void LinkResolver::resolve_method_statically(methodHandle& resolved_method, KlassHandle& resolved_klass,
- Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS) {
+methodHandle LinkResolver::resolve_method_statically(Bytecodes::Code code,
+ constantPoolHandle pool, int index, TRAPS) {
// This method is used only
// (1) in C2 from InlineTree::ok_to_inline (via ciMethod::check_call),
// and
@@ -502,49 +566,108 @@
// It appears to fail when applied to an invokeinterface call site.
// FIXME: Remove this method and ciMethod::check_call; refactor to use the other LinkResolver entry points.
// resolve klass
+ KlassHandle resolved_klass;
if (code == Bytecodes::_invokedynamic) {
resolved_klass = SystemDictionary::MethodHandle_klass();
Symbol* method_name = vmSymbols::invoke_name();
Symbol* method_signature = pool->signature_ref_at(index);
KlassHandle current_klass(THREAD, pool->pool_holder());
- resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
- return;
+ LinkInfo link_info(resolved_klass, method_name, method_signature, current_klass);
+ return resolve_method(link_info, /*require_methodref*/false, THREAD);
}
- resolve_klass(resolved_klass, pool, index, CHECK);
-
- Symbol* method_name = pool->name_ref_at(index);
- Symbol* method_signature = pool->signature_ref_at(index);
- KlassHandle current_klass(THREAD, pool->pool_holder());
+ LinkInfo link_info(pool, index, CHECK_NULL);
+ resolved_klass = link_info.resolved_klass();
if (pool->has_preresolution()
|| (resolved_klass() == SystemDictionary::MethodHandle_klass() &&
- MethodHandles::is_signature_polymorphic_name(resolved_klass(), method_name))) {
- Method* result_oop = ConstantPool::method_at_if_loaded(pool, index);
- if (result_oop != NULL) {
- resolved_method = methodHandle(THREAD, result_oop);
- return;
+ MethodHandles::is_signature_polymorphic_name(resolved_klass(), link_info.name()))) {
+ Method* result = ConstantPool::method_at_if_loaded(pool, index);
+ if (result != NULL) {
+ return methodHandle(THREAD, result);
}
}
if (code == Bytecodes::_invokeinterface) {
- resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+ return resolve_interface_method(link_info, true, THREAD);
} else if (code == Bytecodes::_invokevirtual) {
- resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+ return resolve_method(link_info, /*require_methodref*/true, THREAD);
} else if (!resolved_klass->is_interface()) {
- resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, false, CHECK);
+ return resolve_method(link_info, /*require_methodref*/false, THREAD);
} else {
bool nostatics = (code == Bytecodes::_invokestatic) ? false : true;
- resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, true, nostatics, CHECK);
+ return resolve_interface_method(link_info, nostatics, THREAD);
}
}
-void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature,
- KlassHandle current_klass, bool check_access,
- bool require_methodref, TRAPS) {
+// Check and print a loader constraint violation message for method or interface method
+void LinkResolver::check_method_loader_constraints(const LinkInfo& link_info,
+ const methodHandle& resolved_method,
+ const char* method_type, TRAPS) {
+ Handle current_loader(THREAD, link_info.current_klass()->class_loader());
+ Handle resolved_loader(THREAD, resolved_method->method_holder()->class_loader());
+
+ ResourceMark rm(THREAD);
+ Symbol* failed_type_symbol =
+ SystemDictionary::check_signature_loaders(link_info.signature(), current_loader,
+ resolved_loader, true, CHECK);
+ if (failed_type_symbol != NULL) {
+ const char* msg = "loader constraint violation: when resolving %s"
+ " \"%s\" the class loader (instance of %s) of the current class, %s,"
+ " and the class loader (instance of %s) for the method's defining class, %s, have"
+ " different Class objects for the type %s used in the signature";
+ char* sig = link_info.method_string();
+ const char* loader1_name = SystemDictionary::loader_name(current_loader());
+ char* current = link_info.current_klass()->name()->as_C_string();
+ const char* loader2_name = SystemDictionary::loader_name(resolved_loader());
+ char* target = resolved_method->method_holder()->name()->as_C_string();
+ char* failed_type_name = failed_type_symbol->as_C_string();
+ size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1_name) +
+ strlen(current) + strlen(loader2_name) + strlen(target) +
+ strlen(failed_type_name) + strlen(method_type) + 1;
+ char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
+ jio_snprintf(buf, buflen, msg, method_type, sig, loader1_name, current, loader2_name,
+ target, failed_type_name);
+ THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
+ }
+}
+
+void LinkResolver::check_field_loader_constraints(Symbol* field, Symbol* sig,
+ KlassHandle current_klass,
+ KlassHandle sel_klass, TRAPS) {
+ Handle ref_loader(THREAD, current_klass->class_loader());
+ Handle sel_loader(THREAD, sel_klass->class_loader());
+
+ ResourceMark rm(THREAD); // needed for check_signature_loaders
+ Symbol* failed_type_symbol =
+ SystemDictionary::check_signature_loaders(sig,
+ ref_loader, sel_loader,
+ false,
+ CHECK);
+ if (failed_type_symbol != NULL) {
+ const char* msg = "loader constraint violation: when resolving field"
+ " \"%s\" the class loader (instance of %s) of the referring class, "
+ "%s, and the class loader (instance of %s) for the field's resolved "
+ "type, %s, have different Class objects for that type";
+ char* field_name = field->as_C_string();
+ const char* loader1_name = SystemDictionary::loader_name(ref_loader());
+ char* sel = sel_klass->name()->as_C_string();
+ const char* loader2_name = SystemDictionary::loader_name(sel_loader());
+ char* failed_type_name = failed_type_symbol->as_C_string();
+ size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1_name) +
+ strlen(sel) + strlen(loader2_name) + strlen(failed_type_name) + 1;
+ char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
+ jio_snprintf(buf, buflen, msg, field_name, loader1_name, sel, loader2_name,
+ failed_type_name);
+ THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
+ }
+}
+
+methodHandle LinkResolver::resolve_method(const LinkInfo& link_info,
+ bool require_methodref, TRAPS) {
Handle nested_exception;
+ KlassHandle resolved_klass = link_info.resolved_klass();
// 1. check if methodref required, that resolved_klass is not interfacemethodref
if (require_methodref && resolved_klass->is_interface()) {
@@ -552,20 +675,19 @@
char buf[200];
jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
resolved_klass()->external_name());
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
// 2. lookup method in resolved klass and its super klasses
- lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);
+ methodHandle resolved_method = lookup_method_in_klasses(link_info, true, false, CHECK_NULL);
if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy
// 3. lookup method in all the interfaces implemented by the resolved klass
- lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+ resolved_method = lookup_method_in_interfaces(link_info, CHECK_NULL);
if (resolved_method.is_null()) {
// JSR 292: see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
- lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
- current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
+ resolved_method = lookup_polymorphic_method(link_info, (Handle*)NULL, (Handle*)NULL, THREAD);
if (HAS_PENDING_EXCEPTION) {
nested_exception = Handle(THREAD, PENDING_EXCEPTION);
CLEAR_PENDING_EXCEPTION;
@@ -576,15 +698,16 @@
if (resolved_method.is_null()) {
// 4. method lookup failed
ResourceMark rm(THREAD);
- THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
+ THROW_MSG_CAUSE_(vmSymbols::java_lang_NoSuchMethodError(),
Method::name_and_sig_as_C_string(resolved_klass(),
- method_name,
- method_signature),
- nested_exception);
+ link_info.name(),
+ link_info.signature()),
+ nested_exception, NULL);
}
// 5. access checks, access checking may be turned off when calling from within the VM.
- if (check_access) {
+ KlassHandle current_klass = link_info.current_klass();
+ if (link_info.check_access()) {
assert(current_klass.not_null() , "current_klass should not be null");
// check if method can be accessed by the referring class
@@ -592,76 +715,50 @@
resolved_klass,
KlassHandle(THREAD, resolved_method->method_holder()),
resolved_method,
- CHECK);
+ CHECK_NULL);
// check loader constraints
- Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
- Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
- {
- ResourceMark rm(THREAD);
- Symbol* failed_type_symbol =
- SystemDictionary::check_signature_loaders(method_signature, loader,
- class_loader, true, CHECK);
- if (failed_type_symbol != NULL) {
- const char* msg = "loader constraint violation: when resolving method"
- " \"%s\" the class loader (instance of %s) of the current class, %s,"
- " and the class loader (instance of %s) for the method's defining class, %s, have"
- " different Class objects for the type %s used in the signature";
- char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
- const char* loader1 = SystemDictionary::loader_name(loader());
- char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
- const char* loader2 = SystemDictionary::loader_name(class_loader());
- char* target = InstanceKlass::cast(resolved_method->method_holder())
- ->name()->as_C_string();
- char* failed_type_name = failed_type_symbol->as_C_string();
- size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
- strlen(current) + strlen(loader2) + strlen(target) +
- strlen(failed_type_name) + 1;
- char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
- jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
- target, failed_type_name);
- THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
- }
- }
+ check_method_loader_constraints(link_info, resolved_method, "method", CHECK_NULL);
}
+
+ return resolved_method;
}
-void LinkResolver::resolve_interface_method(methodHandle& resolved_method,
- KlassHandle resolved_klass,
- Symbol* method_name,
- Symbol* method_signature,
- KlassHandle current_klass,
- bool check_access,
- bool nostatics, TRAPS) {
+methodHandle LinkResolver::resolve_interface_method(const LinkInfo& link_info,
+ bool nostatics, TRAPS) {
+
+ KlassHandle resolved_klass = link_info.resolved_klass();
// check if klass is interface
if (!resolved_klass->is_interface()) {
ResourceMark rm(THREAD);
char buf[200];
jio_snprintf(buf, sizeof(buf), "Found class %s, but interface was expected", resolved_klass()->external_name());
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
// lookup method in this interface or its super, java.lang.Object
// JDK8: also look for static methods
- lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, false, true, CHECK);
+ methodHandle resolved_method = lookup_method_in_klasses(link_info, false, true, CHECK_NULL);
if (resolved_method.is_null() && !resolved_klass->oop_is_array()) {
// lookup method in all the super-interfaces
- lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);
+ resolved_method = lookup_method_in_interfaces(link_info, CHECK_NULL);
}
if (resolved_method.is_null()) {
// no method found
ResourceMark rm(THREAD);
- THROW_MSG(vmSymbols::java_lang_NoSuchMethodError(),
- Method::name_and_sig_as_C_string(resolved_klass(),
- method_name,
- method_signature));
+ THROW_MSG_NULL(vmSymbols::java_lang_NoSuchMethodError(),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ link_info.name(),
+ link_info.signature()));
}
- if (check_access) {
+ if (link_info.check_access()) {
// JDK8 adds non-public interface methods, and accessability check requirement
+ KlassHandle current_klass = link_info.current_klass();
+
assert(current_klass.not_null() , "current_klass should not be null");
// check if method can be accessed by the referring class
@@ -669,38 +766,9 @@
resolved_klass,
KlassHandle(THREAD, resolved_method->method_holder()),
resolved_method,
- CHECK);
+ CHECK_NULL);
- HandleMark hm(THREAD);
- Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
- Handle class_loader (THREAD, resolved_method->method_holder()->class_loader());
- {
- ResourceMark rm(THREAD);
- Symbol* failed_type_symbol =
- SystemDictionary::check_signature_loaders(method_signature, loader,
- class_loader, true, CHECK);
- if (failed_type_symbol != NULL) {
- const char* msg = "loader constraint violation: when resolving "
- "interface method \"%s\" the class loader (instance of %s) of the "
- "current class, %s, and the class loader (instance of %s) for "
- "the method's defining class, %s, have different Class objects for the type %s "
- "used in the signature";
- char* sig = Method::name_and_sig_as_C_string(resolved_klass(),method_name,method_signature);
- const char* loader1 = SystemDictionary::loader_name(loader());
- char* current = InstanceKlass::cast(current_klass())->name()->as_C_string();
- const char* loader2 = SystemDictionary::loader_name(class_loader());
- char* target = InstanceKlass::cast(resolved_method->method_holder())
- ->name()->as_C_string();
- char* failed_type_name = failed_type_symbol->as_C_string();
- size_t buflen = strlen(msg) + strlen(sig) + strlen(loader1) +
- strlen(current) + strlen(loader2) + strlen(target) +
- strlen(failed_type_name) + 1;
- char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
- jio_snprintf(buf, buflen, msg, sig, loader1, current, loader2,
- target, failed_type_name);
- THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
- }
- }
+ check_method_loader_constraints(link_info, resolved_method, "interface method", CHECK_NULL);
}
if (nostatics && resolved_method->is_static()) {
@@ -709,28 +777,16 @@
jio_snprintf(buf, sizeof(buf), "Expected instance not static method %s",
Method::name_and_sig_as_C_string(resolved_klass(),
resolved_method->name(), resolved_method->signature()));
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
if (TraceItables && Verbose) {
- ResourceMark rm(THREAD);
- tty->print("invokeinterface resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
- (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
- (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
- Method::name_and_sig_as_C_string(resolved_klass(),
- resolved_method->name(),
- resolved_method->signature()),
- resolved_method->method_holder()->internal_name()
- );
- resolved_method->access_flags().print_on(tty);
- if (resolved_method->is_default_method()) {
- tty->print("default ");
- }
- if (resolved_method->is_overpass()) {
- tty->print("overpass");
- }
+ trace_method_resolution("invokeinterface resolved method: caller-class",
+ link_info.current_klass(), resolved_klass, resolved_method);
tty->cr();
}
+
+ return resolved_method;
}
//------------------------------------------------------------------------------------------------------------------------
@@ -739,7 +795,7 @@
void LinkResolver::check_field_accessability(KlassHandle ref_klass,
KlassHandle resolved_klass,
KlassHandle sel_klass,
- fieldDescriptor& fd,
+ const fieldDescriptor& fd,
TRAPS) {
if (!Reflection::verify_field_access(ref_klass(),
resolved_klass(),
@@ -759,30 +815,27 @@
}
}
-void LinkResolver::resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
- // Load these early in case the resolve of the containing klass fails
- Symbol* field = pool->name_ref_at(index);
- Symbol* sig = pool->signature_ref_at(index);
-
- // resolve specified klass
- KlassHandle resolved_klass;
- resolve_klass(resolved_klass, pool, index, CHECK);
-
- KlassHandle current_klass(THREAD, pool->pool_holder());
- resolve_field(result, resolved_klass, field, sig, current_klass, byte, true, true, CHECK);
+void LinkResolver::resolve_field_access(fieldDescriptor& fd, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS) {
+ LinkInfo link_info(pool, index, CHECK);
+ resolve_field(fd, link_info, byte, true, CHECK);
}
-void LinkResolver::resolve_field(fieldDescriptor& fd, KlassHandle resolved_klass, Symbol* field, Symbol* sig,
- KlassHandle current_klass, Bytecodes::Code byte, bool check_access, bool initialize_class,
+void LinkResolver::resolve_field(fieldDescriptor& fd,
+ const LinkInfo& link_info,
+ Bytecodes::Code byte, bool initialize_class,
TRAPS) {
assert(byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic ||
byte == Bytecodes::_getfield || byte == Bytecodes::_putfield ||
byte == Bytecodes::_nofast_getfield || byte == Bytecodes::_nofast_putfield ||
- (byte == Bytecodes::_nop && !check_access), "bad field access bytecode");
+ (byte == Bytecodes::_nop && !link_info.check_access()), "bad field access bytecode");
bool is_static = (byte == Bytecodes::_getstatic || byte == Bytecodes::_putstatic);
bool is_put = (byte == Bytecodes::_putfield || byte == Bytecodes::_putstatic || byte == Bytecodes::_nofast_putfield);
// Check if there's a resolved klass containing the field
+ KlassHandle resolved_klass = link_info.resolved_klass();
+ Symbol* field = link_info.name();
+ Symbol* sig = link_info.signature();
+
if (resolved_klass.is_null()) {
ResourceMark rm(THREAD);
THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
@@ -796,11 +849,12 @@
THROW_MSG(vmSymbols::java_lang_NoSuchFieldError(), field->as_C_string());
}
- if (!check_access)
+ if (!link_info.check_access())
// Access checking may be turned off when calling from within the VM.
return;
// check access
+ KlassHandle current_klass = link_info.current_klass();
check_field_accessability(current_klass, resolved_klass, sel_klass, fd, CHECK);
// check for errors
@@ -827,34 +881,7 @@
}
if (sel_klass() != current_klass()) {
- HandleMark hm(THREAD);
- Handle ref_loader (THREAD, InstanceKlass::cast(current_klass())->class_loader());
- Handle sel_loader (THREAD, InstanceKlass::cast(sel_klass())->class_loader());
- {
- ResourceMark rm(THREAD);
- Symbol* failed_type_symbol =
- SystemDictionary::check_signature_loaders(sig,
- ref_loader, sel_loader,
- false,
- CHECK);
- if (failed_type_symbol != NULL) {
- const char* msg = "loader constraint violation: when resolving field"
- " \"%s\" the class loader (instance of %s) of the referring class, "
- "%s, and the class loader (instance of %s) for the field's resolved "
- "type, %s, have different Class objects for that type";
- char* field_name = field->as_C_string();
- const char* loader1 = SystemDictionary::loader_name(ref_loader());
- char* sel = InstanceKlass::cast(sel_klass())->name()->as_C_string();
- const char* loader2 = SystemDictionary::loader_name(sel_loader());
- char* failed_type_name = failed_type_symbol->as_C_string();
- size_t buflen = strlen(msg) + strlen(field_name) + strlen(loader1) +
- strlen(sel) + strlen(loader2) + strlen(failed_type_name) + 1;
- char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen);
- jio_snprintf(buf, buflen, msg, field_name, loader1, sel, loader2,
- failed_type_name);
- THROW_MSG(vmSymbols::java_lang_LinkageError(), buf);
- }
- }
+ check_field_loader_constraints(field, sig, current_klass, sel_klass, CHECK);
}
// return information. note that the klass is set to the actual klass containing the
@@ -873,32 +900,38 @@
// recv_klass the receiver klass
-void LinkResolver::resolve_static_call(CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name,
- Symbol* method_signature, KlassHandle current_klass,
- bool check_access, bool initialize_class, TRAPS) {
- methodHandle resolved_method;
- linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
- resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
+void LinkResolver::resolve_static_call(CallInfo& result,
+ const LinkInfo& link_info,
+ bool initialize_class, TRAPS) {
+ methodHandle resolved_method = linktime_resolve_static_method(link_info, CHECK);
+ // The resolved class can change as a result of this resolution.
+ KlassHandle resolved_klass = KlassHandle(THREAD, resolved_method->method_holder());
+
+ Method* save_resolved_method = resolved_method();
// Initialize klass (this should only happen if everything is ok)
if (initialize_class && resolved_klass->should_be_initialized()) {
resolved_klass->initialize(CHECK);
- linktime_resolve_static_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
+ // Use updated LinkInfo (to reresolve with resolved_klass as method_holder?)
+ LinkInfo new_info(resolved_klass, link_info.name(), link_info.signature(),
+ link_info.current_klass(), link_info.check_access());
+ resolved_method = linktime_resolve_static_method(new_info, CHECK);
}
+ assert(save_resolved_method == resolved_method(), "does this change?");
// setup result
result.set_static(resolved_klass, resolved_method, CHECK);
}
// throws linktime exceptions
-void LinkResolver::linktime_resolve_static_method(methodHandle& resolved_method, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature,
- KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_static_method(const LinkInfo& link_info, TRAPS) {
+ KlassHandle resolved_klass = link_info.resolved_klass();
+ methodHandle resolved_method;
if (!resolved_klass->is_interface()) {
- resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
+ resolved_method = resolve_method(link_info, /*require_methodref*/false, CHECK_NULL);
} else {
- resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
+ resolved_method = resolve_interface_method(link_info, /*nostatics*/false, CHECK_NULL);
}
assert(resolved_method->name() != vmSymbols::class_initializer_name(), "should have been checked in verifier");
@@ -909,22 +942,25 @@
jio_snprintf(buf, sizeof(buf), "Expected static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
resolved_method->name(),
resolved_method->signature()));
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
+ return resolved_method;
}
-void LinkResolver::resolve_special_call(CallInfo& result, KlassHandle resolved_klass, Symbol* method_name,
- Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
- methodHandle resolved_method;
- linktime_resolve_special_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
- runtime_resolve_special_method(result, resolved_method, resolved_klass, current_klass, check_access, CHECK);
+void LinkResolver::resolve_special_call(CallInfo& result,
+ const LinkInfo& link_info,
+ TRAPS) {
+ methodHandle resolved_method = linktime_resolve_special_method(link_info, CHECK);
+ runtime_resolve_special_method(result, resolved_method,
+ link_info.resolved_klass(),
+ link_info.current_klass(),
+ link_info.check_access(), CHECK);
}
// throws linktime exceptions
-void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature,
- KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_special_method(const LinkInfo& link_info,
+ TRAPS) {
// Invokespecial is called for multiple special reasons:
// <init>
@@ -932,11 +968,13 @@
// superclass.method, which can also resolve to a default method
// and the selected method is recalculated relative to the direct superclass
// superinterface.method, which explicitly does not check shadowing
+ KlassHandle resolved_klass = link_info.resolved_klass();
+ methodHandle resolved_method;
if (!resolved_klass->is_interface()) {
- resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, false, CHECK);
+ resolved_method = resolve_method(link_info, /*require_methodref*/false, CHECK_NULL);
} else {
- resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
+ resolved_method = resolve_interface_method(link_info, /*nostatics*/true, CHECK_NULL);
}
// check if method name is <init>, that it is found in same klass as static type
@@ -951,10 +989,11 @@
resolved_method->name()->as_C_string(),
resolved_method->signature()->as_C_string()
);
- return;
+ return NULL;
}
// check if invokespecial's interface method reference is in an indirect superinterface
+ KlassHandle current_klass = link_info.current_klass();
if (!current_klass.is_null() && resolved_klass->is_interface()) {
Klass *klass_to_check = !InstanceKlass::cast(current_klass())->is_anonymous() ?
current_klass() :
@@ -973,7 +1012,7 @@
resolved_method->name(),
resolved_method->signature()),
current_klass->external_name());
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
}
@@ -984,35 +1023,26 @@
jio_snprintf(buf, sizeof(buf),
"Expecting non-static method %s",
Method::name_and_sig_as_C_string(resolved_klass(),
- resolved_method->name(),
- resolved_method->signature()));
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ resolved_method->name(),
+ resolved_method->signature()));
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
if (TraceItables && Verbose) {
- ResourceMark rm(THREAD);
- tty->print("invokespecial resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
- (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
- (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
- Method::name_and_sig_as_C_string(resolved_klass(),
- resolved_method->name(),
- resolved_method->signature()),
- resolved_method->method_holder()->internal_name()
- );
- resolved_method->access_flags().print_on(tty);
- if (resolved_method->is_default_method()) {
- tty->print("default ");
- }
- if (resolved_method->is_overpass()) {
- tty->print("overpass");
- }
+ trace_method_resolution("invokespecial resolved method: caller-class:",
+ current_klass, resolved_klass, resolved_method);
tty->cr();
}
+
+ return resolved_method;
}
// throws runtime exceptions
-void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
- KlassHandle current_klass, bool check_access, TRAPS) {
+void LinkResolver::runtime_resolve_special_method(CallInfo& result,
+ const methodHandle& resolved_method,
+ KlassHandle resolved_klass,
+ KlassHandle current_klass,
+ bool check_access, TRAPS) {
// resolved method is selected method unless we have an old-style lookup
// for a superclass method
@@ -1037,7 +1067,7 @@
resolved_method->name() != vmSymbols::object_initializer_name()) {
// Lookup super method
KlassHandle super_klass(THREAD, current_klass->super());
- lookup_instance_method_in_klasses(sel_method, super_klass,
+ sel_method = lookup_instance_method_in_klasses(super_klass,
resolved_method->name(),
resolved_method->signature(), CHECK);
// check if found
@@ -1066,26 +1096,13 @@
ResourceMark rm(THREAD);
THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
Method::name_and_sig_as_C_string(resolved_klass(),
- sel_method->name(),
- sel_method->signature()));
+ sel_method->name(),
+ sel_method->signature()));
}
if (TraceItables && Verbose) {
- ResourceMark rm(THREAD);
- tty->print("invokespecial selected method: resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
- (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
- Method::name_and_sig_as_C_string(resolved_klass(),
- sel_method->name(),
- sel_method->signature()),
- sel_method->method_holder()->internal_name()
- );
- sel_method->access_flags().print_on(tty);
- if (sel_method->is_default_method()) {
- tty->print("default ");
- }
- if (sel_method->is_overpass()) {
- tty->print("overpass");
- }
+ trace_method_resolution("invokespecial selected method: resolved-class:",
+ resolved_klass, resolved_klass, sel_method);
tty->cr();
}
@@ -1093,25 +1110,29 @@
result.set_static(resolved_klass, sel_method, CHECK);
}
-void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
- bool check_access, bool check_null_and_abstract, TRAPS) {
- methodHandle resolved_method;
- linktime_resolve_virtual_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
- runtime_resolve_virtual_method(result, resolved_method, resolved_klass, recv, receiver_klass, check_null_and_abstract, CHECK);
+void LinkResolver::resolve_virtual_call(CallInfo& result, Handle recv, KlassHandle receiver_klass,
+ const LinkInfo& link_info,
+ bool check_null_and_abstract, TRAPS) {
+ methodHandle resolved_method = linktime_resolve_virtual_method(link_info, CHECK);
+ runtime_resolve_virtual_method(result, resolved_method,
+ link_info.resolved_klass(),
+ recv, receiver_klass,
+ check_null_and_abstract, CHECK);
}
// throws linktime exceptions
-void LinkResolver::linktime_resolve_virtual_method(methodHandle &resolved_method, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature,
- KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_virtual_method(const LinkInfo& link_info,
+ TRAPS) {
// normal method resolution
- resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
+ methodHandle resolved_method = resolve_method(link_info, /*require_methodref*/true, CHECK_NULL);
assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
// check if private interface method
+ KlassHandle resolved_klass = link_info.resolved_klass();
+ KlassHandle current_klass = link_info.current_klass();
+
if (resolved_klass->is_interface() && resolved_method->is_private()) {
ResourceMark rm(THREAD);
char buf[200];
@@ -1120,7 +1141,7 @@
resolved_method->name(),
resolved_method->signature()),
(current_klass.is_null() ? "<NULL>" : current_klass->internal_name()));
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
// check if not static
@@ -1130,33 +1151,21 @@
jio_snprintf(buf, sizeof(buf), "Expecting non-static method %s", Method::name_and_sig_as_C_string(resolved_klass(),
resolved_method->name(),
resolved_method->signature()));
- THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
+ THROW_MSG_NULL(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
}
if (PrintVtables && Verbose) {
- ResourceMark rm(THREAD);
- tty->print("invokevirtual resolved method: caller-class:%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
- (current_klass.is_null() ? "<NULL>" : current_klass->internal_name()),
- (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
- Method::name_and_sig_as_C_string(resolved_klass(),
- resolved_method->name(),
- resolved_method->signature()),
- resolved_method->method_holder()->internal_name()
- );
- resolved_method->access_flags().print_on(tty);
- if (resolved_method->is_default_method()) {
- tty->print("default ");
- }
- if (resolved_method->is_overpass()) {
- tty->print("overpass");
- }
+ trace_method_resolution("invokevirtual resolved method: caller-class:",
+ current_klass, resolved_klass, resolved_method);
tty->cr();
}
+
+ return resolved_method;
}
// throws runtime exceptions
void LinkResolver::runtime_resolve_virtual_method(CallInfo& result,
- methodHandle resolved_method,
+ const methodHandle& resolved_method,
KlassHandle resolved_klass,
Handle recv,
KlassHandle recv_klass,
@@ -1227,50 +1236,40 @@
}
if (PrintVtables && Verbose) {
- ResourceMark rm(THREAD);
- tty->print("invokevirtual selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, vtable_index:%d, access_flags: ",
- (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
- (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
- Method::name_and_sig_as_C_string(resolved_klass(),
- resolved_method->name(),
- resolved_method->signature()),
- selected_method->method_holder()->internal_name(),
- vtable_index
- );
- selected_method->access_flags().print_on(tty);
- if (selected_method->is_default_method()) {
- tty->print("default ");
- }
- if (selected_method->is_overpass()) {
- tty->print("overpass");
- }
- tty->cr();
+ trace_method_resolution("invokevirtual selected method: receiver-class:",
+ recv_klass, resolved_klass, selected_method);
+ tty->print_cr("vtable_index:%d", vtable_index);
}
// setup result
result.set_virtual(resolved_klass, recv_klass, resolved_method, selected_method, vtable_index, CHECK);
}
-void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature, KlassHandle current_klass,
- bool check_access, bool check_null_and_abstract, TRAPS) {
- methodHandle resolved_method;
- linktime_resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK);
- runtime_resolve_interface_method(result, resolved_method, resolved_klass, recv, recv_klass, check_null_and_abstract, CHECK);
+void LinkResolver::resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass,
+ const LinkInfo& link_info,
+ bool check_null_and_abstract, TRAPS) {
+ // throws linktime exceptions
+ methodHandle resolved_method = linktime_resolve_interface_method(link_info, CHECK);
+ runtime_resolve_interface_method(result, resolved_method,link_info.resolved_klass(),
+ recv, recv_klass, check_null_and_abstract, CHECK);
}
-// throws linktime exceptions
-void LinkResolver::linktime_resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name,
- Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) {
+methodHandle LinkResolver::linktime_resolve_interface_method(const LinkInfo& link_info,
+ TRAPS) {
// normal interface method resolution
- resolve_interface_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, true, CHECK);
-
+ methodHandle resolved_method = resolve_interface_method(link_info, true, CHECK_NULL);
assert(resolved_method->name() != vmSymbols::object_initializer_name(), "should have been checked in verifier");
assert(resolved_method->name() != vmSymbols::class_initializer_name (), "should have been checked in verifier");
+
+ return resolved_method;
}
// throws runtime exceptions
-void LinkResolver::runtime_resolve_interface_method(CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass,
- Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS) {
+void LinkResolver::runtime_resolve_interface_method(CallInfo& result,
+ const methodHandle& resolved_method,
+ KlassHandle resolved_klass,
+ Handle recv,
+ KlassHandle recv_klass,
+ bool check_null_and_abstract, TRAPS) {
// check if receiver exists
if (check_null_and_abstract && recv.is_null()) {
THROW(vmSymbols::java_lang_NullPointerException());
@@ -1298,12 +1297,11 @@
}
// do lookup based on receiver klass
- methodHandle sel_method;
// This search must match the linktime preparation search for itable initialization
// to correctly enforce loader constraints for interface method inheritance
- lookup_instance_method_in_klasses(sel_method, recv_klass,
- resolved_method->name(),
- resolved_method->signature(), CHECK);
+ methodHandle sel_method = lookup_instance_method_in_klasses(recv_klass,
+ resolved_method->name(),
+ resolved_method->signature(), CHECK);
if (sel_method.is_null() && !check_null_and_abstract) {
// In theory this is a harmless placeholder value, but
// in practice leaving in null affects the nsk default method tests.
@@ -1314,9 +1312,9 @@
if (sel_method.is_null()) {
ResourceMark rm(THREAD);
THROW_MSG(vmSymbols::java_lang_AbstractMethodError(),
- Method::name_and_sig_as_C_string(recv_klass(),
- resolved_method->name(),
- resolved_method->signature()));
+ Method::name_and_sig_as_C_string(recv_klass(),
+ resolved_method->name(),
+ resolved_method->signature()));
}
// check access
// Throw Illegal Access Error if sel_method is not public.
@@ -1337,22 +1335,8 @@
}
if (TraceItables && Verbose) {
- ResourceMark rm(THREAD);
- tty->print("invokeinterface selected method: receiver-class:%s, resolved-class:%s, method:%s, method_holder:%s, access_flags: ",
- (recv_klass.is_null() ? "<NULL>" : recv_klass->internal_name()),
- (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
- Method::name_and_sig_as_C_string(resolved_klass(),
- resolved_method->name(),
- resolved_method->signature()),
- sel_method->method_holder()->internal_name()
- );
- sel_method->access_flags().print_on(tty);
- if (sel_method->is_default_method()) {
- tty->print("default ");
- }
- if (sel_method->is_overpass()) {
- tty->print("overpass");
- }
+ trace_method_resolution("invokeinterface selected method: receiver-class",
+ recv_klass, resolved_klass, sel_method);
tty->cr();
}
// setup result
@@ -1368,14 +1352,9 @@
methodHandle LinkResolver::linktime_resolve_interface_method_or_null(
- KlassHandle resolved_klass,
- Symbol* method_name,
- Symbol* method_signature,
- KlassHandle current_klass,
- bool check_access) {
+ const LinkInfo& link_info) {
EXCEPTION_MARK;
- methodHandle method_result;
- linktime_resolve_interface_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
+ methodHandle method_result = linktime_resolve_interface_method(link_info, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return methodHandle();
@@ -1385,14 +1364,9 @@
}
methodHandle LinkResolver::linktime_resolve_virtual_method_or_null(
- KlassHandle resolved_klass,
- Symbol* method_name,
- Symbol* method_signature,
- KlassHandle current_klass,
- bool check_access) {
+ const LinkInfo& link_info) {
EXCEPTION_MARK;
- methodHandle method_result;
- linktime_resolve_virtual_method(method_result, resolved_klass, method_name, method_signature, current_klass, check_access, THREAD);
+ methodHandle method_result = linktime_resolve_virtual_method(link_info, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return methodHandle();
@@ -1403,14 +1377,10 @@
methodHandle LinkResolver::resolve_virtual_call_or_null(
KlassHandle receiver_klass,
- KlassHandle resolved_klass,
- Symbol* name,
- Symbol* signature,
- KlassHandle current_klass,
- bool check_access) {
+ const LinkInfo& link_info) {
EXCEPTION_MARK;
CallInfo info;
- resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, check_access, false, THREAD);
+ resolve_virtual_call(info, Handle(), receiver_klass, link_info, false, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return methodHandle();
@@ -1420,14 +1390,10 @@
methodHandle LinkResolver::resolve_interface_call_or_null(
KlassHandle receiver_klass,
- KlassHandle resolved_klass,
- Symbol* name,
- Symbol* signature,
- KlassHandle current_klass,
- bool check_access) {
+ const LinkInfo& link_info) {
EXCEPTION_MARK;
CallInfo info;
- resolve_interface_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, check_access, false, THREAD);
+ resolve_interface_call(info, Handle(), receiver_klass, link_info, false, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return methodHandle();
@@ -1435,15 +1401,12 @@
return info.selected_method();
}
-int LinkResolver::resolve_virtual_vtable_index(
- KlassHandle receiver_klass,
- KlassHandle resolved_klass,
- Symbol* name,
- Symbol* signature,
- KlassHandle current_klass) {
+int LinkResolver::resolve_virtual_vtable_index(KlassHandle receiver_klass,
+ const LinkInfo& link_info) {
EXCEPTION_MARK;
CallInfo info;
- resolve_virtual_call(info, Handle(), receiver_klass, resolved_klass, name, signature, current_klass, true, false, THREAD);
+ resolve_virtual_call(info, Handle(), receiver_klass, link_info,
+ /*check_null_or_abstract*/false, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return Method::invalid_vtable_index;
@@ -1451,15 +1414,10 @@
return info.vtable_index();
}
-methodHandle LinkResolver::resolve_static_call_or_null(
- KlassHandle resolved_klass,
- Symbol* name,
- Symbol* signature,
- KlassHandle current_klass,
- bool check_access) {
+methodHandle LinkResolver::resolve_static_call_or_null(const LinkInfo& link_info) {
EXCEPTION_MARK;
CallInfo info;
- resolve_static_call(info, resolved_klass, name, signature, current_klass, check_access, false, THREAD);
+ resolve_static_call(info, link_info, /*initialize_class*/false, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return methodHandle();
@@ -1467,15 +1425,10 @@
return info.selected_method();
}
-methodHandle LinkResolver::resolve_special_call_or_null(
- KlassHandle resolved_klass,
- Symbol* name,
- Symbol* signature,
- KlassHandle current_klass,
- bool check_access) {
+methodHandle LinkResolver::resolve_special_call_or_null(const LinkInfo& link_info) {
EXCEPTION_MARK;
CallInfo info;
- resolve_special_call(info, resolved_klass, name, signature, current_klass, check_access, THREAD);
+ resolve_special_call(info, link_info, THREAD);
if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION;
return methodHandle();
@@ -1500,35 +1453,15 @@
return;
}
-void LinkResolver::resolve_pool(KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature,
- KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS) {
- // resolve klass
- resolve_klass(resolved_klass, pool, index, CHECK);
-
- // Get name, signature, and static klass
- method_name = pool->name_ref_at(index);
- method_signature = pool->signature_ref_at(index);
- current_klass = KlassHandle(THREAD, pool->pool_holder());
-}
-
-
void LinkResolver::resolve_invokestatic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
- KlassHandle resolved_klass;
- Symbol* method_name = NULL;
- Symbol* method_signature = NULL;
- KlassHandle current_klass;
- resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
- resolve_static_call(result, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+ LinkInfo link_info(pool, index, CHECK);
+ resolve_static_call(result, link_info, /*initialize_class*/true, CHECK);
}
void LinkResolver::resolve_invokespecial(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
- KlassHandle resolved_klass;
- Symbol* method_name = NULL;
- Symbol* method_signature = NULL;
- KlassHandle current_klass;
- resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
- resolve_special_call(result, resolved_klass, method_name, method_signature, current_klass, true, CHECK);
+ LinkInfo link_info(pool, index, CHECK);
+ resolve_special_call(result, link_info, CHECK);
}
@@ -1536,54 +1469,40 @@
constantPoolHandle pool, int index,
TRAPS) {
- KlassHandle resolved_klass;
- Symbol* method_name = NULL;
- Symbol* method_signature = NULL;
- KlassHandle current_klass;
- resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
+ LinkInfo link_info(pool, index, CHECK);
KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
- resolve_virtual_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+ resolve_virtual_call(result, recv, recvrKlass, link_info, /*check_null_or_abstract*/true, CHECK);
}
void LinkResolver::resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS) {
- KlassHandle resolved_klass;
- Symbol* method_name = NULL;
- Symbol* method_signature = NULL;
- KlassHandle current_klass;
- resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
+ LinkInfo link_info(pool, index, CHECK);
KlassHandle recvrKlass (THREAD, recv.is_null() ? (Klass*)NULL : recv->klass());
- resolve_interface_call(result, recv, recvrKlass, resolved_klass, method_name, method_signature, current_klass, true, true, CHECK);
+ resolve_interface_call(result, recv, recvrKlass, link_info, true, CHECK);
}
void LinkResolver::resolve_invokehandle(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
// This guy is reached from InterpreterRuntime::resolve_invokehandle.
- KlassHandle resolved_klass;
- Symbol* method_name = NULL;
- Symbol* method_signature = NULL;
- KlassHandle current_klass;
- resolve_pool(resolved_klass, method_name, method_signature, current_klass, pool, index, CHECK);
+ LinkInfo link_info(pool, index, CHECK);
if (TraceMethodHandles) {
ResourceMark rm(THREAD);
- tty->print_cr("resolve_invokehandle %s %s", method_name->as_C_string(), method_signature->as_C_string());
+ tty->print_cr("resolve_invokehandle %s %s", link_info.name()->as_C_string(),
+ link_info.signature()->as_C_string());
}
- resolve_handle_call(result, resolved_klass, method_name, method_signature, current_klass, CHECK);
+ resolve_handle_call(result, link_info, CHECK);
}
-void LinkResolver::resolve_handle_call(CallInfo& result, KlassHandle resolved_klass,
- Symbol* method_name, Symbol* method_signature,
- KlassHandle current_klass,
+void LinkResolver::resolve_handle_call(CallInfo& result,
+ const LinkInfo& link_info,
TRAPS) {
// JSR 292: this must be an implicitly generated method MethodHandle.invokeExact(*...) or similar
- assert(resolved_klass() == SystemDictionary::MethodHandle_klass(), "");
- assert(MethodHandles::is_signature_polymorphic_name(method_name), "");
- methodHandle resolved_method;
+ assert(link_info.resolved_klass()() == SystemDictionary::MethodHandle_klass(), "");
+ assert(MethodHandles::is_signature_polymorphic_name(link_info.name()), "");
Handle resolved_appendix;
Handle resolved_method_type;
- lookup_polymorphic_method(resolved_method, resolved_klass,
- method_name, method_signature,
- current_klass, &resolved_appendix, &resolved_method_type, CHECK);
+ methodHandle resolved_method = lookup_polymorphic_method(link_info,
+ &resolved_appendix, &resolved_method_type, CHECK);
result.set_handle(resolved_method, resolved_appendix, resolved_method_type, CHECK);
}
@@ -1609,7 +1528,6 @@
}
void LinkResolver::resolve_invokedynamic(CallInfo& result, constantPoolHandle pool, int index, TRAPS) {
- //resolve_pool(<resolved_klass>, method_name, method_signature, current_klass, pool, index, CHECK);
Symbol* method_name = pool->name_ref_at(index);
Symbol* method_signature = pool->signature_ref_at(index);
KlassHandle current_klass = KlassHandle(THREAD, pool->pool_holder());
@@ -1667,19 +1585,27 @@
wrap_invokedynamic_exception(CHECK);
}
-//------------------------------------------------------------------------------------------------------------------------
#ifndef PRODUCT
-
-void CallInfo::print() {
+void LinkResolver::trace_method_resolution(const char* prefix,
+ KlassHandle klass,
+ KlassHandle resolved_klass,
+ const methodHandle& method) {
ResourceMark rm;
- const char* kindstr = "unknown";
- switch (_call_kind) {
- case direct_call: kindstr = "direct"; break;
- case vtable_call: kindstr = "vtable"; break;
- case itable_call: kindstr = "itable"; break;
+ tty->print("%s%s, compile-time-class:%s, method:%s, method_holder:%s, access_flags: ",
+ prefix,
+ (klass.is_null() ? "<NULL>" : klass->internal_name()),
+ (resolved_klass.is_null() ? "<NULL>" : resolved_klass->internal_name()),
+ Method::name_and_sig_as_C_string(resolved_klass(),
+ method->name(),
+ method->signature()),
+ method->method_holder()->internal_name()
+ );
+ method->access_flags().print_on(tty);
+ if (method->is_default_method()) {
+ tty->print("default ");
}
- tty->print_cr("Call %s@%d %s", kindstr, _call_index,
- _resolved_method.is_null() ? "(none)" : _resolved_method->name_and_sig_as_C_string());
+ if (method->is_overpass()) {
+ tty->print("overpass ");
+ }
}
-
-#endif
+#endif // PRODUCT
--- a/hotspot/src/share/vm/interpreter/linkResolver.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -36,7 +36,7 @@
// that method. If the info is invalid, the link has not been resolved
// successfully.
-class CallInfo VALUE_OBJ_CLASS_SPEC {
+class CallInfo : public StackObj {
public:
// Ways that a method call might be selected (or not) based on receiver type.
// Note that an invokevirtual instruction might be linked with no_dispatch,
@@ -58,11 +58,22 @@
Handle _resolved_appendix; // extra argument in constant pool (if CPCE::has_appendix)
Handle _resolved_method_type; // MethodType (for invokedynamic and invokehandle call sites)
- void set_static( KlassHandle resolved_klass, methodHandle resolved_method , TRAPS);
- void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int itable_index , TRAPS);
- void set_virtual( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, int vtable_index , TRAPS);
- void set_handle( methodHandle resolved_method, Handle resolved_appendix, Handle resolved_method_type, TRAPS);
- void set_common( KlassHandle resolved_klass, KlassHandle selected_klass, methodHandle resolved_method, methodHandle selected_method, CallKind kind, int index, TRAPS);
+ void set_static(KlassHandle resolved_klass, const methodHandle& resolved_method, TRAPS);
+ void set_interface(KlassHandle resolved_klass, KlassHandle selected_klass,
+ const methodHandle& resolved_method,
+ const methodHandle& selected_method,
+ int itable_index, TRAPS);
+ void set_virtual(KlassHandle resolved_klass, KlassHandle selected_klass,
+ const methodHandle& resolved_method,
+ const methodHandle& selected_method,
+ int vtable_index, TRAPS);
+ void set_handle(const methodHandle& resolved_method,
+ Handle resolved_appendix, Handle resolved_method_type, TRAPS);
+ void set_common(KlassHandle resolved_klass, KlassHandle selected_klass,
+ const methodHandle& resolved_method,
+ const methodHandle& selected_method,
+ CallKind kind,
+ int index, TRAPS);
friend class LinkResolver;
@@ -113,6 +124,37 @@
void print() PRODUCT_RETURN;
};
+
+// Condensed information from constant pool to use to resolve the method or field.
+// resolved_klass = specified class (i.e., static receiver class)
+// current_klass = sending method holder (i.e., class containing the method
+// containing the call being resolved)
+class LinkInfo : public StackObj {
+ Symbol* _name; // extracted from JVM_CONSTANT_NameAndType
+ Symbol* _signature;
+ KlassHandle _resolved_klass; // class that the constant pool entry points to
+ KlassHandle _current_klass; // class that owns the constant pool
+ bool _check_access;
+ public:
+ LinkInfo(constantPoolHandle pool, int index, TRAPS);
+ // Condensed information from other call sites within the vm.
+ LinkInfo(KlassHandle resolved_klass, Symbol* name, Symbol* signature,
+ KlassHandle current_klass, bool check_access = true) :
+ _resolved_klass(resolved_klass),
+ _name(name), _signature(signature), _current_klass(current_klass),
+ _check_access(check_access) {}
+
+ // accessors
+ Symbol* name() const { return _name; }
+ Symbol* signature() const { return _signature; }
+ KlassHandle resolved_klass() const { return _resolved_klass; }
+ KlassHandle current_klass() const { return _current_klass; }
+ bool check_access() const { return _check_access; }
+ char* method_string() const;
+
+ void print() PRODUCT_RETURN;
+};
+
// Link information for getfield/putfield & getstatic/putstatic bytecodes
// is represented using a fieldDescriptor.
@@ -124,85 +166,136 @@
friend class klassItable;
private:
- static void lookup_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, bool checkpolymorphism, bool in_imethod_resolve, TRAPS);
- static void lookup_instance_method_in_klasses (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
- static void lookup_method_in_interfaces (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
- static void lookup_polymorphic_method (methodHandle& result, KlassHandle klass, Symbol* name, Symbol* signature,
- KlassHandle current_klass, Handle *appendix_result_or_null, Handle *method_type_result, TRAPS);
+
+ static methodHandle lookup_method_in_klasses(const LinkInfo& link_info,
+ bool checkpolymorphism,
+ bool in_imethod_resolve, TRAPS);
+ static methodHandle lookup_method_in_interfaces(const LinkInfo& link_info, TRAPS);
+ static methodHandle lookup_polymorphic_method(const LinkInfo& link_info,
+ Handle *appendix_result_or_null,
+ Handle *method_type_result, TRAPS);
+ // Not Linktime so doesn't take LinkInfo
+ static methodHandle lookup_instance_method_in_klasses (
+ KlassHandle klass, Symbol* name, Symbol* signature, TRAPS);
- static void resolve_klass (KlassHandle& result, constantPoolHandle pool, int index, TRAPS);
+ // Similar loader constraint checking functions that throw
+ // LinkageError with descriptive message.
+ static void check_method_loader_constraints(const LinkInfo& link_info,
+ const methodHandle& resolved_method,
+ const char* method_type, TRAPS);
+ static void check_field_loader_constraints(Symbol* field, Symbol* sig,
+ KlassHandle current_klass,
+ KlassHandle sel_klass, TRAPS);
- static void resolve_pool (KlassHandle& resolved_klass, Symbol*& method_name, Symbol*& method_signature, KlassHandle& current_klass, constantPoolHandle pool, int index, TRAPS);
+ static methodHandle resolve_interface_method(const LinkInfo& link_info, bool nostatics, TRAPS);
+ static methodHandle resolve_method (const LinkInfo& link_info, bool require_methodref, TRAPS);
- static void resolve_interface_method(methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool nostatics, TRAPS);
- static void resolve_method (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool require_methodref, TRAPS);
+ static methodHandle linktime_resolve_static_method (const LinkInfo& link_info, TRAPS);
+ static methodHandle linktime_resolve_special_method (const LinkInfo& link_info, TRAPS);
+ static methodHandle linktime_resolve_virtual_method (const LinkInfo& link_info, TRAPS);
+ static methodHandle linktime_resolve_interface_method (const LinkInfo& link_info, TRAPS);
- static void linktime_resolve_static_method (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
- static void linktime_resolve_special_method (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
- static void linktime_resolve_virtual_method (methodHandle &resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature,KlassHandle current_klass, bool check_access, TRAPS);
- static void linktime_resolve_interface_method (methodHandle& resolved_method, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
+ static void runtime_resolve_special_method (CallInfo& result,
+ const methodHandle& resolved_method,
+ KlassHandle resolved_klass,
+ KlassHandle current_klass,
+ bool check_access, TRAPS);
+ static void runtime_resolve_virtual_method (CallInfo& result,
+ const methodHandle& resolved_method,
+ KlassHandle resolved_klass,
+ Handle recv,
+ KlassHandle recv_klass,
+ bool check_null_and_abstract, TRAPS);
+ static void runtime_resolve_interface_method (CallInfo& result,
+ const methodHandle& resolved_method,
+ KlassHandle resolved_klass,
+ Handle recv,
+ KlassHandle recv_klass,
+ bool check_null_and_abstract, TRAPS);
- static void runtime_resolve_special_method (CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass, KlassHandle current_klass, bool check_access, TRAPS);
- static void runtime_resolve_virtual_method (CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass, Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS);
- static void runtime_resolve_interface_method (CallInfo& result, methodHandle resolved_method, KlassHandle resolved_klass, Handle recv, KlassHandle recv_klass, bool check_null_and_abstract, TRAPS);
+ static void check_field_accessability(KlassHandle ref_klass,
+ KlassHandle resolved_klass,
+ KlassHandle sel_klass,
+ const fieldDescriptor& fd, TRAPS);
+ static void check_method_accessability(KlassHandle ref_klass,
+ KlassHandle resolved_klass,
+ KlassHandle sel_klass,
+ const methodHandle& sel_method, TRAPS);
- static void check_field_accessability (KlassHandle ref_klass, KlassHandle resolved_klass, KlassHandle sel_klass, fieldDescriptor& fd, TRAPS);
- static void check_method_accessability (KlassHandle ref_klass, KlassHandle resolved_klass, KlassHandle sel_klass, methodHandle sel_method, TRAPS);
-
+ // runtime resolving from constant pool
+ static void resolve_invokestatic (CallInfo& result,
+ constantPoolHandle pool, int index, TRAPS);
+ static void resolve_invokespecial (CallInfo& result,
+ constantPoolHandle pool, int index, TRAPS);
+ static void resolve_invokevirtual (CallInfo& result, Handle recv,
+ constantPoolHandle pool, int index, TRAPS);
+ static void resolve_invokeinterface(CallInfo& result, Handle recv,
+ constantPoolHandle pool, int index, TRAPS);
+ static void resolve_invokedynamic (CallInfo& result,
+ constantPoolHandle pool, int index, TRAPS);
+ static void resolve_invokehandle (CallInfo& result,
+ constantPoolHandle pool, int index, TRAPS);
public:
// constant pool resolving
static void check_klass_accessability(KlassHandle ref_klass, KlassHandle sel_klass, TRAPS);
- // static resolving calls (will not run any Java code); used only from Bytecode_invoke::static_target
- static void resolve_method_statically(methodHandle& method_result, KlassHandle& klass_result,
- Bytecodes::Code code, constantPoolHandle pool, int index, TRAPS);
+ // static resolving calls (will not run any Java code);
+ // used only from Bytecode_invoke::static_target
+ static methodHandle resolve_method_statically(Bytecodes::Code code,
+ constantPoolHandle pool,
+ int index, TRAPS);
- // runtime/static resolving for fields
- static void resolve_field_access(fieldDescriptor& result, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS);
- static void resolve_field(fieldDescriptor& result, KlassHandle resolved_klass, Symbol* field_name, Symbol* field_signature,
- KlassHandle current_klass, Bytecodes::Code access_kind, bool check_access, bool initialize_class, TRAPS);
-
- // source of access_kind codes:
- static Bytecodes::Code field_access_kind(bool is_static, bool is_put) {
- return (is_static
- ? (is_put ? Bytecodes::_putstatic : Bytecodes::_getstatic)
- : (is_put ? Bytecodes::_putfield : Bytecodes::_getfield ));
- }
+ static void resolve_field_access(fieldDescriptor& result,
+ constantPoolHandle pool,
+ int index, Bytecodes::Code byte, TRAPS);
+ static void resolve_field(fieldDescriptor& result, const LinkInfo& link_info,
+ Bytecodes::Code access_kind,
+ bool initialize_class, TRAPS);
- // runtime resolving:
- // resolved_klass = specified class (i.e., static receiver class)
- // current_klass = sending method holder (i.e., class containing the method containing the call being resolved)
- static void resolve_static_call (CallInfo& result, KlassHandle& resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool initialize_klass, TRAPS);
- static void resolve_special_call (CallInfo& result, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS);
- static void resolve_virtual_call (CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS);
- static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, bool check_null_and_abstract, TRAPS);
- static void resolve_handle_call (CallInfo& result, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS);
- static void resolve_dynamic_call (CallInfo& result, Handle bootstrap_specifier, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, TRAPS);
+ static void resolve_static_call (CallInfo& result,
+ const LinkInfo& link_info,
+ bool initialize_klass, TRAPS);
+ static void resolve_special_call (CallInfo& result,
+ const LinkInfo& link_info,
+ TRAPS);
+ static void resolve_virtual_call (CallInfo& result, Handle recv, KlassHandle recv_klass,
+ const LinkInfo& link_info,
+ bool check_null_and_abstract, TRAPS);
+ static void resolve_interface_call(CallInfo& result, Handle recv, KlassHandle recv_klass,
+ const LinkInfo& link_info,
+ bool check_null_and_abstract, TRAPS);
+ static void resolve_handle_call (CallInfo& result,
+ const LinkInfo& link_info, TRAPS);
+ static void resolve_dynamic_call (CallInfo& result, Handle bootstrap_specifier,
+ Symbol* method_name, Symbol* method_signature,
+ KlassHandle current_klass, TRAPS);
- // same as above for compile-time resolution; but returns null handle instead of throwing an exception on error
- // also, does not initialize klass (i.e., no side effects)
- static methodHandle resolve_virtual_call_or_null (KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
- static methodHandle resolve_interface_call_or_null(KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
- static methodHandle resolve_static_call_or_null (KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
- static methodHandle resolve_special_call_or_null (KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access = true);
- static int vtable_index_of_interface_method(KlassHandle klass, methodHandle resolved_method);
+ // same as above for compile-time resolution; but returns null handle instead of throwing
+ // an exception on error also, does not initialize klass (i.e., no side effects)
+ static methodHandle resolve_virtual_call_or_null (KlassHandle receiver_klass,
+ const LinkInfo& link_info);
+ static methodHandle resolve_interface_call_or_null(KlassHandle receiver_klass,
+ const LinkInfo& link_info);
+ static methodHandle resolve_static_call_or_null (const LinkInfo& link_info);
+ static methodHandle resolve_special_call_or_null (const LinkInfo& link_info);
+
+ static int vtable_index_of_interface_method(KlassHandle klass, const methodHandle& resolved_method);
// same as above for compile-time resolution; returns vtable_index if current_klass if linked
- static int resolve_virtual_vtable_index (KlassHandle receiver_klass, KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass);
+ static int resolve_virtual_vtable_index (KlassHandle receiver_klass,
+ const LinkInfo& link_info);
// static resolving for compiler (does not throw exceptions, returns null handle if unsuccessful)
- static methodHandle linktime_resolve_virtual_method_or_null (KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access);
- static methodHandle linktime_resolve_interface_method_or_null(KlassHandle resolved_klass, Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access);
+ static methodHandle linktime_resolve_virtual_method_or_null (const LinkInfo& link_info);
+ static methodHandle linktime_resolve_interface_method_or_null(const LinkInfo& link_info);
// runtime resolving from constant pool
- static void resolve_invokestatic (CallInfo& result, constantPoolHandle pool, int index, TRAPS);
- static void resolve_invokespecial (CallInfo& result, constantPoolHandle pool, int index, TRAPS);
- static void resolve_invokevirtual (CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS);
- static void resolve_invokeinterface(CallInfo& result, Handle recv, constantPoolHandle pool, int index, TRAPS);
- static void resolve_invokedynamic (CallInfo& result, constantPoolHandle pool, int index, TRAPS);
- static void resolve_invokehandle (CallInfo& result, constantPoolHandle pool, int index, TRAPS);
-
- static void resolve_invoke (CallInfo& result, Handle recv, constantPoolHandle pool, int index, Bytecodes::Code byte, TRAPS);
+ static void resolve_invoke(CallInfo& result, Handle recv,
+ constantPoolHandle pool, int index,
+ Bytecodes::Code byte, TRAPS);
+ private:
+ static void trace_method_resolution(const char* prefix, KlassHandle klass,
+ KlassHandle resolved_klass,
+ const methodHandle& method) PRODUCT_RETURN;
};
-
#endif // SHARE_VM_INTERPRETER_LINKRESOLVER_HPP
--- a/hotspot/src/share/vm/memory/metaspace.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -614,8 +614,7 @@
Metachunk* _chunks_in_use[NumberOfInUseLists];
Metachunk* _current_chunk;
- // Number of small chunks to allocate to a manager
- // If class space manager, small chunks are unlimited
+ // Maximum number of small chunks to allocate to a SpaceManager
static uint const _small_chunk_limit;
// Sum of all space in allocated chunks
@@ -730,6 +729,8 @@
// Block allocation and deallocation.
// Allocates a block from the current chunk
MetaWord* allocate(size_t word_size);
+ // Allocates a block from a small chunk
+ MetaWord* get_small_chunk_and_allocate(size_t word_size);
// Helper for allocations
MetaWord* allocate_work(size_t word_size);
@@ -2011,9 +2012,8 @@
size_t SpaceManager::calc_chunk_size(size_t word_size) {
// Decide between a small chunk and a medium chunk. Up to
- // _small_chunk_limit small chunks can be allocated but
- // once a medium chunk has been allocated, no more small
- // chunks will be allocated.
+ // _small_chunk_limit small chunks can be allocated.
+ // After that a medium chunk is preferred.
size_t chunk_word_size;
if (chunks_in_use(MediumIndex) == NULL &&
sum_count_in_chunks_in_use(SmallIndex) < _small_chunk_limit) {
@@ -2081,7 +2081,7 @@
word_size, words_used, words_left);
}
- // Get another chunk out of the virtual space
+ // Get another chunk
size_t grow_chunks_by_words = calc_chunk_size(word_size);
Metachunk* next = get_new_chunk(word_size, grow_chunks_by_words);
@@ -2412,6 +2412,43 @@
return next;
}
+/*
+ * The policy is to allocate up to _small_chunk_limit small chunks
+ * after which only medium chunks are allocated. This is done to
+ * reduce fragmentation. In some cases, this can result in a lot
+ * of small chunks being allocated to the point where it's not
+ * possible to expand. If this happens, there may be no medium chunks
+ * available and OOME would be thrown. Instead of doing that,
+ * if the allocation request size fits in a small chunk, an attempt
+ * will be made to allocate a small chunk.
+ */
+MetaWord* SpaceManager::get_small_chunk_and_allocate(size_t word_size) {
+ if (word_size + Metachunk::overhead() > small_chunk_size()) {
+ return NULL;
+ }
+
+ MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag);
+ MutexLockerEx cl1(expand_lock(), Mutex::_no_safepoint_check_flag);
+
+ Metachunk* chunk = chunk_manager()->chunk_freelist_allocate(small_chunk_size());
+
+ MetaWord* mem = NULL;
+
+ if (chunk != NULL) {
+ // Add chunk to the in-use chunk list and do an allocation from it.
+ // Add to this manager's list of chunks in use.
+ add_chunk(chunk, false);
+ mem = chunk->allocate(word_size);
+
+ inc_used_metrics(word_size);
+
+ // Track metaspace memory usage statistic.
+ track_metaspace_memory_usage();
+ }
+
+ return mem;
+}
+
MetaWord* SpaceManager::allocate(size_t word_size) {
MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag);
@@ -3560,7 +3597,18 @@
}
if (result == NULL) {
- report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL);
+ SpaceManager* sm;
+ if (is_class_space_allocation(mdtype)) {
+ sm = loader_data->metaspace_non_null()->class_vsm();
+ } else {
+ sm = loader_data->metaspace_non_null()->vsm();
+ }
+
+ result = sm->get_small_chunk_and_allocate(word_size);
+
+ if (result == NULL) {
+ report_metadata_oome(loader_data, word_size, type, mdtype, CHECK_NULL);
+ }
}
// Zero initialize.
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -622,14 +622,6 @@
if (!this_k->is_linked()) {
if (!this_k->is_rewritten()) {
{
- // Timer includes any side effects of class verification (resolution,
- // etc), but not recursive entry into verify_code().
- PerfClassTraceTime timer(ClassLoader::perf_class_verify_time(),
- ClassLoader::perf_class_verify_selftime(),
- ClassLoader::perf_classes_verified(),
- jt->get_thread_stat()->perf_recursion_counts_addr(),
- jt->get_thread_stat()->perf_timers_addr(),
- PerfClassTraceTime::CLASS_VERIFY);
bool verify_ok = verify_code(this_k, throw_verifyerror, THREAD);
if (!verify_ok) {
return false;
@@ -1830,11 +1822,10 @@
// are dependent on the changes that were passed in and mark them for
// deoptimization. Returns the number of nmethods found.
//
-int InstanceKlass::mark_dependent_nmethods(DepChange& changes) {
+int nmethodBucket::mark_dependent_nmethods(nmethodBucket* deps, DepChange& changes) {
assert_locked_or_safepoint(CodeCache_lock);
int found = 0;
- nmethodBucket* b = _dependencies;
- while (b != NULL) {
+ for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
nmethod* nm = b->get_nmethod();
// since dependencies aren't removed until an nmethod becomes a zombie,
// the dependency list may contain nmethods which aren't alive.
@@ -1842,7 +1833,6 @@
if (TraceDependencies) {
ResourceMark rm;
tty->print_cr("Marked for deoptimization");
- tty->print_cr(" context = %s", this->external_name());
changes.print();
nm->print();
nm->print_dependencies();
@@ -1850,36 +1840,119 @@
nm->mark_for_deoptimization();
found++;
}
- b = b->next();
}
return found;
}
+//
+// Add an nmethodBucket to the list of dependencies for this nmethod.
+// It's possible that an nmethod has multiple dependencies on this klass
+// so a count is kept for each bucket to guarantee that creation and
+// deletion of dependencies is consistent. Returns new head of the list.
+//
+nmethodBucket* nmethodBucket::add_dependent_nmethod(nmethodBucket* deps, nmethod* nm) {
+ assert_locked_or_safepoint(CodeCache_lock);
+ for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+ if (nm == b->get_nmethod()) {
+ b->increment();
+ return deps;
+ }
+ }
+ return new nmethodBucket(nm, deps);
+}
+
+//
+// Decrement count of the nmethod in the dependency list and remove
+// the bucket completely when the count goes to 0. This method must
+// find a corresponding bucket otherwise there's a bug in the
+// recording of dependencies. Returns true if the bucket is ready for reclamation.
+//
+bool nmethodBucket::remove_dependent_nmethod(nmethodBucket* deps, nmethod* nm) {
+ assert_locked_or_safepoint(CodeCache_lock);
+
+ for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+ if (nm == b->get_nmethod()) {
+ int val = b->decrement();
+ guarantee(val >= 0, err_msg("Underflow: %d", val));
+ return (val == 0);
+ }
+ }
+#ifdef ASSERT
+ tty->print_raw_cr("### can't find dependent nmethod");
+ nm->print();
+#endif // ASSERT
+ ShouldNotReachHere();
+ return false;
+}
+
+//
+// Reclaim all unused buckets. Returns new head of the list.
+//
+nmethodBucket* nmethodBucket::clean_dependent_nmethods(nmethodBucket* deps) {
+ nmethodBucket* first = deps;
+ nmethodBucket* last = NULL;
+ nmethodBucket* b = first;
+
+ while (b != NULL) {
+ assert(b->count() >= 0, err_msg("bucket count: %d", b->count()));
+ nmethodBucket* next = b->next();
+ if (b->count() == 0) {
+ if (last == NULL) {
+ first = next;
+ } else {
+ last->set_next(next);
+ }
+ delete b;
+ // last stays the same.
+ } else {
+ last = b;
+ }
+ b = next;
+ }
+ return first;
+}
+
+#ifndef PRODUCT
+void nmethodBucket::print_dependent_nmethods(nmethodBucket* deps, bool verbose) {
+ int idx = 0;
+ for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+ nmethod* nm = b->get_nmethod();
+ tty->print("[%d] count=%d { ", idx++, b->count());
+ if (!verbose) {
+ nm->print_on(tty, "nmethod");
+ tty->print_cr(" } ");
+ } else {
+ nm->print();
+ nm->print_dependencies();
+ tty->print_cr("--- } ");
+ }
+ }
+}
+
+bool nmethodBucket::is_dependent_nmethod(nmethodBucket* deps, nmethod* nm) {
+ for (nmethodBucket* b = deps; b != NULL; b = b->next()) {
+ if (nm == b->get_nmethod()) {
+#ifdef ASSERT
+ int count = b->count();
+ assert(count >= 0, err_msg("count shouldn't be negative: %d", count));
+#endif
+ return true;
+ }
+ }
+ return false;
+}
+#endif //PRODUCT
+
+int InstanceKlass::mark_dependent_nmethods(DepChange& changes) {
+ assert_locked_or_safepoint(CodeCache_lock);
+ return nmethodBucket::mark_dependent_nmethods(_dependencies, changes);
+}
+
void InstanceKlass::clean_dependent_nmethods() {
assert_locked_or_safepoint(CodeCache_lock);
if (has_unloaded_dependent()) {
- nmethodBucket* b = _dependencies;
- nmethodBucket* last = NULL;
- while (b != NULL) {
- assert(b->count() >= 0, err_msg("bucket count: %d", b->count()));
-
- nmethodBucket* next = b->next();
-
- if (b->count() == 0) {
- if (last == NULL) {
- _dependencies = next;
- } else {
- last->set_next(next);
- }
- delete b;
- // last stays the same.
- } else {
- last = b;
- }
-
- b = next;
- }
+ _dependencies = nmethodBucket::clean_dependent_nmethods(_dependencies);
set_has_unloaded_dependent(false);
}
#ifdef ASSERT
@@ -1893,90 +1966,26 @@
#endif
}
-//
-// Add an nmethodBucket to the list of dependencies for this nmethod.
-// It's possible that an nmethod has multiple dependencies on this klass
-// so a count is kept for each bucket to guarantee that creation and
-// deletion of dependencies is consistent.
-//
void InstanceKlass::add_dependent_nmethod(nmethod* nm) {
assert_locked_or_safepoint(CodeCache_lock);
- nmethodBucket* b = _dependencies;
- nmethodBucket* last = NULL;
- while (b != NULL) {
- if (nm == b->get_nmethod()) {
- b->increment();
- return;
- }
- b = b->next();
- }
- _dependencies = new nmethodBucket(nm, _dependencies);
+ _dependencies = nmethodBucket::add_dependent_nmethod(_dependencies, nm);
}
-
-//
-// Decrement count of the nmethod in the dependency list and remove
-// the bucket competely when the count goes to 0. This method must
-// find a corresponding bucket otherwise there's a bug in the
-// recording of dependecies.
-//
void InstanceKlass::remove_dependent_nmethod(nmethod* nm) {
assert_locked_or_safepoint(CodeCache_lock);
- nmethodBucket* b = _dependencies;
- nmethodBucket* last = NULL;
- while (b != NULL) {
- if (nm == b->get_nmethod()) {
- int val = b->decrement();
- guarantee(val >= 0, err_msg("Underflow: %d", val));
- if (val == 0) {
- set_has_unloaded_dependent(true);
- }
- return;
- }
- last = b;
- b = b->next();
+
+ if (nmethodBucket::remove_dependent_nmethod(_dependencies, nm)) {
+ set_has_unloaded_dependent(true);
}
-#ifdef ASSERT
- tty->print_cr("### %s can't find dependent nmethod:", this->external_name());
- nm->print();
-#endif // ASSERT
- ShouldNotReachHere();
}
-
#ifndef PRODUCT
void InstanceKlass::print_dependent_nmethods(bool verbose) {
- nmethodBucket* b = _dependencies;
- int idx = 0;
- while (b != NULL) {
- nmethod* nm = b->get_nmethod();
- tty->print("[%d] count=%d { ", idx++, b->count());
- if (!verbose) {
- nm->print_on(tty, "nmethod");
- tty->print_cr(" } ");
- } else {
- nm->print();
- nm->print_dependencies();
- tty->print_cr("--- } ");
- }
- b = b->next();
- }
+ nmethodBucket::print_dependent_nmethods(_dependencies, verbose);
}
-
bool InstanceKlass::is_dependent_nmethod(nmethod* nm) {
- nmethodBucket* b = _dependencies;
- while (b != NULL) {
- if (nm == b->get_nmethod()) {
-#ifdef ASSERT
- int count = b->count();
- assert(count >= 0, err_msg("count shouldn't be negative: %d", count));
-#endif
- return true;
- }
- b = b->next();
- }
- return false;
+ return nmethodBucket::is_dependent_nmethod(_dependencies, nm);
}
#endif //PRODUCT
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -1290,6 +1290,15 @@
nmethodBucket* next() { return _next; }
void set_next(nmethodBucket* b) { _next = b; }
nmethod* get_nmethod() { return _nmethod; }
+
+ static int mark_dependent_nmethods(nmethodBucket* deps, DepChange& changes);
+ static nmethodBucket* add_dependent_nmethod(nmethodBucket* deps, nmethod* nm);
+ static bool remove_dependent_nmethod(nmethodBucket* deps, nmethod* nm);
+ static nmethodBucket* clean_dependent_nmethods(nmethodBucket* deps);
+#ifndef PRODUCT
+ static void print_dependent_nmethods(nmethodBucket* deps, bool verbose);
+ static bool is_dependent_nmethod(nmethodBucket* deps, nmethod* nm);
+#endif //PRODUCT
};
// An iterator that's used to access the inner classes indices in the
--- a/hotspot/src/share/vm/oops/klassVtable.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1136,7 +1136,7 @@
if (m->has_itable_index()) {
// This search must match the runtime resolution, i.e. selection search for invokeinterface
// to correctly enforce loader constraints for interface method inheritance
- LinkResolver::lookup_instance_method_in_klasses(target, _klass, m->name(), m->signature(), CHECK);
+ target = LinkResolver::lookup_instance_method_in_klasses(_klass, m->name(), m->signature(), CHECK);
}
if (target == NULL || !target->is_public() || target->is_abstract()) {
// Entry does not resolve. Leave it empty for AbstractMethodError.
--- a/hotspot/src/share/vm/opto/arraycopynode.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/arraycopynode.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -599,10 +599,14 @@
}
bool ArrayCopyNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
- const TypeOopPtr* dest_t = phase->type(in(ArrayCopyNode::Dest))->is_oopptr();
+ Node* dest = in(ArrayCopyNode::Dest);
+ if (dest->is_top()) {
+ return false;
+ }
+ const TypeOopPtr* dest_t = phase->type(dest)->is_oopptr();
assert(!dest_t->is_known_instance() || _dest_type->is_known_instance(), "result of EA not recorded");
- const TypeOopPtr* src_t = phase->type(in(ArrayCopyNode::Src))->is_oopptr();
- assert(!src_t->is_known_instance() || _src_type->is_known_instance(), "result of EA not recorded");
+ assert(in(ArrayCopyNode::Src)->is_top() || !phase->type(in(ArrayCopyNode::Src))->is_oopptr()->is_known_instance() ||
+ _src_type->is_known_instance(), "result of EA not recorded");
if (_dest_type != TypeOopPtr::BOTTOM || t_oop->is_known_instance()) {
assert(_dest_type == TypeOopPtr::BOTTOM || _dest_type->is_known_instance(), "result of EA is known instance");
--- a/hotspot/src/share/vm/opto/c2_globals.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -665,6 +665,12 @@
product(bool, UseMultiplyToLenIntrinsic, false, \
"Enables intrinsification of BigInteger.multiplyToLen()") \
\
+ product(bool, UseSquareToLenIntrinsic, false, \
+ "Enables intrinsification of BigInteger.squareToLen()") \
+ \
+ product(bool, UseMulAddIntrinsic, false, \
+ "Enables intrinsification of BigInteger.mulAdd()") \
+ \
product(bool, UseTypeSpeculation, true, \
"Speculatively propagate types from profiles") \
\
--- a/hotspot/src/share/vm/opto/callnode.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/callnode.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1946,7 +1946,7 @@
}
}
}
- if (may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
+ if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
return true;
}
return false;
--- a/hotspot/src/share/vm/opto/escape.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/escape.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -972,7 +972,9 @@
strcmp(call->as_CallLeaf()->_name, "sha256_implCompressMB") == 0 ||
strcmp(call->as_CallLeaf()->_name, "sha512_implCompress") == 0 ||
strcmp(call->as_CallLeaf()->_name, "sha512_implCompressMB") == 0 ||
- strcmp(call->as_CallLeaf()->_name, "multiplyToLen") == 0)
+ strcmp(call->as_CallLeaf()->_name, "multiplyToLen") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "squareToLen") == 0 ||
+ strcmp(call->as_CallLeaf()->_name, "mulAdd") == 0)
))) {
call->dump();
fatal(err_msg_res("EA unexpected CallLeaf %s", call->as_CallLeaf()->_name));
--- a/hotspot/src/share/vm/opto/graphKit.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1457,18 +1457,18 @@
// factory methods in "int adr_idx"
Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
int adr_idx,
- MemNode::MemOrd mo, bool require_atomic_access) {
+ MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency, bool require_atomic_access) {
assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" );
const TypePtr* adr_type = NULL; // debug-mode-only argument
debug_only(adr_type = C->get_adr_type(adr_idx));
Node* mem = memory(adr_idx);
Node* ld;
if (require_atomic_access && bt == T_LONG) {
- ld = LoadLNode::make_atomic(ctl, mem, adr, adr_type, t, mo);
+ ld = LoadLNode::make_atomic(ctl, mem, adr, adr_type, t, mo, control_dependency);
} else if (require_atomic_access && bt == T_DOUBLE) {
- ld = LoadDNode::make_atomic(ctl, mem, adr, adr_type, t, mo);
+ ld = LoadDNode::make_atomic(ctl, mem, adr, adr_type, t, mo, control_dependency);
} else {
- ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo);
+ ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo, control_dependency);
}
ld = _gvn.transform(ld);
if ((bt == T_OBJECT) && C->do_escape_analysis() || C->eliminate_boxing()) {
--- a/hotspot/src/share/vm/opto/graphKit.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -512,21 +512,24 @@
// adapted the `do_put_xxx' and `do_get_xxx' procedures for the case
// of volatile fields.
Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
- MemNode::MemOrd mo, bool require_atomic_access = false) {
+ MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
+ bool require_atomic_access = false) {
// This version computes alias_index from bottom_type
return make_load(ctl, adr, t, bt, adr->bottom_type()->is_ptr(),
- mo, require_atomic_access);
+ mo, control_dependency, require_atomic_access);
}
Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, const TypePtr* adr_type,
- MemNode::MemOrd mo, bool require_atomic_access = false) {
+ MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
+ bool require_atomic_access = false) {
// This version computes alias_index from an address type
assert(adr_type != NULL, "use other make_load factory");
return make_load(ctl, adr, t, bt, C->get_alias_index(adr_type),
- mo, require_atomic_access);
+ mo, control_dependency, require_atomic_access);
}
// This is the base version which is given an alias index.
Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, int adr_idx,
- MemNode::MemOrd mo, bool require_atomic_access = false);
+ MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
+ bool require_atomic_access = false);
// Create & transform a StoreNode and store the effect into the
// parser's memory state.
--- a/hotspot/src/share/vm/opto/ifnode.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/ifnode.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -817,19 +817,78 @@
BoolTest::mask hi_test = this_bool->_test._test;
BoolTest::mask cond = hi_test;
+ // convert:
+ //
+ // dom_bool = x {<,<=,>,>=} a
+ // / \
+ // proj = {True,False} / \ otherproj = {False,True}
+ // /
+ // this_bool = x {<,<=} b
+ // / \
+ // fail = {True,False} / \ success = {False,True}
+ // /
+ //
+ // (Second test guaranteed canonicalized, first one may not have
+ // been canonicalized yet)
+ //
+ // into:
+ //
+ // cond = (x - lo) {<u,<=u,>u,>=u} adjusted_lim
+ // / \
+ // fail / \ success
+ // /
+ //
+
// Figure out which of the two tests sets the upper bound and which
// sets the lower bound if any.
+ Node* adjusted_lim = NULL;
if (hi_type->_lo > lo_type->_hi && hi_type->_hi == max_jint && lo_type->_lo == min_jint) {
-
assert((dom_bool->_test.is_less() && !proj->_con) ||
(dom_bool->_test.is_greater() && proj->_con), "incorrect test");
// this test was canonicalized
assert(this_bool->_test.is_less() && fail->_con, "incorrect test");
+ // this_bool = <
+ // dom_bool = >= (proj = True) or dom_bool = < (proj = False)
+ // x in [a, b[ on the fail (= True) projection, b > a-1 (because of hi_type->_lo > lo_type->_hi test above):
+ // lo = a, hi = b, adjusted_lim = b-a, cond = <u
+ // dom_bool = > (proj = True) or dom_bool = <= (proj = False)
+ // x in ]a, b[ on the fail (= True) projection, b > a:
+ // lo = a+1, hi = b, adjusted_lim = b-a-1, cond = <u
+ // this_bool = <=
+ // dom_bool = >= (proj = True) or dom_bool = < (proj = False)
+ // x in [a, b] on the fail (= True) projection, b+1 > a-1:
+ // lo = a, hi = b, adjusted_lim = b-a, cond = <=u
+ // dom_bool = > (proj = True) or dom_bool = <= (proj = False)
+ // x in ]a, b] on the fail (= True) projection b+1 > a:
+ // lo = a+1, hi = b, adjusted_lim = b-a, cond = <u
+ // lo = a+1, hi = b, adjusted_lim = b-a-1, cond = <=u doesn't work because a = b is possible, then hi-lo = -1
+
if (lo_test == BoolTest::gt || lo_test == BoolTest::le) {
+ if (hi_test == BoolTest::le) {
+ adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ cond = BoolTest::lt;
+ }
lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
}
} else if (lo_type->_lo > hi_type->_hi && lo_type->_hi == max_jint && hi_type->_lo == min_jint) {
+
+ // this_bool = <
+ // dom_bool = < (proj = True) or dom_bool = >= (proj = False)
+ // x in [b, a[ on the fail (= False) projection, a > b-1 (because of lo_type->_lo > hi_type->_hi above):
+ // lo = b, hi = a, adjusted_lim = a-b, cond = >=u
+ // dom_bool = <= (proj = True) or dom_bool = > (proj = False)
+ // x in [b, a] on the fail (= False) projection, a+1 > b-1:
+ // lo = b, hi = a, adjusted_lim = a-b, cond = >u
+ // this_bool = <=
+ // dom_bool = < (proj = True) or dom_bool = >= (proj = False)
+ // x in ]b, a[ on the fail (= False) projection, a > b:
+ // lo = b+1, hi = a, adjusted_lim = a-b-1, cond = >=u
+ // dom_bool = <= (proj = True) or dom_bool = > (proj = False)
+ // x in ]b, a] on the fail (= False) projection, a+1 > b:
+ // lo = b+1, hi = a, adjusted_lim = a-b, cond = >=u
+ // lo = b+1, hi = a, adjusted_lim = a-b-1, cond = >u doesn't work because a = b is possible, then hi-lo = -1
+
swap(lo, hi);
swap(lo_type, hi_type);
swap(lo_test, hi_test);
@@ -842,6 +901,10 @@
cond = (hi_test == BoolTest::le || hi_test == BoolTest::gt) ? BoolTest::gt : BoolTest::ge;
if (lo_test == BoolTest::le) {
+ if (cond == BoolTest::gt) {
+ adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ cond = BoolTest::ge;
+ }
lo = igvn->transform(new AddINode(lo, igvn->intcon(1)));
}
@@ -860,7 +923,6 @@
}
}
}
-
lo = NULL;
hi = NULL;
}
@@ -868,12 +930,13 @@
if (lo && hi) {
// Merge the two compares into a single unsigned compare by building (CmpU (n - lo) (hi - lo))
Node* adjusted_val = igvn->transform(new SubINode(n, lo));
- Node* adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ if (adjusted_lim == NULL) {
+ adjusted_lim = igvn->transform(new SubINode(hi, lo));
+ }
Node* newcmp = igvn->transform(new CmpUNode(adjusted_val, adjusted_lim));
Node* newbool = igvn->transform(new BoolNode(newcmp, cond));
- igvn->is_IterGVN()->replace_input_of(dom_iff, 1, igvn->intcon(proj->_con));
- igvn->hash_delete(this);
+ igvn->replace_input_of(dom_iff, 1, igvn->intcon(proj->_con));
set_req(1, newbool);
return true;
--- a/hotspot/src/share/vm/opto/library_call.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/library_call.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -291,6 +291,8 @@
bool inline_updateBytesCRC32();
bool inline_updateByteBufferCRC32();
bool inline_multiplyToLen();
+ bool inline_squareToLen();
+ bool inline_mulAdd();
bool inline_profileBoolean();
bool inline_isCompileConstant();
@@ -494,6 +496,14 @@
if (!UseMultiplyToLenIntrinsic) return NULL;
break;
+ case vmIntrinsics::_squareToLen:
+ if (!UseSquareToLenIntrinsic) return NULL;
+ break;
+
+ case vmIntrinsics::_mulAdd:
+ if (!UseMulAddIntrinsic) return NULL;
+ break;
+
case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
if (!UseAESIntrinsics) return NULL;
@@ -913,6 +923,12 @@
case vmIntrinsics::_multiplyToLen:
return inline_multiplyToLen();
+ case vmIntrinsics::_squareToLen:
+ return inline_squareToLen();
+
+ case vmIntrinsics::_mulAdd:
+ return inline_mulAdd();
+
case vmIntrinsics::_encodeISOArray:
return inline_encodeISOArray();
@@ -2631,7 +2647,9 @@
if (!is_store) {
MemNode::MemOrd mo = is_volatile ? MemNode::acquire : MemNode::unordered;
- Node* p = make_load(control(), adr, value_type, type, adr_type, mo, is_volatile);
+ // To be valid, unsafe loads may depend on other conditions than
+ // the one that guards them: pin the Load node
+ Node* p = make_load(control(), adr, value_type, type, adr_type, mo, LoadNode::Pinned, is_volatile);
// load value
switch (type) {
case T_BOOLEAN:
@@ -5304,6 +5322,100 @@
return true;
}
+//-------------inline_squareToLen------------------------------------
+bool LibraryCallKit::inline_squareToLen() {
+ assert(UseSquareToLenIntrinsic, "not implementated on this platform");
+
+ address stubAddr = StubRoutines::squareToLen();
+ if (stubAddr == NULL) {
+ return false; // Intrinsic's stub is not implemented on this platform
+ }
+ const char* stubName = "squareToLen";
+
+ assert(callee()->signature()->size() == 4, "implSquareToLen has 4 parameters");
+
+ Node* x = argument(0);
+ Node* len = argument(1);
+ Node* z = argument(2);
+ Node* zlen = argument(3);
+
+ const Type* x_type = x->Value(&_gvn);
+ const Type* z_type = z->Value(&_gvn);
+ const TypeAryPtr* top_x = x_type->isa_aryptr();
+ const TypeAryPtr* top_z = z_type->isa_aryptr();
+ if (top_x == NULL || top_x->klass() == NULL ||
+ top_z == NULL || top_z->klass() == NULL) {
+ // failed array check
+ return false;
+ }
+
+ BasicType x_elem = x_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ BasicType z_elem = z_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ if (x_elem != T_INT || z_elem != T_INT) {
+ return false;
+ }
+
+
+ Node* x_start = array_element_address(x, intcon(0), x_elem);
+ Node* z_start = array_element_address(z, intcon(0), z_elem);
+
+ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
+ OptoRuntime::squareToLen_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ x_start, len, z_start, zlen);
+
+ set_result(z);
+ return true;
+}
+
+//-------------inline_mulAdd------------------------------------------
+bool LibraryCallKit::inline_mulAdd() {
+ assert(UseMulAddIntrinsic, "not implementated on this platform");
+
+ address stubAddr = StubRoutines::mulAdd();
+ if (stubAddr == NULL) {
+ return false; // Intrinsic's stub is not implemented on this platform
+ }
+ const char* stubName = "mulAdd";
+
+ assert(callee()->signature()->size() == 5, "mulAdd has 5 parameters");
+
+ Node* out = argument(0);
+ Node* in = argument(1);
+ Node* offset = argument(2);
+ Node* len = argument(3);
+ Node* k = argument(4);
+
+ const Type* out_type = out->Value(&_gvn);
+ const Type* in_type = in->Value(&_gvn);
+ const TypeAryPtr* top_out = out_type->isa_aryptr();
+ const TypeAryPtr* top_in = in_type->isa_aryptr();
+ if (top_out == NULL || top_out->klass() == NULL ||
+ top_in == NULL || top_in->klass() == NULL) {
+ // failed array check
+ return false;
+ }
+
+ BasicType out_elem = out_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ BasicType in_elem = in_type->isa_aryptr()->klass()->as_array_klass()->element_type()->basic_type();
+ if (out_elem != T_INT || in_elem != T_INT) {
+ return false;
+ }
+
+ Node* outlen = load_array_length(out);
+ Node* new_offset = _gvn.transform(new SubINode(outlen, offset));
+ Node* out_start = array_element_address(out, intcon(0), out_elem);
+ Node* in_start = array_element_address(in, intcon(0), in_elem);
+
+ Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
+ OptoRuntime::mulAdd_Type(),
+ stubAddr, stubName, TypePtr::BOTTOM,
+ out_start,in_start, new_offset, len, k);
+ Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
+ set_result(result);
+ return true;
+}
+
/**
* Calculate CRC32 for byte.
@@ -5488,7 +5600,7 @@
}
// Build the load.
MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered;
- Node* loadedField = make_load(NULL, adr, type, bt, adr_type, mo, is_vol);
+ Node* loadedField = make_load(NULL, adr, type, bt, adr_type, mo, LoadNode::DependsOnlyOnTest, is_vol);
// If reference is volatile, prevent following memory ops from
// floating up past the volatile read. Also prevents commoning
// another volatile read.
--- a/hotspot/src/share/vm/opto/loopPredicate.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -437,7 +437,13 @@
}
}
if (all_inputs_invariant) {
- _invariant.set(n->_idx); // I am a invariant too
+ // If n's control is a predicate that was moved out of the
+ // loop, it was marked invariant but n is only invariant if
+ // it depends only on that test. Otherwise, unless that test
+ // is out of the loop, it's not invariant.
+ if (n->is_CFG() || n->depends_only_on_test() || n->in(0) == NULL || !_phase->is_member(_lpt, n->in(0))) {
+ _invariant.set(n->_idx); // I am a invariant too
+ }
}
} else { // process next input
_stack.set_index(idx + 1);
--- a/hotspot/src/share/vm/opto/loopTransform.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -475,7 +475,7 @@
C->set_major_progress();
// Peeling a 'main' loop in a pre/main/post situation obfuscates the
- // 'pre' loop from the main and the 'pre' can no longer have it's
+ // 'pre' loop from the main and the 'pre' can no longer have its
// iterations adjusted. Therefore, we need to declare this loop as
// no longer a 'main' loop; it will need new pre and post loops before
// we can do further RCE.
@@ -1582,13 +1582,36 @@
if (opc != ReductionNode::opcode(opc, def_node->bottom_type()->basic_type())) {
if (!def_node->is_reduction()) { // Not marked yet
// To be a reduction, the arithmetic node must have the phi as input and provide a def to it
+ bool ok = false;
for (unsigned j = 1; j < def_node->req(); j++) {
Node* in = def_node->in(j);
if (in == phi) {
- def_node->add_flag(Node::Flag_is_reduction);
+ ok = true;
break;
}
}
+
+ // do nothing if we did not match the initial criteria
+ if (ok == false) {
+ continue;
+ }
+
+ // The result of the reduction must not be used in the loop
+ for (DUIterator_Fast imax, i = def_node->fast_outs(imax); i < imax && ok; i++) {
+ Node* u = def_node->fast_out(i);
+ if (has_ctrl(u) && !loop->is_member(get_loop(get_ctrl(u)))) {
+ continue;
+ }
+ if (u == phi) {
+ continue;
+ }
+ ok = false;
+ }
+
+ // iff the uses conform
+ if (ok) {
+ def_node->add_flag(Node::Flag_is_reduction);
+ }
}
}
}
@@ -1888,10 +1911,13 @@
return;
assert(opqzm->in(1) == main_limit, "do not understand situation");
- // Find the pre-loop limit; we will expand it's iterations to
+ // Find the pre-loop limit; we will expand its iterations to
// not ever trip low tests.
Node *p_f = iffm->in(0);
- assert(p_f->Opcode() == Op_IfFalse, "");
+ // pre loop may have been optimized out
+ if (p_f->Opcode() != Op_IfFalse) {
+ return;
+ }
CountedLoopEndNode *pre_end = p_f->in(0)->as_CountedLoopEnd();
assert(pre_end->loopnode()->is_pre_loop(), "");
Node *pre_opaq1 = pre_end->limit();
@@ -2192,6 +2218,56 @@
}
}
+#ifdef ASSERT
+static CountedLoopNode* locate_pre_from_main(CountedLoopNode *cl) {
+ Node *ctrl = cl->in(LoopNode::EntryControl);
+ assert(ctrl->Opcode() == Op_IfTrue || ctrl->Opcode() == Op_IfFalse, "");
+ Node *iffm = ctrl->in(0);
+ assert(iffm->Opcode() == Op_If, "");
+ Node *p_f = iffm->in(0);
+ assert(p_f->Opcode() == Op_IfFalse, "");
+ CountedLoopEndNode *pre_end = p_f->in(0)->as_CountedLoopEnd();
+ assert(pre_end->loopnode()->is_pre_loop(), "");
+ return pre_end->loopnode();
+}
+#endif
+
+// Remove the main and post loops and make the pre loop execute all
+// iterations. Useful when the pre loop is found empty.
+void IdealLoopTree::remove_main_post_loops(CountedLoopNode *cl, PhaseIdealLoop *phase) {
+ CountedLoopEndNode* pre_end = cl->loopexit();
+ Node* pre_cmp = pre_end->cmp_node();
+ if (pre_cmp->in(2)->Opcode() != Op_Opaque1) {
+ // Only safe to remove the main loop if the compiler optimized it
+ // out based on an unknown number of iterations
+ return;
+ }
+
+ // Can we find the main loop?
+ if (_next == NULL) {
+ return;
+ }
+
+ Node* next_head = _next->_head;
+ if (!next_head->is_CountedLoop()) {
+ return;
+ }
+
+ CountedLoopNode* main_head = next_head->as_CountedLoop();
+ if (!main_head->is_main_loop()) {
+ return;
+ }
+
+ assert(locate_pre_from_main(main_head) == cl, "bad main loop");
+ Node* main_iff = main_head->in(LoopNode::EntryControl)->in(0);
+
+ // Remove the Opaque1Node of the pre loop and make it execute all iterations
+ phase->_igvn.replace_input_of(pre_cmp, 2, pre_cmp->in(2)->in(2));
+ // Remove the Opaque1Node of the main loop so it can be optimized out
+ Node* main_cmp = main_iff->in(1)->in(1);
+ assert(main_cmp->in(2)->Opcode() == Op_Opaque1, "main loop has no opaque node?");
+ phase->_igvn.replace_input_of(main_cmp, 2, main_cmp->in(2)->in(1));
+}
//------------------------------policy_do_remove_empty_loop--------------------
// Micro-benchmark spamming. Policy is to always remove empty loops.
@@ -2210,6 +2286,12 @@
if (!phase->is_member(this, phase->get_ctrl(cl->loopexit()->in(CountedLoopEndNode::TestValue))))
return false; // Infinite loop
+ if (cl->is_pre_loop()) {
+ // If the loop we are removing is a pre-loop then the main and
+ // post loop can be removed as well
+ remove_main_post_loops(cl, phase);
+ }
+
#ifdef ASSERT
// Ensure only one phi which is the iv.
Node* iv = NULL;
--- a/hotspot/src/share/vm/opto/loopnode.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/loopnode.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -485,6 +485,8 @@
bool is_inner() { return is_loop() && _child == NULL; }
bool is_counted() { return is_loop() && _head != NULL && _head->is_CountedLoop(); }
+ void remove_main_post_loops(CountedLoopNode *cl, PhaseIdealLoop *phase);
+
#ifndef PRODUCT
void dump_head( ) const; // Dump loop head only
void dump() const; // Dump this loop recursively
--- a/hotspot/src/share/vm/opto/loopopts.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -718,7 +718,7 @@
}
// Use same limit as split_if_with_blocks_post
- if( C->unique() > 35000 ) return n; // Method too big
+ if( C->live_nodes() > 35000 ) return n; // Method too big
// Split 'n' through the merge point if it is profitable
Node *phi = split_thru_phi( n, n_blk, policy );
@@ -802,7 +802,7 @@
// Cloning Cmp through Phi's involves the split-if transform.
// FastLock is not used by an If
if( n->is_Cmp() && !n->is_FastLock() ) {
- if( C->unique() > 35000 ) return; // Method too big
+ if( C->live_nodes() > 35000 ) return; // Method too big
// Do not do 'split-if' if irreducible loops are present.
if( _has_irreducible_loops )
--- a/hotspot/src/share/vm/opto/matcher.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/matcher.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -844,7 +844,7 @@
MachNode *spillCP = match_tree(new LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
#endif
MachNode *spillI = match_tree(new LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
- MachNode *spillL = match_tree(new LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false));
+ MachNode *spillL = match_tree(new LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered, LoadNode::DependsOnlyOnTest, false));
MachNode *spillF = match_tree(new LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
MachNode *spillD = match_tree(new LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
MachNode *spillP = match_tree(new LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
--- a/hotspot/src/share/vm/opto/memnode.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/memnode.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -784,6 +784,9 @@
// standard dump does this in Verbose and WizardMode
st->print(" #"); _type->dump_on(st);
}
+ if (!_depends_only_on_test) {
+ st->print(" (does not depend only on test)");
+ }
}
#endif
@@ -800,7 +803,7 @@
//----------------------------LoadNode::make-----------------------------------
// Polymorphic factory method:
-Node *LoadNode::make(PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypePtr* adr_type, const Type *rt, BasicType bt, MemOrd mo) {
+Node *LoadNode::make(PhaseGVN& gvn, Node *ctl, Node *mem, Node *adr, const TypePtr* adr_type, const Type *rt, BasicType bt, MemOrd mo, ControlDependency control_dependency) {
Compile* C = gvn.C;
// sanity check the alias category against the created node type
@@ -816,39 +819,39 @@
rt->isa_oopptr() || is_immutable_value(adr),
"raw memory operations should have control edge");
switch (bt) {
- case T_BOOLEAN: return new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_BYTE: return new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_INT: return new LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_CHAR: return new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_SHORT: return new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo);
- case T_LONG: return new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo);
- case T_FLOAT: return new LoadFNode (ctl, mem, adr, adr_type, rt, mo);
- case T_DOUBLE: return new LoadDNode (ctl, mem, adr, adr_type, rt, mo);
- case T_ADDRESS: return new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo);
+ case T_BOOLEAN: return new LoadUBNode(ctl, mem, adr, adr_type, rt->is_int(), mo, control_dependency);
+ case T_BYTE: return new LoadBNode (ctl, mem, adr, adr_type, rt->is_int(), mo, control_dependency);
+ case T_INT: return new LoadINode (ctl, mem, adr, adr_type, rt->is_int(), mo, control_dependency);
+ case T_CHAR: return new LoadUSNode(ctl, mem, adr, adr_type, rt->is_int(), mo, control_dependency);
+ case T_SHORT: return new LoadSNode (ctl, mem, adr, adr_type, rt->is_int(), mo, control_dependency);
+ case T_LONG: return new LoadLNode (ctl, mem, adr, adr_type, rt->is_long(), mo, control_dependency);
+ case T_FLOAT: return new LoadFNode (ctl, mem, adr, adr_type, rt, mo, control_dependency);
+ case T_DOUBLE: return new LoadDNode (ctl, mem, adr, adr_type, rt, mo, control_dependency);
+ case T_ADDRESS: return new LoadPNode (ctl, mem, adr, adr_type, rt->is_ptr(), mo, control_dependency);
case T_OBJECT:
#ifdef _LP64
if (adr->bottom_type()->is_ptr_to_narrowoop()) {
- Node* load = gvn.transform(new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo));
+ Node* load = gvn.transform(new LoadNNode(ctl, mem, adr, adr_type, rt->make_narrowoop(), mo, control_dependency));
return new DecodeNNode(load, load->bottom_type()->make_ptr());
} else
#endif
{
assert(!adr->bottom_type()->is_ptr_to_narrowoop() && !adr->bottom_type()->is_ptr_to_narrowklass(), "should have got back a narrow oop");
- return new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo);
+ return new LoadPNode(ctl, mem, adr, adr_type, rt->is_oopptr(), mo, control_dependency);
}
}
ShouldNotReachHere();
return (LoadNode*)NULL;
}
-LoadLNode* LoadLNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
+LoadLNode* LoadLNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo, ControlDependency control_dependency) {
bool require_atomic = true;
- return new LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, require_atomic);
+ return new LoadLNode(ctl, mem, adr, adr_type, rt->is_long(), mo, control_dependency, require_atomic);
}
-LoadDNode* LoadDNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo) {
+LoadDNode* LoadDNode::make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type, const Type* rt, MemOrd mo, ControlDependency control_dependency) {
bool require_atomic = true;
- return new LoadDNode(ctl, mem, adr, adr_type, rt, mo, require_atomic);
+ return new LoadDNode(ctl, mem, adr, adr_type, rt, mo, control_dependency, require_atomic);
}
--- a/hotspot/src/share/vm/opto/memnode.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/memnode.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -137,7 +137,33 @@
//------------------------------LoadNode---------------------------------------
// Load value; requires Memory and Address
class LoadNode : public MemNode {
+public:
+ // Some loads (from unsafe) should be pinned: they don't depend only
+ // on the dominating test. The boolean field _depends_only_on_test
+ // below records whether that node depends only on the dominating
+ // test.
+ // Methods used to build LoadNodes pass an argument of type enum
+ // ControlDependency instead of a boolean because those methods
+ // typically have multiple boolean parameters with default values:
+ // passing the wrong boolean to one of these parameters by mistake
+ // goes easily unnoticed. Using an enum, the compiler can check that
+ // the type of a value and the type of the parameter match.
+ enum ControlDependency {
+ Pinned,
+ DependsOnlyOnTest
+ };
private:
+ // LoadNode::hash() doesn't take the _depends_only_on_test field
+ // into account: If the graph already has a non-pinned LoadNode and
+ // we add a pinned LoadNode with the same inputs, it's safe for GVN
+ // to replace the pinned LoadNode with the non-pinned LoadNode,
+ // otherwise it wouldn't be safe to have a non pinned LoadNode with
+ // those inputs in the first place. If the graph already has a
+ // pinned LoadNode and we add a non pinned LoadNode with the same
+ // inputs, it's safe (but suboptimal) for GVN to replace the
+ // non-pinned LoadNode by the pinned LoadNode.
+ bool _depends_only_on_test;
+
// On platforms with weak memory ordering (e.g., PPC, Ia64) we distinguish
// loads that can be reordered, and such requiring acquire semantics to
// adhere to the Java specification. The required behaviour is stored in
@@ -154,8 +180,8 @@
virtual Node* find_previous_arraycopy(PhaseTransform* phase, Node* ld_alloc, Node*& mem, bool can_see_stored_value) const;
public:
- LoadNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, MemOrd mo)
- : MemNode(c,mem,adr,at), _type(rt), _mo(mo) {
+ LoadNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *rt, MemOrd mo, ControlDependency control_dependency)
+ : MemNode(c,mem,adr,at), _type(rt), _mo(mo), _depends_only_on_test(control_dependency == DependsOnlyOnTest) {
init_class_id(Class_Load);
}
inline bool is_unordered() const { return !is_acquire(); }
@@ -166,7 +192,8 @@
// Polymorphic factory method:
static Node* make(PhaseGVN& gvn, Node *c, Node *mem, Node *adr,
- const TypePtr* at, const Type *rt, BasicType bt, MemOrd mo);
+ const TypePtr* at, const Type *rt, BasicType bt,
+ MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest);
virtual uint hash() const; // Check the type
@@ -234,16 +261,15 @@
// which produce results (new raw memory state) inside of loops preventing all
// manner of other optimizations). Basically, it's ugly but so is the alternative.
// See comment in macro.cpp, around line 125 expand_allocate_common().
- virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM; }
-
+ virtual bool depends_only_on_test() const { return adr_type() != TypeRawPtr::BOTTOM && _depends_only_on_test; }
};
//------------------------------LoadBNode--------------------------------------
// Load a byte (8bits signed) from memory
class LoadBNode : public LoadNode {
public:
- LoadBNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
- : LoadNode(c, mem, adr, at, ti, mo) {}
+ LoadBNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegI; }
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -256,8 +282,8 @@
// Load a unsigned byte (8bits unsigned) from memory
class LoadUBNode : public LoadNode {
public:
- LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti, MemOrd mo)
- : LoadNode(c, mem, adr, at, ti, mo) {}
+ LoadUBNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeInt* ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegI; }
virtual Node* Ideal(PhaseGVN *phase, bool can_reshape);
@@ -270,8 +296,8 @@
// Load an unsigned short/char (16bits unsigned) from memory
class LoadUSNode : public LoadNode {
public:
- LoadUSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
- : LoadNode(c, mem, adr, at, ti, mo) {}
+ LoadUSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegI; }
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -284,8 +310,8 @@
// Load a short (16bits signed) from memory
class LoadSNode : public LoadNode {
public:
- LoadSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
- : LoadNode(c, mem, adr, at, ti, mo) {}
+ LoadSNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegI; }
virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
@@ -298,8 +324,8 @@
// Load an integer from memory
class LoadINode : public LoadNode {
public:
- LoadINode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo)
- : LoadNode(c, mem, adr, at, ti, mo) {}
+ LoadINode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeInt *ti, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, ti, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegI; }
virtual int store_Opcode() const { return Op_StoreI; }
@@ -331,15 +357,15 @@
public:
LoadLNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const TypeLong *tl,
- MemOrd mo, bool require_atomic_access = false)
- : LoadNode(c, mem, adr, at, tl, mo), _require_atomic_access(require_atomic_access) {}
+ MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest, bool require_atomic_access = false)
+ : LoadNode(c, mem, adr, at, tl, mo, control_dependency), _require_atomic_access(require_atomic_access) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegL; }
virtual int store_Opcode() const { return Op_StoreL; }
virtual BasicType memory_type() const { return T_LONG; }
bool require_atomic_access() const { return _require_atomic_access; }
static LoadLNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type,
- const Type* rt, MemOrd mo);
+ const Type* rt, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest);
#ifndef PRODUCT
virtual void dump_spec(outputStream *st) const {
LoadNode::dump_spec(st);
@@ -352,8 +378,8 @@
// Load a long from unaligned memory
class LoadL_unalignedNode : public LoadLNode {
public:
- LoadL_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo)
- : LoadLNode(c, mem, adr, at, TypeLong::LONG, mo) {}
+ LoadL_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadLNode(c, mem, adr, at, TypeLong::LONG, mo, control_dependency) {}
virtual int Opcode() const;
};
@@ -361,8 +387,8 @@
// Load a float (64 bits) from memory
class LoadFNode : public LoadNode {
public:
- LoadFNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo)
- : LoadNode(c, mem, adr, at, t, mo) {}
+ LoadFNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, t, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegF; }
virtual int store_Opcode() const { return Op_StoreF; }
@@ -382,15 +408,15 @@
public:
LoadDNode(Node *c, Node *mem, Node *adr, const TypePtr* at, const Type *t,
- MemOrd mo, bool require_atomic_access = false)
- : LoadNode(c, mem, adr, at, t, mo), _require_atomic_access(require_atomic_access) {}
+ MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest, bool require_atomic_access = false)
+ : LoadNode(c, mem, adr, at, t, mo, control_dependency), _require_atomic_access(require_atomic_access) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegD; }
virtual int store_Opcode() const { return Op_StoreD; }
virtual BasicType memory_type() const { return T_DOUBLE; }
bool require_atomic_access() const { return _require_atomic_access; }
static LoadDNode* make_atomic(Node* ctl, Node* mem, Node* adr, const TypePtr* adr_type,
- const Type* rt, MemOrd mo);
+ const Type* rt, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest);
#ifndef PRODUCT
virtual void dump_spec(outputStream *st) const {
LoadNode::dump_spec(st);
@@ -403,8 +429,8 @@
// Load a double from unaligned memory
class LoadD_unalignedNode : public LoadDNode {
public:
- LoadD_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo)
- : LoadDNode(c, mem, adr, at, Type::DOUBLE, mo) {}
+ LoadD_unalignedNode(Node *c, Node *mem, Node *adr, const TypePtr* at, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadDNode(c, mem, adr, at, Type::DOUBLE, mo, control_dependency) {}
virtual int Opcode() const;
};
@@ -412,8 +438,8 @@
// Load a pointer from memory (either object or array)
class LoadPNode : public LoadNode {
public:
- LoadPNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t, MemOrd mo)
- : LoadNode(c, mem, adr, at, t, mo) {}
+ LoadPNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const TypePtr* t, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, t, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegP; }
virtual int store_Opcode() const { return Op_StoreP; }
@@ -425,8 +451,8 @@
// Load a narrow oop from memory (either object or array)
class LoadNNode : public LoadNode {
public:
- LoadNNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t, MemOrd mo)
- : LoadNode(c, mem, adr, at, t, mo) {}
+ LoadNNode(Node *c, Node *mem, Node *adr, const TypePtr *at, const Type* t, MemOrd mo, ControlDependency control_dependency = DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, t, mo, control_dependency) {}
virtual int Opcode() const;
virtual uint ideal_reg() const { return Op_RegN; }
virtual int store_Opcode() const { return Op_StoreN; }
--- a/hotspot/src/share/vm/opto/parse3.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/parse3.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -235,7 +235,7 @@
//
MemNode::MemOrd mo = is_vol ? MemNode::acquire : MemNode::unordered;
bool needs_atomic_access = is_vol || AlwaysAtomicAccesses;
- Node* ld = make_load(NULL, adr, type, bt, adr_type, mo, needs_atomic_access);
+ Node* ld = make_load(NULL, adr, type, bt, adr_type, mo, LoadNode::DependsOnlyOnTest, needs_atomic_access);
// Adjust Java stack
if (type2size[bt] == 1)
--- a/hotspot/src/share/vm/opto/phaseX.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/phaseX.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1573,11 +1573,12 @@
set_type(n, t);
for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) {
Node* m = n->fast_out(i); // Get user
- if( m->is_Region() ) { // New path to Region? Must recheck Phis too
+ if (m->is_Region()) { // New path to Region? Must recheck Phis too
for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) {
Node* p = m->fast_out(i2); // Propagate changes to uses
- if( p->bottom_type() != type(p) ) // If not already bottomed out
+ if (p->bottom_type() != type(p)) { // If not already bottomed out
worklist.push(p); // Propagate change to user
+ }
}
}
// If we changed the receiver type to a call, we need to revisit
@@ -1587,12 +1588,31 @@
if (m->is_Call()) {
for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) {
Node* p = m->fast_out(i2); // Propagate changes to uses
- if (p->is_Proj() && p->as_Proj()->_con == TypeFunc::Control && p->outcnt() == 1)
+ if (p->is_Proj() && p->as_Proj()->_con == TypeFunc::Control && p->outcnt() == 1) {
worklist.push(p->unique_out());
+ }
}
}
- if( m->bottom_type() != type(m) ) // If not already bottomed out
+ if (m->bottom_type() != type(m)) { // If not already bottomed out
worklist.push(m); // Propagate change to user
+ }
+
+ // CmpU nodes can get their type information from two nodes up in the
+ // graph (instead of from the nodes immediately above). Make sure they
+ // are added to the worklist if nodes they depend on are updated, since
+ // they could be missed and get wrong types otherwise.
+ uint m_op = m->Opcode();
+ if (m_op == Op_AddI || m_op == Op_SubI) {
+ for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) {
+ Node* p = m->fast_out(i2); // Propagate changes to uses
+ if (p->Opcode() == Op_CmpU) {
+ // Got a CmpU which might need the new type information from node n.
+ if(p->bottom_type() != type(p)) { // If not already bottomed out
+ worklist.push(p); // Propagate change to user
+ }
+ }
+ }
+ }
}
}
}
--- a/hotspot/src/share/vm/opto/runtime.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/runtime.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -945,6 +945,48 @@
return TypeFunc::make(domain, range);
}
+const TypeFunc* OptoRuntime::squareToLen_Type() {
+ // create input type (domain)
+ int num_args = 4;
+ int argcnt = num_args;
+ const Type** fields = TypeTuple::fields(argcnt);
+ int argp = TypeFunc::Parms;
+ fields[argp++] = TypePtr::NOTNULL; // x
+ fields[argp++] = TypeInt::INT; // len
+ fields[argp++] = TypePtr::NOTNULL; // z
+ fields[argp++] = TypeInt::INT; // zlen
+ assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
+ const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+ // no result type needed
+ fields = TypeTuple::fields(1);
+ fields[TypeFunc::Parms+0] = NULL;
+ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields);
+ return TypeFunc::make(domain, range);
+}
+
+// for mulAdd calls, 2 pointers and 3 ints, returning int
+const TypeFunc* OptoRuntime::mulAdd_Type() {
+ // create input type (domain)
+ int num_args = 5;
+ int argcnt = num_args;
+ const Type** fields = TypeTuple::fields(argcnt);
+ int argp = TypeFunc::Parms;
+ fields[argp++] = TypePtr::NOTNULL; // out
+ fields[argp++] = TypePtr::NOTNULL; // in
+ fields[argp++] = TypeInt::INT; // offset
+ fields[argp++] = TypeInt::INT; // len
+ fields[argp++] = TypeInt::INT; // k
+ assert(argp == TypeFunc::Parms+argcnt, "correct decoding");
+ const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields);
+
+ // returning carry (int)
+ fields = TypeTuple::fields(1);
+ fields[TypeFunc::Parms+0] = TypeInt::INT;
+ const TypeTuple* range = TypeTuple::make(TypeFunc::Parms+1, fields);
+ return TypeFunc::make(domain, range);
+}
+
//------------- Interpreter state access for on stack replacement
--- a/hotspot/src/share/vm/opto/runtime.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/runtime.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -312,6 +312,10 @@
static const TypeFunc* multiplyToLen_Type();
+ static const TypeFunc* squareToLen_Type();
+
+ static const TypeFunc* mulAdd_Type();
+
static const TypeFunc* updateBytesCRC32_Type();
// leaf on stack replacement interpreter accessor types
--- a/hotspot/src/share/vm/opto/superword.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/superword.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1631,7 +1631,7 @@
}
Node* adr = low_adr->in(MemNode::Address);
const TypePtr* atyp = n->adr_type();
- vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n));
+ vn = LoadVectorNode::make(opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n), control_dependency(p));
vlen_in_bytes = vn->as_LoadVector()->memory_size();
} else if (n->is_Store()) {
// Promote value to be stored to vector
@@ -2280,6 +2280,19 @@
return n;
}
+LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) {
+ LoadNode::ControlDependency dep = LoadNode::DependsOnlyOnTest;
+ for (uint i = 0; i < p->size(); i++) {
+ Node* n = p->at(i);
+ assert(n->is_Load(), "only meaningful for loads");
+ if (!n->depends_only_on_test()) {
+ dep = LoadNode::Pinned;
+ }
+ }
+ return dep;
+}
+
+
//----------------------------align_initial_loop_index---------------------------
// Adjust pre-loop limit so that in main loop, a load/store reference
// to align_to_ref will be a position zero in the vector.
--- a/hotspot/src/share/vm/opto/superword.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/superword.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -428,6 +428,7 @@
Node* executed_first(Node_List* p);
// Return the node executed last in pack p.
Node* executed_last(Node_List* p);
+ static LoadNode::ControlDependency control_dependency(Node_List* p);
// Alignment within a vector memory reference
int memory_alignment(MemNode* s, int iv_adjust);
// (Start, end] half-open range defining which operands are vector
--- a/hotspot/src/share/vm/opto/vectornode.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/vectornode.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -406,9 +406,11 @@
// Return the vector version of a scalar load node.
LoadVectorNode* LoadVectorNode::make(int opc, Node* ctl, Node* mem,
- Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {
+ Node* adr, const TypePtr* atyp,
+ uint vlen, BasicType bt,
+ ControlDependency control_dependency) {
const TypeVect* vt = TypeVect::make(bt, vlen);
- return new LoadVectorNode(ctl, mem, adr, atyp, vt);
+ return new LoadVectorNode(ctl, mem, adr, atyp, vt, control_dependency);
}
// Return the vector version of a scalar store node.
--- a/hotspot/src/share/vm/opto/vectornode.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/opto/vectornode.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -454,8 +454,8 @@
// Load Vector from memory
class LoadVectorNode : public LoadNode {
public:
- LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt)
- : LoadNode(c, mem, adr, at, vt, MemNode::unordered) {
+ LoadVectorNode(Node* c, Node* mem, Node* adr, const TypePtr* at, const TypeVect* vt, ControlDependency control_dependency = LoadNode::DependsOnlyOnTest)
+ : LoadNode(c, mem, adr, at, vt, MemNode::unordered, control_dependency) {
init_class_id(Class_LoadVector);
}
@@ -471,7 +471,9 @@
virtual int store_Opcode() const { return Op_StoreVector; }
static LoadVectorNode* make(int opc, Node* ctl, Node* mem,
- Node* adr, const TypePtr* atyp, uint vlen, BasicType bt);
+ Node* adr, const TypePtr* atyp,
+ uint vlen, BasicType bt,
+ ControlDependency control_dependency = LoadNode::DependsOnlyOnTest);
};
//------------------------------StoreVectorNode--------------------------------
--- a/hotspot/src/share/vm/prims/jni.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/prims/jni.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1126,39 +1126,32 @@
Method* m = Method::resolve_jmethod_id(method_id);
number_of_parameters = m->size_of_parameters();
Klass* holder = m->method_holder();
- if (!(holder)->is_interface()) {
+ if (call_type != JNI_VIRTUAL) {
+ selected_method = m;
+ } else if (!m->has_itable_index()) {
// non-interface call -- for that little speed boost, don't handlize
debug_only(No_Safepoint_Verifier nosafepoint;)
- if (call_type == JNI_VIRTUAL) {
- // jni_GetMethodID makes sure class is linked and initialized
- // so m should have a valid vtable index.
- assert(!m->has_itable_index(), "");
- int vtbl_index = m->vtable_index();
- if (vtbl_index != Method::nonvirtual_vtable_index) {
- Klass* k = h_recv->klass();
- // k might be an arrayKlassOop but all vtables start at
- // the same place. The cast is to avoid virtual call and assertion.
- InstanceKlass *ik = (InstanceKlass*)k;
- selected_method = ik->method_at_vtable(vtbl_index);
- } else {
- // final method
- selected_method = m;
- }
+ // jni_GetMethodID makes sure class is linked and initialized
+ // so m should have a valid vtable index.
+ assert(m->valid_vtable_index(), "no valid vtable index");
+ int vtbl_index = m->vtable_index();
+ if (vtbl_index != Method::nonvirtual_vtable_index) {
+ Klass* k = h_recv->klass();
+ // k might be an arrayKlassOop but all vtables start at
+ // the same place. The cast is to avoid virtual call and assertion.
+ InstanceKlass *ik = (InstanceKlass*)k;
+ selected_method = ik->method_at_vtable(vtbl_index);
} else {
- // JNI_NONVIRTUAL call
+ // final method
selected_method = m;
}
} else {
// interface call
KlassHandle h_holder(THREAD, holder);
- if (call_type == JNI_VIRTUAL) {
- int itbl_index = m->itable_index();
- Klass* k = h_recv->klass();
- selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
- } else {
- selected_method = m;
- }
+ int itbl_index = m->itable_index();
+ Klass* k = h_recv->klass();
+ selected_method = InstanceKlass::cast(k)->method_at_itable(h_holder(), itbl_index, CHECK);
}
}
--- a/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -842,7 +842,7 @@
// optimize to limit the number of times that java_sender() is called
javaVFrame *jvf_cursor = jvf;
javaVFrame *jvf_prev = NULL;
- javaVFrame *jvf_prev_prev;
+ javaVFrame *jvf_prev_prev = NULL;
int j = 0;
while (jvf_cursor != NULL) {
jvf_prev_prev = jvf_prev;
--- a/hotspot/src/share/vm/prims/methodHandles.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -677,24 +677,24 @@
case IS_METHOD:
{
CallInfo result;
+ LinkInfo link_info(defc, name, type, caller, caller.not_null());
{
assert(!HAS_PENDING_EXCEPTION, "");
if (ref_kind == JVM_REF_invokeStatic) {
LinkResolver::resolve_static_call(result,
- defc, name, type, caller, caller.not_null(), false, THREAD);
+ link_info, false, THREAD);
} else if (ref_kind == JVM_REF_invokeInterface) {
LinkResolver::resolve_interface_call(result, Handle(), defc,
- defc, name, type, caller, caller.not_null(), false, THREAD);
+ link_info, false, THREAD);
} else if (mh_invoke_id != vmIntrinsics::_none) {
assert(!is_signature_polymorphic_static(mh_invoke_id), "");
- LinkResolver::resolve_handle_call(result,
- defc, name, type, caller, THREAD);
+ LinkResolver::resolve_handle_call(result, link_info, THREAD);
} else if (ref_kind == JVM_REF_invokeSpecial) {
LinkResolver::resolve_special_call(result,
- defc, name, type, caller, caller.not_null(), THREAD);
+ link_info, THREAD);
} else if (ref_kind == JVM_REF_invokeVirtual) {
LinkResolver::resolve_virtual_call(result, Handle(), defc,
- defc, name, type, caller, caller.not_null(), false, THREAD);
+ link_info, false, THREAD);
} else {
assert(false, err_msg("ref_kind=%d", ref_kind));
}
@@ -714,11 +714,11 @@
case IS_CONSTRUCTOR:
{
CallInfo result;
+ LinkInfo link_info(defc, name, type, caller, caller.not_null());
{
assert(!HAS_PENDING_EXCEPTION, "");
if (name == vmSymbols::object_initializer_name()) {
- LinkResolver::resolve_special_call(result,
- defc, name, type, caller, caller.not_null(), THREAD);
+ LinkResolver::resolve_special_call(result, link_info, THREAD);
} else {
break; // will throw after end of switch
}
@@ -735,7 +735,8 @@
fieldDescriptor result; // find_field initializes fd if found
{
assert(!HAS_PENDING_EXCEPTION, "");
- LinkResolver::resolve_field(result, defc, name, type, caller, Bytecodes::_nop, false, false, THREAD);
+ LinkInfo link_info(defc, name, type, caller, /*check_access*/false);
+ LinkResolver::resolve_field(result, link_info, Bytecodes::_nop, false, THREAD);
if (HAS_PENDING_EXCEPTION) {
return empty;
}
@@ -942,22 +943,56 @@
return rfill + overflow;
}
-// Get context class for a CallSite instance: either extract existing context or use default one.
-InstanceKlass* MethodHandles::get_call_site_context(oop call_site) {
- // In order to extract a context the following traversal is performed:
- // CallSite.context => Cleaner.referent => Class._klass => Klass
- assert(java_lang_invoke_CallSite::is_instance(call_site), "");
- oop context_oop = java_lang_invoke_CallSite::context_volatile(call_site);
- if (oopDesc::is_null(context_oop)) {
- return NULL; // The context hasn't been initialized yet.
+void MethodHandles::add_dependent_nmethod(oop call_site, nmethod* nm) {
+ assert_locked_or_safepoint(CodeCache_lock);
+
+ oop context = java_lang_invoke_CallSite::context(call_site);
+ nmethodBucket* deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
+
+ nmethodBucket* new_deps = nmethodBucket::add_dependent_nmethod(deps, nm);
+ if (deps != new_deps) {
+ java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context, new_deps);
+ }
+}
+
+void MethodHandles::remove_dependent_nmethod(oop call_site, nmethod* nm) {
+ assert_locked_or_safepoint(CodeCache_lock);
+
+ oop context = java_lang_invoke_CallSite::context(call_site);
+ nmethodBucket* deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
+
+ if (nmethodBucket::remove_dependent_nmethod(deps, nm)) {
+ nmethodBucket* new_deps = nmethodBucket::clean_dependent_nmethods(deps);
+ if (deps != new_deps) {
+ java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context, new_deps);
+ }
}
- oop context_class_oop = java_lang_ref_Reference::referent(context_oop);
- if (oopDesc::is_null(context_class_oop)) {
- // The context reference was cleared by GC, so current dependency context
- // isn't usable anymore. Context should be fetched from CallSite again.
- return NULL;
+}
+
+void MethodHandles::flush_dependent_nmethods(Handle call_site, Handle target) {
+ assert_lock_strong(Compile_lock);
+
+ int marked = 0;
+ CallSiteDepChange changes(call_site(), target());
+ {
+ MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
+
+ oop context = java_lang_invoke_CallSite::context(call_site());
+ nmethodBucket* deps = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context);
+
+ marked = nmethodBucket::mark_dependent_nmethods(deps, changes);
+ if (marked > 0) {
+ nmethodBucket* new_deps = nmethodBucket::clean_dependent_nmethods(deps);
+ if (deps != new_deps) {
+ java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context, new_deps);
+ }
+ }
}
- return InstanceKlass::cast(java_lang_Class::as_Klass(context_class_oop));
+ if (marked > 0) {
+ // At least one nmethod has been marked for deoptimization
+ VM_Deoptimize op;
+ VMThread::execute(&op);
+ }
}
//------------------------------------------------------------------------------
@@ -1276,7 +1311,7 @@
{
// Walk all nmethods depending on this call site.
MutexLocker mu(Compile_lock, thread);
- CodeCache::flush_dependents_on(call_site, target);
+ MethodHandles::flush_dependent_nmethods(call_site, target);
java_lang_invoke_CallSite::set_target(call_site(), target());
}
}
@@ -1288,30 +1323,34 @@
{
// Walk all nmethods depending on this call site.
MutexLocker mu(Compile_lock, thread);
- CodeCache::flush_dependents_on(call_site, target);
+ MethodHandles::flush_dependent_nmethods(call_site, target);
java_lang_invoke_CallSite::set_target_volatile(call_site(), target());
}
}
JVM_END
-JVM_ENTRY(void, MHN_invalidateDependentNMethods(JNIEnv* env, jobject igcls, jobject call_site_jh)) {
- Handle call_site(THREAD, JNIHandles::resolve_non_null(call_site_jh));
+JVM_ENTRY(void, MHN_clearCallSiteContext(JNIEnv* env, jobject igcls, jobject context_jh)) {
+ Handle context(THREAD, JNIHandles::resolve_non_null(context_jh));
{
// Walk all nmethods depending on this call site.
MutexLocker mu1(Compile_lock, thread);
- CallSiteDepChange changes(call_site(), Handle());
-
- InstanceKlass* ctxk = MethodHandles::get_call_site_context(call_site());
- if (ctxk == NULL) {
- return; // No dependencies to invalidate yet.
- }
int marked = 0;
{
MutexLockerEx mu2(CodeCache_lock, Mutex::_no_safepoint_check_flag);
- marked = ctxk->mark_dependent_nmethods(changes);
+ nmethodBucket* b = java_lang_invoke_MethodHandleNatives_CallSiteContext::vmdependencies(context());
+ while(b != NULL) {
+ nmethod* nm = b->get_nmethod();
+ if (b->count() > 0 && nm->is_alive() && !nm->is_marked_for_deoptimization()) {
+ nm->mark_for_deoptimization();
+ marked++;
+ }
+ nmethodBucket* next = b->next();
+ delete b;
+ b = next;
+ }
+ java_lang_invoke_MethodHandleNatives_CallSiteContext::set_vmdependencies(context(), NULL); // reset context
}
- java_lang_invoke_CallSite::set_context_volatile(call_site(), NULL); // Reset call site to initial state
if (marked > 0) {
// At least one nmethod has been marked for deoptimization
VM_Deoptimize op;
@@ -1357,6 +1396,7 @@
#define MT JLINV"MethodType;"
#define MH JLINV"MethodHandle;"
#define MEM JLINV"MemberName;"
+#define CTX JLINV"MethodHandleNatives$CallSiteContext;"
#define CC (char*) /*cast a literal from (const char*)*/
#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
@@ -1374,7 +1414,7 @@
{CC"objectFieldOffset", CC"("MEM")J", FN_PTR(MHN_objectFieldOffset)},
{CC"setCallSiteTargetNormal", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetNormal)},
{CC"setCallSiteTargetVolatile", CC"("CS""MH")V", FN_PTR(MHN_setCallSiteTargetVolatile)},
- {CC"invalidateDependentNMethods", CC"("CS")V", FN_PTR(MHN_invalidateDependentNMethods)},
+ {CC"clearCallSiteContext", CC"("CTX")V", FN_PTR(MHN_clearCallSiteContext)},
{CC"staticFieldOffset", CC"("MEM")J", FN_PTR(MHN_staticFieldOffset)},
{CC"staticFieldBase", CC"("MEM")"OBJ, FN_PTR(MHN_staticFieldBase)},
{CC"getMemberVMInfo", CC"("MEM")"OBJ, FN_PTR(MHN_getMemberVMInfo)}
--- a/hotspot/src/share/vm/prims/methodHandles.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -69,7 +69,10 @@
enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 };
// CallSite support
- static InstanceKlass* get_call_site_context(oop call_site);
+ static void add_dependent_nmethod(oop call_site, nmethod* nm);
+ static void remove_dependent_nmethod(oop call_site, nmethod* nm);
+
+ static void flush_dependent_nmethods(Handle call_site, Handle target);
// Generate MethodHandles adapters.
static bool generate_adapters();
--- a/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -64,7 +64,7 @@
}
#endif
-#ifdef SPARC
+#if defined SPARC || defined AARCH64
if (FLAG_IS_DEFAULT(InlineSmallCode)) {
FLAG_SET_DEFAULT(InlineSmallCode, 2500);
}
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -179,9 +179,9 @@
CallInfo callinfo;
Handle receiver = args->receiver();
KlassHandle recvrKlass(THREAD, receiver.is_null() ? (Klass*)NULL : receiver->klass());
+ LinkInfo link_info(spec_klass, name, signature, KlassHandle(), /*check_access*/false);
LinkResolver::resolve_virtual_call(
- callinfo, receiver, recvrKlass, spec_klass, name, signature,
- KlassHandle(), false, true, CHECK);
+ callinfo, receiver, recvrKlass, link_info, true, CHECK);
methodHandle method = callinfo.selected_method();
assert(method.not_null(), "should have thrown exception");
@@ -216,7 +216,8 @@
void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
CallInfo callinfo;
- LinkResolver::resolve_special_call(callinfo, klass, name, signature, KlassHandle(), false, CHECK);
+ LinkInfo link_info(klass, name, signature, KlassHandle(), /*check_access*/false);
+ LinkResolver::resolve_special_call(callinfo, link_info, CHECK);
methodHandle method = callinfo.selected_method();
assert(method.not_null(), "should have thrown exception");
@@ -250,7 +251,8 @@
void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
CallInfo callinfo;
- LinkResolver::resolve_static_call(callinfo, klass, name, signature, KlassHandle(), false, true, CHECK);
+ LinkInfo link_info(klass, name, signature, KlassHandle(), /*check_access*/false);
+ LinkResolver::resolve_static_call(callinfo, link_info, true, CHECK);
methodHandle method = callinfo.selected_method();
assert(method.not_null(), "should have thrown exception");
--- a/hotspot/src/share/vm/runtime/os.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/runtime/os.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -775,6 +775,10 @@
pd_start_thread(thread);
}
+void os::abort(bool dump_core) {
+ abort(dump_core && CreateCoredumpOnCrash, NULL, NULL);
+}
+
//---------------------------------------------------------------------------
// Helper functions for fatal error handler
--- a/hotspot/src/share/vm/runtime/reflection.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -831,9 +831,9 @@
CallInfo info;
Symbol* signature = method->signature();
Symbol* name = method->name();
- LinkResolver::resolve_interface_call(info, receiver, recv_klass, klass,
- name, signature,
- KlassHandle(), false, true,
+ LinkResolver::resolve_interface_call(info, receiver, recv_klass,
+ LinkInfo(klass, name, signature, KlassHandle(), false),
+ true,
CHECK_(methodHandle()));
return info.selected_method();
}
--- a/hotspot/src/share/vm/runtime/stubRoutines.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -137,6 +137,8 @@
address StubRoutines::_crc_table_adr = NULL;
address StubRoutines::_multiplyToLen = NULL;
+address StubRoutines::_squareToLen = NULL;
+address StubRoutines::_mulAdd = NULL;
double (* StubRoutines::_intrinsic_log )(double) = NULL;
double (* StubRoutines::_intrinsic_log10 )(double) = NULL;
--- a/hotspot/src/share/vm/runtime/stubRoutines.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -197,6 +197,8 @@
static address _crc_table_adr;
static address _multiplyToLen;
+ static address _squareToLen;
+ static address _mulAdd;
// These are versions of the java.lang.Math methods which perform
// the same operations as the intrinsic version. They are used for
@@ -356,6 +358,8 @@
static address crc_table_addr() { return _crc_table_adr; }
static address multiplyToLen() {return _multiplyToLen; }
+ static address squareToLen() {return _squareToLen; }
+ static address mulAdd() {return _mulAdd; }
static address select_fill_function(BasicType t, bool aligned, const char* &name);
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -831,6 +831,8 @@
static_field(StubRoutines, _updateBytesCRC32, address) \
static_field(StubRoutines, _crc_table_adr, address) \
static_field(StubRoutines, _multiplyToLen, address) \
+ static_field(StubRoutines, _squareToLen, address) \
+ static_field(StubRoutines, _mulAdd, address) \
\
/*****************/ \
/* SharedRuntime */ \
--- a/hotspot/src/share/vm/services/diagnosticCommand.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -315,7 +315,7 @@
void SystemGCDCmd::execute(DCmdSource source, TRAPS) {
if (!DisableExplicitGC) {
- Universe::heap()->collect(GCCause::_java_lang_system_gc);
+ Universe::heap()->collect(GCCause::_dcmd_gc_run);
} else {
output()->print_cr("Explicit GC is disabled, no GC has been performed.");
}
--- a/hotspot/src/share/vm/utilities/fakeRttiSupport.hpp Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/src/share/vm/utilities/fakeRttiSupport.hpp Thu Jun 25 07:13:27 2015 +0000
@@ -89,11 +89,11 @@
return ((uintx)1) << validate_tag(tag);
}
- static TagType validate_tag(uintx tag) {
- // Type of tag is not TagType to dodge useless MacOSX compiler warning.
- assert(tag < (sizeof(uintx) * BitsPerByte),
- err_msg("Tag " UINTX_FORMAT " is too large", tag));
- return static_cast<TagType>(tag);
+ static TagType validate_tag(TagType tag) {
+ assert(0 <= tag, err_msg("Tag " INTX_FORMAT " is negative", (intx)tag));
+ assert(tag < BitsPerWord,
+ err_msg("Tag " UINTX_FORMAT " is too large", (uintx)tag));
+ return tag;
}
};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/arraycopy/TestDeadArrayCopyOnMemChain.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8080699
+ * @summary eliminated arraycopy node still reachable through exception edges
+ * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation TestDeadArrayCopyOnMemChain
+ *
+ */
+
+public class TestDeadArrayCopyOnMemChain {
+ static class A {
+ int f;
+ }
+
+ static void test_helper(Object o) {
+ }
+
+ static void test(int src_off, boolean flag) {
+ // dst is eliminated first. Eliminating dst causes src to be
+ // eliminated. When working on the safepoint at the uncommon
+ // trap in the exception handler, the eliminated ArrayCopyNode
+ // is reached through the exception edges.
+ Object[] dst = new Object[10];
+ Object[] src = new Object[10];
+
+ // src_off causes the exception handler to be run sometimes
+ try {
+ System.arraycopy(src, src_off, dst, 0, 10);
+ } catch (IndexOutOfBoundsException ioobe) {
+ // flag always false so test becomes uncommon trap. Make
+ // sure src is live at the unc.
+ if (flag) {
+ test_helper(src);
+ }
+ }
+ }
+
+ static public void main(String[] args) {
+ for (int i = 0; i < 20000; i++) {
+ test((i%2) == 0 ? 0 : -1, false);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/muladd/TestMulAdd.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * @test
+ * @bug 8081778
+ * @summary Add C2 x86 intrinsic for BigInteger::mulAdd() method
+ *
+ * @run main/othervm/timeout=600 -XX:-TieredCompilation -Xbatch
+ * -XX:+IgnoreUnrecognizedVMOptions -XX:-UseSquareToLenIntrinsic -XX:-UseMultiplyToLenIntrinsic
+ * -XX:CompileCommand=dontinline,TestMulAdd::main
+ * -XX:CompileCommand=option,TestMulAdd::base_multiply,ccstr,DisableIntrinsic,_mulAdd
+ * -XX:CompileCommand=option,java.math.BigInteger::multiply,ccstr,DisableIntrinsic,_mulAdd
+ * -XX:CompileCommand=option,java.math.BigInteger::square,ccstr,DisableIntrinsic,_mulAdd
+ * -XX:CompileCommand=option,java.math.BigInteger::squareToLen,ccstr,DisableIntrinsic,_mulAdd
+ * -XX:CompileCommand=option,java.math.BigInteger::mulAdd,ccstr,DisableIntrinsic,_mulAdd
+ * -XX:CompileCommand=inline,java.math.BigInteger::multiply
+ * -XX:CompileCommand=inline,java.math.BigInteger::square
+ * -XX:CompileCommand=inline,java.math.BigInteger::squareToLen
+ * -XX:CompileCommand=inline,java.math.BigInteger::mulAdd TestMulAdd
+ */
+
+import java.util.Random;
+import java.math.*;
+
+public class TestMulAdd {
+
+ // Avoid intrinsic by preventing inlining multiply() and mulAdd().
+ public static BigInteger base_multiply(BigInteger op1) {
+ return op1.multiply(op1);
+ }
+
+ // Generate mulAdd() intrinsic by inlining multiply().
+ public static BigInteger new_multiply(BigInteger op1) {
+ return op1.multiply(op1);
+ }
+
+ public static boolean bytecompare(BigInteger b1, BigInteger b2) {
+ byte[] data1 = b1.toByteArray();
+ byte[] data2 = b2.toByteArray();
+ if (data1.length != data2.length)
+ return false;
+ for (int i = 0; i < data1.length; i++) {
+ if (data1[i] != data2[i])
+ return false;
+ }
+ return true;
+ }
+
+ public static String stringify(BigInteger b) {
+ String strout= "";
+ byte [] data = b.toByteArray();
+ for (int i = 0; i < data.length; i++) {
+ strout += (String.format("%02x",data[i]) + " ");
+ }
+ return strout;
+ }
+
+ public static void main(String args[]) throws Exception {
+
+ BigInteger oldsum = new BigInteger("0");
+ BigInteger newsum = new BigInteger("0");
+
+ BigInteger b1, b2, oldres, newres;
+
+ Random rand = new Random();
+ long seed = System.nanoTime();
+ Random rand1 = new Random();
+ long seed1 = System.nanoTime();
+ rand.setSeed(seed);
+ rand1.setSeed(seed1);
+
+ for (int j = 0; j < 100000; j++) {
+ int rand_int = rand1.nextInt(3136)+32;
+ b1 = new BigInteger(rand_int, rand);
+
+ oldres = base_multiply(b1);
+ newres = new_multiply(b1);
+
+ oldsum = oldsum.add(oldres);
+ newsum = newsum.add(newres);
+
+ if (!bytecompare(oldres,newres)) {
+ System.out.print("mismatch for:b1:" + stringify(b1) + " :oldres:" + stringify(oldres) + " :newres:" + stringify(newres));
+ System.out.println(b1);
+ throw new Exception("Failed");
+ }
+ }
+ if (!bytecompare(oldsum,newsum)) {
+ System.out.println("Failure: oldsum:" + stringify(oldsum) + " newsum:" + stringify(newsum));
+ throw new Exception("Failed");
+ } else {
+ System.out.println("Success");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/squaretolen/TestSquareToLen.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+/**
+ * @test
+ * @bug 8081778
+ * @summary Add C2 x86 intrinsic for BigInteger::squareToLen() method
+ *
+ * @run main/othervm/timeout=600 -XX:-TieredCompilation -Xbatch
+ * -XX:CompileCommand=exclude,TestSquareToLen::main
+ * -XX:CompileCommand=option,TestSquareToLen::base_multiply,ccstr,DisableIntrinsic,_squareToLen
+ * -XX:CompileCommand=option,java.math.BigInteger::multiply,ccstr,DisableIntrinsic,_squareToLen
+ * -XX:CompileCommand=option,java.math.BigInteger::square,ccstr,DisableIntrinsic,_squareToLen
+ * -XX:CompileCommand=option,java.math.BigInteger::squareToLen,ccstr,DisableIntrinsic,_squareToLen
+ * -XX:CompileCommand=inline,java.math.BigInteger::multiply
+ * -XX:CompileCommand=inline,java.math.BigInteger::square
+ * -XX:CompileCommand=inline,java.math.BigInteger::squareToLen TestSquareToLen
+ */
+
+import java.util.Random;
+import java.math.*;
+
+public class TestSquareToLen {
+
+ // Avoid intrinsic by preventing inlining multiply() and squareToLen().
+ public static BigInteger base_multiply(BigInteger op1) {
+ return op1.multiply(op1);
+ }
+
+ // Generate squareToLen() intrinsic by inlining multiply().
+ public static BigInteger new_multiply(BigInteger op1) {
+ return op1.multiply(op1);
+ }
+
+ public static boolean bytecompare(BigInteger b1, BigInteger b2) {
+ byte[] data1 = b1.toByteArray();
+ byte[] data2 = b2.toByteArray();
+ if (data1.length != data2.length)
+ return false;
+ for (int i = 0; i < data1.length; i++) {
+ if (data1[i] != data2[i])
+ return false;
+ }
+ return true;
+ }
+
+ public static String stringify(BigInteger b) {
+ String strout= "";
+ byte [] data = b.toByteArray();
+ for (int i = 0; i < data.length; i++) {
+ strout += (String.format("%02x",data[i]) + " ");
+ }
+ return strout;
+ }
+
+ public static void main(String args[]) throws Exception {
+
+ BigInteger oldsum = new BigInteger("0");
+ BigInteger newsum = new BigInteger("0");
+
+ BigInteger b1, b2, oldres, newres;
+
+ Random rand = new Random();
+ long seed = System.nanoTime();
+ Random rand1 = new Random();
+ long seed1 = System.nanoTime();
+ rand.setSeed(seed);
+ rand1.setSeed(seed1);
+
+ for (int j = 0; j < 100000; j++) {
+ int rand_int = rand1.nextInt(3136)+32;
+ b1 = new BigInteger(rand_int, rand);
+
+ oldres = base_multiply(b1);
+ newres = new_multiply(b1);
+
+ oldsum = oldsum.add(oldres);
+ newsum = newsum.add(newres);
+
+ if (!bytecompare(oldres,newres)) {
+ System.out.print("mismatch for:b1:" + stringify(b1) + " :oldres:" + stringify(oldres) + " :newres:" + stringify(newres));
+ System.out.println(b1);
+ throw new Exception("Failed");
+ }
+ }
+ if (!bytecompare(oldsum,newsum)) {
+ System.out.println("Failure: oldsum:" + stringify(oldsum) + " newsum:" + stringify(newsum));
+ throw new Exception("Failed");
+ } else {
+ System.out.println("Success");
+ }
+ }
+}
--- a/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -24,12 +24,15 @@
/**
* @test
* @bug 8057967
- * @ignore 8079205
- * @run main/bootclasspath -Xbatch java.lang.invoke.CallSiteDepContextTest
+ * @run main/bootclasspath -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+TraceClassUnloading
+ * -XX:+PrintCompilation -XX:+TraceDependencies -XX:+TraceReferenceGC
+ * -verbose:gc java.lang.invoke.CallSiteDepContextTest
*/
package java.lang.invoke;
import java.lang.ref.*;
+import java.lang.reflect.Field;
+
import jdk.internal.org.objectweb.asm.*;
import sun.misc.Unsafe;
@@ -96,6 +99,13 @@
}
}
+ public static void testHiddenDepField() throws Exception {
+ try {
+ Field f = MethodHandleNatives.CallSiteContext.class.getDeclaredField("vmdependencies");
+ throw new AssertionError("Context.dependencies field should be hidden");
+ } catch(NoSuchFieldException e) { /* expected */ }
+ }
+
public static void testSharedCallSite() throws Throwable {
Class<?> cls1 = UNSAFE.defineAnonymousClass(Object.class, getClassFile("CS_1"), null);
Class<?> cls2 = UNSAFE.defineAnonymousClass(Object.class, getClassFile("CS_2"), null);
@@ -132,12 +142,14 @@
static ReferenceQueue rq = new ReferenceQueue();
static PhantomReference ref;
- public static void testGC() throws Throwable {
+ public static void testGC(boolean clear, boolean precompile) throws Throwable {
+ String id = "_" + clear + "_" + precompile;
+
mcs = new MutableCallSite(LOOKUP.findStatic(T.class, "f1", TYPE));
Class<?>[] cls = new Class[] {
- UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_1"), null),
- UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_2"), null),
+ UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_1" + id), null),
+ UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_2" + id), null),
};
MethodHandle[] mhs = new MethodHandle[] {
@@ -151,30 +163,38 @@
execute(1, mhs);
ref = new PhantomReference<>(cls[0], rq);
- cls[0] = UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_3"), null);
+ cls[0] = UNSAFE.defineAnonymousClass(Object.class, getClassFile("GC_3" + id), null);
mhs[0] = LOOKUP.findStatic(cls[0], METHOD_NAME, TYPE);
do {
System.gc();
try {
- Reference ref1 = rq.remove(1000);
+ Reference ref1 = rq.remove(100);
if (ref1 == ref) {
- ref1.clear();
- System.gc(); // Ensure that the stale context is cleared
break;
}
} catch(InterruptedException e) { /* ignore */ }
} while (true);
- execute(1, mhs);
+ if (clear) {
+ ref.clear();
+ System.gc(); // Ensure that the stale context is unloaded
+ }
+ if (precompile) {
+ execute(1, mhs);
+ }
mcs.setTarget(LOOKUP.findStatic(T.class, "f2", TYPE));
execute(2, mhs);
}
public static void main(String[] args) throws Throwable {
+ testHiddenDepField();
testSharedCallSite();
testNonBoundCallSite();
- testGC();
+ testGC(false, false);
+ testGC(false, true);
+ testGC( true, false);
+ testGC( true, true);
System.out.println("TEST PASSED");
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/loopopts/superword/TestReductionWithLoopVariantUse.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8080976
+ * @summary Loop variant use in reduction should prevent vectorization
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestReductionWithLoopVariantUse
+ *
+ */
+
+public class TestReductionWithLoopVariantUse {
+ static int m(int[] array) {
+ int c = 0;
+ for (int i = 0; i < 256; i++) {
+ c += array[i];
+ array[i] = c;
+ }
+ return c;
+ }
+
+ static public void main(String[] args) {
+ int[] array = new int[256];
+ int[] array2 = new int[256];
+ for (int j = 0; j < 256; j++) {
+ array2[j] = j;
+ }
+ for (int i = 0; i < 20000; i++) {
+ System.arraycopy(array2, 0, array, 0, 256);
+ int res = m(array);
+ boolean success = true;
+ int c = 0;
+ for (int j = 0; j < 256; j++) {
+ c += array2[j];
+ if (array[j] != c) {
+ System.out.println("Failed for " + j + " : " + array[j] + " != " + c);
+ success = false;
+ }
+ }
+ if (c != res) {
+ System.out.println("Failed for sum: " + c + " != " + res);
+ }
+ if (!success) {
+ throw new RuntimeException("Test failed");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/rangechecks/TestBadFoldCompare.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085832
+ * @summary x <= 0 || x > 0 wrongly folded as (x-1) >u -1
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestBadFoldCompare
+ */
+
+public class TestBadFoldCompare {
+
+ static boolean test1_taken;
+
+ static void helper1(int i, int a, int b, boolean flag) {
+ if (flag) {
+ if (i <= a || i > b) {
+ test1_taken = true;
+ }
+ }
+ }
+
+ static void test1(int i, boolean flag) {
+ helper1(i, 0, 0, flag);
+ }
+
+ static boolean test2_taken;
+
+ static void helper2(int i, int a, int b, boolean flag) {
+ if (flag) {
+ if (i > b || i <= a) {
+ test2_taken = true;
+ }
+ }
+ }
+
+ static void test2(int i, boolean flag) {
+ helper2(i, 0, 0, flag);
+ }
+
+ static public void main(String[] args) {
+ boolean success = true;
+
+ for (int i = 0; i < 20000; i++) {
+ helper1(5, 0, 10, (i%2)==0);
+ helper1(-1, 0, 10, (i%2)==0);
+ helper1(15, 0, 10, (i%2)==0);
+ test1(0, false);
+ }
+ test1_taken = false;
+ test1(0, true);
+ if (!test1_taken) {
+ System.out.println("Test1 failed");
+ success = false;
+ }
+
+ for (int i = 0; i < 20000; i++) {
+ helper2(5, 0, 10, (i%2)==0);
+ helper2(-1, 0, 10, (i%2)==0);
+ helper2(15, 0, 10, (i%2)==0);
+ test2(0, false);
+ }
+ test2_taken = false;
+ test2(0, true);
+
+ if (!test2_taken) {
+ System.out.println("Test2 failed");
+ success = false;
+ }
+ if (!success) {
+ throw new RuntimeException("Some tests failed");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/types/TestTypePropagationToCmpU.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8080156 8060036
+ * @summary Test correctness of type propagation to CmpUNodes.
+ * @run main TestTypePropagationToCmpU
+ */
+public class TestTypePropagationToCmpU {
+ public static void main(String[] args) {
+ try {
+ // Trigger compilation
+ for (int i = 0; i < 100_000; ++i) {
+ test();
+ }
+ } catch (NullPointerException e) {
+ // Test should never throw a NullPointerException
+ throw new RuntimeException("Test failed");
+ }
+ }
+
+ static int global = 42;
+
+ public static void test() {
+ int a = Integer.MIN_VALUE;
+ int b = global;
+ char[] buf = { 0 };
+ for (int i = 0; i <= b; ++i) {
+ a = i - b;
+ }
+ // C2 adds a range check and an uncommon trap here to ensure that the array index
+ // is in bounds. If type information is not propagated correctly to the corresponding
+ // CmpUNode, this trap may be always taken. Because C2 also removes the unnecessary
+ // allocation of 'buf', a NullPointerException is thrown in this case.
+ char c = buf[(a * 11) / 2 - a]; // a is 0 here if global >= 0
+ buf[0] = 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8077504
+ * @summary Unsafe load can loose control dependency and cause crash
+ * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestUnsafeLoadControl
+ *
+ */
+
+import java.lang.reflect.Field;
+import sun.misc.Unsafe;
+
+public class TestUnsafeLoadControl {
+
+ private static final Unsafe UNSAFE;
+
+ static {
+ try {
+ Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
+ unsafeField.setAccessible(true);
+ UNSAFE = (Unsafe) unsafeField.get(null);
+ } catch(Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ static int val;
+ static void test1(int[] a, boolean[] flags, boolean flag, long j) {
+ for (int i = 0; i < 10; i++) {
+ if (flags[i]) {
+ if (flag) {
+ long address = (j << 2) + UNSAFE.ARRAY_INT_BASE_OFFSET;
+ int v = UNSAFE.getInt(a, address);
+ val = v;
+ }
+ }
+ }
+ }
+
+ static int test2(int[] a, boolean[] flags, boolean flag, long j) {
+ int sum = 0;
+ for (int i = 0; i < 10; i++) {
+ if (flags[i]) {
+ if (flag) {
+ long address = (j << 2) + UNSAFE.ARRAY_INT_BASE_OFFSET;
+ int v = UNSAFE.getInt(a, address);
+ if (v == 0) {
+ sum++;
+ }
+ }
+ }
+ }
+ return sum;
+ }
+
+ static public void main(String[] args) {
+ boolean[] flags = new boolean[10];
+ for (int i = 0; i < flags.length; i++) {
+ flags[i] = true;
+ }
+ int[] array = new int[10];
+ for (int i = 0; i < 20000; i++) {
+ test1(array, flags, true, 0);
+ }
+ for (int i = 0; i < flags.length; i++) {
+ flags[i] = false;
+ }
+ test1(array, flags, true, Long.MAX_VALUE/4);
+
+ for (int i = 0; i < flags.length; i++) {
+ flags[i] = true;
+ }
+ for (int i = 0; i < 20000; i++) {
+ test2(array, flags, true, 0);
+ }
+ for (int i = 0; i < flags.length; i++) {
+ flags[i] = false;
+ }
+ test2(array, flags, true, Long.MAX_VALUE/4);
+ }
+}
--- a/hotspot/test/gc/TestSmallHeap.java Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/test/gc/TestSmallHeap.java Thu Jun 25 07:13:27 2015 +0000
@@ -27,6 +27,7 @@
* @requires vm.gc=="null"
* @requires (vm.opt.AggressiveOpts=="null") | (vm.opt.AggressiveOpts=="false")
* @requires vm.compMode != "Xcomp"
+ * @requires vm.opt.UseCompressedOops != false
* @summary Verify that starting the VM with a small heap works
* @library /testlibrary /../../test/lib
* @modules java.management/sun.management
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/ImplementationOfWithToString.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Implementation of InterfaceWithToString.
+ */
+public class ImplementationOfWithToString implements InterfaceWithToString {
+
+ /**
+ * @see InterfaceWithToString#someMethod()
+ * {@inheritDoc}
+ */
+ @Override
+ public void someMethod() {
+ // May do something here.
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ * {@inheritDoc}
+ */
+ @Override
+ public String toString() {
+ return "toString() from " + getClass().getName();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/InterfaceWithToString.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Interface with toString declared.
+ */
+public interface InterfaceWithToString {
+
+ void someMethod();
+
+ /**
+ * Same as Object.toString().
+ *
+ * @return some custom string.
+ */
+ String toString();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/ToStringTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ * @bug 8072588
+ * @build InterfaceWithToString
+ * @build ImplementationOfWithToString
+ * @run main/native ToStringTest
+ */
+public final class ToStringTest {
+
+ static {
+ System.loadLibrary("ToStringTest");
+ }
+
+ native static void nTest();
+
+ public static void main(String[] args) throws Exception {
+ nTest();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/jni/ToStringInInterfaceTest/libToStringTest.c Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * Native test for ToStringInInterfaceTest.
+ */
+
+#include "jni.h"
+
+#define checkException(env) if ((*env)->ExceptionCheck(env)) { return; }
+
+jstring callStringMethod(JNIEnv* env, jobject jobj, jmethodID id, ...)
+{
+ jstring value;
+
+ va_list ap;
+ va_start(ap, id);
+ value = (jstring)(*env)->CallObjectMethodV(env, jobj, id, ap);
+ va_end(ap);
+ return value;
+}
+
+JNIEXPORT void JNICALL Java_ToStringTest_nTest(JNIEnv* env, jclass jclazz)
+{
+ jclass classOfInterfaceWithToString;
+ jclass classOfImplementationOfWithToString;
+ jmethodID constructorOfImplementationOfWithToString;
+ jobject instanceOfImplementationOfWithToString;
+ jmethodID toStringOfInterfaceWithToString;
+ jmethodID toStringOfImplementationOfWithToString;
+ jstring jstr;
+ const char *chars;
+
+ classOfInterfaceWithToString = (*env)->FindClass(env, "InterfaceWithToString");
+ checkException(env);
+ classOfImplementationOfWithToString = (*env)->FindClass(env, "ImplementationOfWithToString");
+ checkException(env);
+
+ constructorOfImplementationOfWithToString = (*env)->GetMethodID(env, classOfImplementationOfWithToString, "<init>", "()V");
+ checkException(env);
+
+ instanceOfImplementationOfWithToString = (*env)->NewObject(env, classOfImplementationOfWithToString, constructorOfImplementationOfWithToString);
+ checkException(env);
+
+ toStringOfInterfaceWithToString = (*env)->GetMethodID(env, classOfInterfaceWithToString, "toString", "()Ljava/lang/String;");
+ checkException(env);
+
+ toStringOfImplementationOfWithToString = (*env)->GetMethodID(env, classOfImplementationOfWithToString, "toString", "()Ljava/lang/String;");
+ checkException(env);
+
+ jstr = callStringMethod(env, instanceOfImplementationOfWithToString, toStringOfImplementationOfWithToString);
+ checkException(env);
+
+ chars = (*env)->GetStringUTFChars(env, jstr, NULL);
+ (*env)->ReleaseStringUTFChars(env, jstr, chars);
+
+ jstr = callStringMethod(env, instanceOfImplementationOfWithToString, toStringOfInterfaceWithToString);
+ checkException(env);
+
+ chars = (*env)->GetStringUTFChars(env, jstr, NULL);
+ (*env)->ReleaseStringUTFChars(env, jstr, chars);
+}
--- a/hotspot/test/serviceability/dcmd/gc/RunGCTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/test/serviceability/dcmd/gc/RunGCTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -59,7 +59,7 @@
}
OutputAnalyzer output = new OutputAnalyzer(gcLog, "");
- output.shouldMatch(".*\\[Full GC \\(System(\\.gc\\(\\))?.*");
+ output.shouldContain("[Full GC (Diagnostic Command)");
}
@Test
--- a/hotspot/test/serviceability/sa/TestClassLoaderStats.java Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/test/serviceability/sa/TestClassLoaderStats.java Thu Jun 25 07:13:27 2015 +0000
@@ -24,11 +24,14 @@
import jdk.test.lib.Platform;
import jdk.test.lib.ProcessTools;
import jdk.test.lib.OutputAnalyzer;
+import jdk.test.lib.apps.LingeredApp;
/*
* @test
+ * @library /../../test/lib/share/classes
* @library /testlibrary
* @build jdk.test.lib.*
+ * @build jdk.test.lib.apps.*
* @run main TestClassLoaderStats
*/
public class TestClassLoaderStats {
@@ -39,19 +42,27 @@
return;
}
- ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
- "-XX:+UsePerfData",
- "sun.jvm.hotspot.tools.ClassLoaderStats",
- Integer.toString(ProcessTools.getProcessId()));
- OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
- System.out.println(output.getOutput());
+ LingeredApp app = null;
+ try {
+ app = LingeredApp.startApp();
- output.shouldHaveExitValue(0);
- output.shouldContain("Debugger attached successfully.");
- // The class loader stats header needs to be presented in the output:
- output.shouldMatch("class_loader\\W+classes\\W+bytes\\W+parent_loader\\W+alive?\\W+type");
- output.stderrShouldNotMatch("[E|e]xception");
- output.stderrShouldNotMatch("[E|e]rror");
+ System.out.println("Attaching sun.jvm.hotspot.tools.ClassLoaderStats to " + app.getPid());
+ ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UsePerfData",
+ "sun.jvm.hotspot.tools.ClassLoaderStats",
+ Long.toString(app.getPid()));
+ OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
+ System.out.println(output.getOutput());
+
+ output.shouldHaveExitValue(0);
+ output.shouldContain("Debugger attached successfully.");
+ // The class loader stats header needs to be presented in the output:
+ output.shouldMatch("class_loader\\W+classes\\W+bytes\\W+parent_loader\\W+alive?\\W+type");
+ output.stderrShouldNotMatch("[E|e]xception");
+ output.stderrShouldNotMatch("[E|e]rror");
+ } finally {
+ app.stopApp();
+ }
}
}
--- a/hotspot/test/serviceability/sa/TestStackTrace.java Wed Jun 24 17:45:44 2015 +0200
+++ b/hotspot/test/serviceability/sa/TestStackTrace.java Thu Jun 25 07:13:27 2015 +0000
@@ -24,11 +24,14 @@
import jdk.test.lib.OutputAnalyzer;
import jdk.test.lib.Platform;
import jdk.test.lib.ProcessTools;
+import jdk.test.lib.apps.LingeredApp;
/*
* @test
+ * @library /../../test/lib/share/classes
* @library /testlibrary
* @build jdk.test.lib.*
+ * @build jdk.test.lib.apps.*
* @run main TestStackTrace
*/
public class TestStackTrace {
@@ -39,17 +42,25 @@
return;
}
- ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
- "-XX:+UsePerfData",
- "sun.jvm.hotspot.tools.StackTrace",
- Integer.toString(ProcessTools.getProcessId()));
- OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
- System.out.println(output.getOutput());
+ LingeredApp app = null;
+ try {
+ app = LingeredApp.startApp();
- output.shouldHaveExitValue(0);
- output.shouldContain("Debugger attached successfully.");
- output.stderrShouldNotMatch("[E|e]xception");
- output.stderrShouldNotMatch("[E|e]rror");
+ System.out.println("Attaching sun.jvm.hotspot.tools.StackTrace to " + app.getPid());
+ ProcessBuilder processBuilder = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UsePerfData",
+ "sun.jvm.hotspot.tools.StackTrace",
+ Long.toString(app.getPid()));
+ OutputAnalyzer output = ProcessTools.executeProcess(processBuilder);
+ System.out.println(output.getOutput());
+
+ output.shouldHaveExitValue(0);
+ output.shouldContain("Debugger attached successfully.");
+ output.stderrShouldNotMatch("[E|e]xception");
+ output.stderrShouldNotMatch("[E|e]rror");
+ } finally {
+ app.stopApp();
+ }
}
}
--- a/jaxp/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -310,3 +310,5 @@
ae7406e82828fe1c245ac7507a9da5fd5b1c9529 jdk9-b65
d5963ccce28d7a3e96ee3e2dc8a8676e61699b70 jdk9-b66
78c2685daabafae827c686ca2d1bb2e451faed2b jdk9-b67
+82aae947938ec9b0119fdd78a616d0b7263072ee jdk9-b68
+f844a908d3308f47d73cf64e87c98d37d5d76ce8 jdk9-b69
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,21 +1,23 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
-/*
- * Copyright 1999-2005 The Apache Software Foundation.
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
*/
/*
* $Id: FunctionTable.java,v 1.3 2005/09/28 13:49:34 pvedula Exp $
@@ -135,6 +137,9 @@
/** The 'unparsed-entity-uri()' id (XSLT). */
public static final int FUNC_UNPARSED_ENTITY_URI = 36;
+ /** The 'here()' id (XML Signature). */
+ public static final int FUNC_HERE = 37;
+
// Proprietary
/** The 'document-location()' id (Proprietary). */
@@ -162,7 +167,7 @@
* Number of built in functions. Be sure to update this as
* built-in functions are added.
*/
- private static final int NUM_BUILT_IN_FUNCS = 37;
+ private static final int NUM_BUILT_IN_FUNCS = 38;
/**
* Number of built-in functions that may be added.
@@ -229,6 +234,8 @@
com.sun.org.apache.xpath.internal.functions.FuncDoclocation.class;
m_functions[FUNC_UNPARSED_ENTITY_URI] =
com.sun.org.apache.xpath.internal.functions.FuncUnparsedEntityURI.class;
+ m_functions[FUNC_HERE] =
+ com.sun.org.apache.xpath.internal.functions.FuncHere.class;
}
static{
@@ -302,6 +309,8 @@
new Integer(FunctionTable.FUNC_UNPARSED_ENTITY_URI));
m_functionID.put(Keywords.FUNC_DOCLOCATION_STRING,
new Integer(FunctionTable.FUNC_DOCLOCATION));
+ m_functionID.put(Keywords.FUNC_HERE_STRING,
+ new Integer(FunctionTable.FUNC_HERE));
}
public FunctionTable(){
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,21 +1,23 @@
/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
*/
-/*
- * Copyright 1999-2005 The Apache Software Foundation.
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
*/
/*
* $Id: Keywords.java,v 1.2.4.1 2005/09/14 19:46:01 jeffsuttor Exp $
@@ -210,6 +212,9 @@
public static final String FUNC_UNPARSED_ENTITY_URI_STRING =
"unparsed-entity-uri";
+ /** here function string (XML Signature). */
+ public static final String FUNC_HERE_STRING = "here";
+
// Proprietary, built in functions
/** current function string (Proprietary). */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/functions/FuncHere.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ */
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.sun.org.apache.xpath.internal.functions;
+
+import javax.xml.transform.TransformerException;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import com.sun.org.apache.xml.internal.dtm.DTM;
+import com.sun.org.apache.xpath.internal.NodeSetDTM;
+import com.sun.org.apache.xpath.internal.XPathContext;
+import com.sun.org.apache.xpath.internal.objects.XNodeSet;
+import com.sun.org.apache.xpath.internal.objects.XObject;
+import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
+
+/**
+ * Execute the XML Signature here() function.
+ */
+public final class FuncHere extends Function {
+
+ private static final long serialVersionUID = 4328660760070034592L;
+
+ @Override
+ public XObject execute(XPathContext xctxt) throws TransformerException {
+ Node xpathOwnerNode = (Node)xctxt.getOwnerObject();
+ if (xpathOwnerNode == null) {
+ return null;
+ }
+
+ int xpathOwnerNodeDTM = xctxt.getDTMHandleFromNode(xpathOwnerNode);
+ int currentNode = xctxt.getCurrentNode();
+ DTM dtm = xctxt.getDTM(currentNode);
+ int docContext = dtm.getDocument();
+
+ if (docContext == DTM.NULL) {
+ error(xctxt, XPATHErrorResources.ER_CONTEXT_HAS_NO_OWNERDOC, null);
+ }
+
+ // check whether currentNode and the node containing the XPath
+ // expression are in the same document
+ Document currentDoc = getOwnerDocument(dtm.getNode(currentNode));
+ Document xpathOwnerDoc = getOwnerDocument(xpathOwnerNode);
+
+ if (currentDoc != xpathOwnerDoc) {
+ throw new TransformerException("Owner documents differ");
+ }
+
+ XNodeSet nodes = new XNodeSet(xctxt.getDTMManager());
+ NodeSetDTM nodeSet = nodes.mutableNodeset();
+
+ int hereNode = DTM.NULL;
+
+ switch (dtm.getNodeType(xpathOwnerNodeDTM)) {
+
+ case Node.ATTRIBUTE_NODE:
+ case Node.PROCESSING_INSTRUCTION_NODE: {
+ // returns a node-set containing the attribute / processing
+ // instruction node
+ hereNode = xpathOwnerNodeDTM;
+ nodeSet.addNode(hereNode);
+ break;
+ }
+ case Node.TEXT_NODE : {
+ // returns a node-set containing the parent element of the
+ // text node that directly bears the XPath expression
+ hereNode = dtm.getParent(xpathOwnerNodeDTM);
+ nodeSet.addNode(hereNode);
+ break;
+ }
+ default :
+ break;
+ }
+
+ /** $todo$ Do I have to do this detach() call? */
+ nodeSet.detach();
+
+ return nodes;
+ }
+
+ private static Document getOwnerDocument(Node node) {
+ if (node.getNodeType() == Node.DOCUMENT_NODE) {
+ return (Document)node;
+ }
+ return node.getOwnerDocument();
+ }
+
+ @Override
+ public void fixupVariables(java.util.Vector vars, int globalsSize) { }
+}
--- a/jaxp/test/javax/xml/jaxp/functional/TEST.properties Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/test/javax/xml/jaxp/functional/TEST.properties Thu Jun 25 07:13:27 2015 +0000
@@ -7,3 +7,6 @@
# Tests that must run in othervm mode
othervm.dirs= /javax/xml/jaxp/functional
+# Declare module dependency
+modules=java.xml
+
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactoryTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactoryTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -23,28 +23,32 @@
package javax.xml.parsers.ptests;
+import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
+import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR;
+import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.compareWithGold;
+import static jaxp.library.JAXPTestUtilities.filenameToURL;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
import java.io.BufferedReader;
+import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.FilePermission;
import java.io.FileReader;
-import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
-
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
-
-import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR;
-import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
-
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
@@ -52,10 +56,6 @@
import jaxp.library.JAXPDataProvider;
import jaxp.library.JAXPFileBaseTest;
-import static jaxp.library.JAXPTestUtilities.USER_DIR;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -67,6 +67,7 @@
import org.xml.sax.helpers.DefaultHandler;
/**
+ * @bug 8080907
* This checks the methods of DocumentBuilderFactoryImpl.
*/
public class DocumentBuilderFactoryTest extends JAXPFileBaseTest {
@@ -134,28 +135,11 @@
assertFalse(eh.isErrorOccured());
}
- /**
- * Test the default functionality of schema support method. In
- * this case the schema source property is set.
- * @throws Exception If any errors occur.
- */
- @Test
- public void testCheckSchemaSupport2() throws Exception {
- try (FileInputStream fis = new FileInputStream(new File(
- XML_DIR, "test.xsd"))) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setValidating(true);
- dbf.setNamespaceAware(true);
- dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
- W3C_XML_SCHEMA_NS_URI);
- dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
- new InputSource(fis));
- MyErrorHandler eh = MyErrorHandler.newInstance();
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(eh);
- db.parse(new File(XML_DIR, "test1.xml"));
- assertFalse(eh.isErrorOccured());
- }
+ @DataProvider(name = "schema-source")
+ public Object[][] getSchemaSource() throws FileNotFoundException {
+ return new Object[][] {
+ { new FileInputStream(new File(XML_DIR, "test.xsd")) },
+ { new InputSource(filenameToURL(XML_DIR + "test.xsd")) } };
}
/**
@@ -163,22 +147,50 @@
* this case the schema source property is set.
* @throws Exception If any errors occur.
*/
- @Test
- public void testCheckSchemaSupport3() throws Exception {
- try (FileInputStream fis = new FileInputStream(new File(
- XML_DIR, "test.xsd"))) {
+ @Test(dataProvider = "schema-source")
+ public void testCheckSchemaSupport2(Object schemaSource) throws Exception {
+ try {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setValidating(true);
+ dbf.setNamespaceAware(true);
+ dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
+ W3C_XML_SCHEMA_NS_URI);
+ dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource);
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ db.setErrorHandler(eh);
+ db.parse(new File(XML_DIR, "test1.xml"));
+ assertFalse(eh.isErrorOccured());
+ } finally {
+ if (schemaSource instanceof Closeable) {
+ ((Closeable) schemaSource).close();
+ }
+ }
+
+ }
+
+ /**
+ * Test the default functionality of schema support method. In
+ * this case the schema source property is set.
+ * @throws Exception If any errors occur.
+ */
+ @Test(dataProvider = "schema-source")
+ public void testCheckSchemaSupport3(Object schemaSource) throws Exception {
+ try {
SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
spf.setValidating(true);
spf.setNamespaceAware(true);
SAXParser sp = spf.newSAXParser();
sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
W3C_XML_SCHEMA_NS_URI);
- sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource",
- new InputSource(fis));
+ sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource);
DefaultHandler dh = new DefaultHandler();
// Not expect any unrecoverable error here.
sp.parse(new File(XML_DIR, "test1.xml"), dh);
+ } finally {
+ if (schemaSource instanceof Closeable) {
+ ((Closeable) schemaSource).close();
+ }
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/validation/ptests/SchemaFactoryTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/validation/ptests/SchemaFactoryTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -27,6 +27,7 @@
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertSame;
+import static org.testng.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.File;
@@ -39,9 +40,12 @@
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
import javax.xml.transform.Source;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
@@ -60,6 +64,7 @@
import org.xml.sax.SAXParseException;
/*
+ * @bug 8080907
* @summary Class containing the test cases for SchemaFactory
*/
@Test(singleThreaded = true)
@@ -68,8 +73,9 @@
@BeforeClass
public void setup() throws SAXException, IOException, ParserConfigurationException {
sf = newSchemaFactory();
+ assertNotNull(sf);
- assertNotNull(sf);
+ ifac = XMLInputFactory.newInstance();
xsd1 = Files.readAllBytes(Paths.get(XML_DIR + "test.xsd"));
xsd2 = Files.readAllBytes(Paths.get(XML_DIR + "test1.xsd"));
@@ -152,11 +158,13 @@
}
@DataProvider(name = "valid-source")
- public Object[][] getValidSource() {
+ public Object[][] getValidSource() throws XMLStreamException {
return new Object[][] {
{ streamSource(xsd1) },
{ saxSource(xsd1) },
- { domSource(xsdDoc1) } };
+ { domSource(xsdDoc1) },
+ { staxStreamSource(xsd1) },
+ { staxEventSource(xsd1) } };
}
@@ -299,6 +307,34 @@
sf.setFeature(null, true);
}
+ @DataProvider(name = "source-feature")
+ public Object[][] getSourceFeature() {
+ return new Object[][] {
+ { StreamSource.FEATURE },
+ { SAXSource.FEATURE },
+ { DOMSource.FEATURE },
+ { DOMSource.FEATURE } };
+
+ }
+
+ /*
+ * Return true for each of the JAXP Source features to indicate that this
+ * SchemaFactory supports all of the built-in JAXP Source types.
+ */
+ @Test(dataProvider = "source-feature")
+ public void testSourceFeatureGet(String sourceFeature) throws Exception {
+ assertTrue(newSchemaFactory().getFeature(sourceFeature));
+ }
+
+ /*
+ * JAXP Source features are read-only because this SchemaFactory always
+ * supports all JAXP Source types.
+ */
+ @Test(dataProvider = "source-feature", expectedExceptions = SAXNotSupportedException.class)
+ public void testSourceFeatureSet(String sourceFeature) throws Exception {
+ newSchemaFactory().setFeature(sourceFeature, false);
+ }
+
@Test(expectedExceptions = IllegalArgumentException.class)
public void testInvalidSchemaLanguage() {
final String INVALID_SCHEMA_LANGUAGE = "http://relaxng.org/ns/structure/1.0";
@@ -337,6 +373,15 @@
return new DOMSource(xsdDoc);
}
+ private Source staxStreamSource(byte[] xsd) throws XMLStreamException {
+ return new StAXSource(ifac.createXMLStreamReader(newInputStream(xsd)));
+ }
+
+ private Source staxEventSource(byte[] xsd) throws XMLStreamException {
+ return new StAXSource(ifac.createXMLEventReader(newInputStream(xsd)));
+ }
+
+
private SchemaFactory newSchemaFactory() {
return SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
}
@@ -346,6 +391,7 @@
private static final String SCHEMA_FACTORY_CLASSNAME = "com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory";
private SchemaFactory sf;
+ private XMLInputFactory ifac;
private byte[] xsd1;
private byte[] xsd2;
private Document xsdDoc1;
--- a/jaxp/test/javax/xml/jaxp/unittest/TEST.properties Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/test/javax/xml/jaxp/unittest/TEST.properties Thu Jun 25 07:13:27 2015 +0000
@@ -1,3 +1,6 @@
# jaxp test uses TestNG
TestNG.dirs = .
+# Declare module dependency
+modules=java.xml
+
--- a/jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/xinclude/Bug6794483Test.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/xinclude/Bug6794483Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,37 +23,47 @@
package javax.xml.parsers.xinclude;
+import static java.lang.System.lineSeparator;
+import static org.testng.Assert.assertEquals;
+
import java.io.File;
-import java.io.IOException;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
-import org.testng.Assert;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
+import org.w3c.dom.NodeList;
/*
- * @bug 6794483
- * @summary Test JAXP parser can parse xml file using <xi:include> to include another xml, which has an empty element.
+ * @bug 6794483 8080908
+ * @summary Test JAXP parser can resolve the included content properly if the
+ * included xml contains an empty tag that ends with "/>", refer to XERCESJ-1134.
*/
public class Bug6794483Test {
@Test
- public final void test() {
- String xml = getClass().getResource("test1.xml").getPath();
- Document doc = parseXmlFile(xml);
+ public final void test() throws Exception {
+ Document doc = parseXmlFile(getClass().getResource("test1.xml").getPath());
+
+ // check node4
+ NodeList nodeList = doc.getElementsByTagName("node4");
+ assertEquals(nodeList.getLength(), 1);
+ assertEquals(nodeList.item(0).getTextContent(), "Node4 Value", "The data of node4 is missed in parsing: " + lineSeparator() + printXmlDoc(doc));
+ // check node6
+ nodeList = doc.getElementsByTagName("node6");
+ assertEquals(nodeList.getLength(), 1);
+ assertEquals(nodeList.item(0).getTextContent(), "Node6 Value", "The data of node6 is missed in parsing: " + lineSeparator() + printXmlDoc(doc));
+ }
+
+ public String printXmlDoc(Document doc) throws Exception {
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
@@ -61,27 +71,16 @@
transformerFact.setAttribute("indent-number", new Integer(4));
Transformer transformer;
- try {
- transformer = transformerFact.newTransformer();
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
- transformer.setOutputProperty(OutputKeys.METHOD, "xml");
- transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");
+ transformer = transformerFact.newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+ transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");
- // "true" indicate Append content If file exist in system
- transformer.transform(new DOMSource(doc), result);
- System.out.println("test" + sw);
-
- } catch (TransformerConfigurationException ex) {
- ex.printStackTrace();
- Assert.fail("unexpected TransformerConfigurationException");
- } catch (TransformerException ex) {
- ex.printStackTrace();
- Assert.fail("unexpected TransformerException");
- }
-
+ transformer.transform(new DOMSource(doc), result);
+ return sw.toString();
}
- public Document parseXmlFile(String fileName) {
+ public Document parseXmlFile(String fileName) throws Exception {
System.out.println("Parsing XML file... " + fileName);
DocumentBuilder docBuilder = null;
Document doc = null;
@@ -92,20 +91,10 @@
docBuilderFactory.setNamespaceAware(true);
docBuilderFactory.setExpandEntityReferences(true);
- try {
- docBuilder = docBuilderFactory.newDocumentBuilder();
- } catch (ParserConfigurationException e) {
- e.printStackTrace();
- }
+ docBuilder = docBuilderFactory.newDocumentBuilder();
File sourceFile = new File(fileName);
- try {
- doc = docBuilder.parse(sourceFile);
- } catch (SAXException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
+ doc = docBuilder.parse(sourceFile);
System.out.println("XML file parsed");
return doc;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/AnyElementTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package javax.xml.validation;
+
+/*
+ * @bug 8080907
+ * @summary Test processContents attribute of any element
+ */
+import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
+
+import java.net.URISyntaxException;
+
+import javax.xml.transform.stream.StreamSource;
+
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class AnyElementTest {
+ @BeforeClass
+ public void setup() throws URISyntaxException, SAXException {
+ validator = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI).newSchema(new StreamSource(getUri("ProcessContents.xsd"))).newValidator();
+ }
+
+ /*
+ * processContents attribute - Specifies how the XML processor should handle
+ * validation against the elements specified by this any element. Can be set
+ * to one of the following:
+ * strict - the XML processor must obtain the schema for the required
+ * namespaces and validate the elements (this is default)
+ * lax - same as strict, but if the schema cannot be obtained, no errors
+ * will occur
+ * skip - The XML processor does not attempt to validate any elements from
+ * the specified namespaces
+ */
+ @Test
+ public void testProcessContents() throws Exception {
+ validator.validate(new StreamSource(getUri("ProcessContents-ok.xml")));
+ }
+
+ /*
+ * When processContents="lax", validation will be performed when the element
+ * is declared in the schema.
+ */
+ @Test(expectedExceptions = SAXParseException.class)
+ public void testProcessContentsLax() throws Exception {
+ validator.validate(new StreamSource(getUri("ProcessContents-lax-error.xml")));
+ }
+
+ /*
+ * Get the URI of the file, which is in the same path as this class
+ */
+ private String getUri(String fileName) throws URISyntaxException {
+ return this.getClass().getResource(fileName).toURI().toASCIIString();
+ }
+
+ private Validator validator;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-lax-error.xml Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<my_lax>
+ <my_int>25.5</my_int>
+</my_lax>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-ok.xml Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<my_strict>
+ <my_int>255</my_int>
+ <my_skip>
+ <my_int>2.55</my_int>
+ <un_define/>
+ <my_lax>
+ <my_int>25.5</my_int>
+ </my_lax>
+ <my_strict>
+ <un_define>TTT</un_define>
+ </my_strict>
+ </my_skip>
+ <my_lax>
+ <my_int>2555</my_int>
+ <un_define>TTT</un_define>
+ <my_strict>
+ <my_int>20</my_int>
+ </my_strict>
+ </my_lax>
+</my_strict>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents.xsd Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+<xs:element name="my_lax">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any processContents="lax" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+</xs:element>
+
+<xs:element name="my_skip">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any processContents="skip" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+</xs:element>
+
+<xs:element name="my_strict">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any maxOccurs="unbounded"/> <!-- by default, processContents="strict" -->
+ </xs:sequence>
+ </xs:complexType>
+</xs:element>
+
+<xs:element name="my_int">
+ <xs:simpleType>
+ <xs:restriction base="xs:int"/>
+ </xs:simpleType>
+</xs:element>
+
+</xs:schema>
\ No newline at end of file
--- a/jaxp/test/javax/xml/jaxp/unittest/org/w3c/dom/ls/LSSerializerTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxp/test/javax/xml/jaxp/unittest/org/w3c/dom/ls/LSSerializerTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -44,6 +44,7 @@
/*
+ * @bug 6439439 8080906
* @summary Test LSSerializer.
*/
public class LSSerializerTest {
@@ -98,6 +99,17 @@
}
}
+ /*
+ * @bug 8080906
+ * It will fail in a Jigsaw build until JDK-8080266 is fixed.
+ */
+ @Test
+ public void testDefaultLSSerializer() throws Exception {
+ DOMImplementationLS domImpl = (DOMImplementationLS) DocumentBuilderFactory.newInstance().newDocumentBuilder().getDOMImplementation();
+ LSSerializer lsSerializer = domImpl.createLSSerializer();
+ Assert.assertTrue(lsSerializer.getClass().getName().endsWith("dom3.LSSerializerImpl"));
+ }
+
@Test
public void testDOMErrorHandler() {
--- a/jaxws/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxws/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -313,3 +313,5 @@
45ef73bb85c12ec1b291835c1d40e342a454e3f0 jdk9-b65
1232f4013417e4a9cd291096798d10f2e601d69d jdk9-b66
c9785bc8ade98a16a050d7520b70c68363857e00 jdk9-b67
+b5878b03d1b2e105917d959fbfa3c57c22495803 jdk9-b68
+f5911c6155c29ac24b6f9068273207e5ebd3a3df jdk9-b69
--- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Thu Jun 25 07:13:27 2015 +0000
@@ -68,6 +68,9 @@
*/
private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";
+ // previous value of JAXBContext.JAXB_CONTEXT_FACTORY, using also this to ensure backwards compatibility
+ private static final String JAXB_CONTEXT_FACTORY_DEPRECATED = "javax.xml.bind.context.factory";
+
private static final Logger logger;
static {
@@ -92,6 +95,14 @@
}
}
+ private static ServiceLoaderUtil.ExceptionHandler<JAXBException> EXCEPTION_HANDLER =
+ new ServiceLoaderUtil.ExceptionHandler<JAXBException>() {
+ @Override
+ public JAXBException createException(Throwable throwable, String message) {
+ return new JAXBException(message, throwable);
+ }
+ };
+
/**
* If the {@link InvocationTargetException} wraps an exception that shouldn't be wrapped,
* throw the wrapped exception.
@@ -159,7 +170,10 @@
}
}
- static JAXBContext newInstance(String contextPath, Class spFactory, ClassLoader classLoader, Map properties) throws JAXBException {
+ static JAXBContext newInstance(String contextPath,
+ Class spFactory,
+ ClassLoader classLoader,
+ Map properties) throws JAXBException {
try {
/*
@@ -239,6 +253,7 @@
Map properties,
Class spFactory) throws JAXBException {
try {
+
Method m = spFactory.getMethod("createContext", Class[].class, Map.class);
Object context = m.invoke(null, classes, properties);
if (!(context instanceof JAXBContext)) {
@@ -246,10 +261,10 @@
throw handleClassCastException(context.getClass(), JAXBContext.class);
}
return (JAXBContext) context;
- } catch (NoSuchMethodException e) {
+
+ } catch (NoSuchMethodException | IllegalAccessException e) {
throw new JAXBException(e);
- } catch (IllegalAccessException e) {
- throw new JAXBException(e);
+
} catch (InvocationTargetException e) {
handleInvocationTargetException(e);
@@ -261,9 +276,10 @@
}
}
- static JAXBContext find(String factoryId, String contextPath, ClassLoader classLoader, Map properties) throws JAXBException {
-
- // TODO: do we want/need another layer of searching in $java.home/lib/jaxb.properties like JAXP?
+ static JAXBContext find(String factoryId,
+ String contextPath,
+ ClassLoader classLoader,
+ Map properties) throws JAXBException {
StringTokenizer packages = new StringTokenizer(contextPath, ":");
if (!packages.hasMoreTokens()) {
@@ -275,106 +291,155 @@
logger.fine("Searching jaxb.properties");
while (packages.hasMoreTokens()) {
// com.acme.foo - > com/acme/foo/jaxb.properties
- String className = classNameFromPackageProperties(factoryId, classLoader, packages.nextToken(":").replace('.', '/'));
- if (className != null) return newInstance(contextPath, className, classLoader, properties);
+ String factoryClassName =
+ classNameFromPackageProperties(
+ classLoader,
+ packages.nextToken(":").replace('.', '/'),
+ factoryId,
+ JAXB_CONTEXT_FACTORY_DEPRECATED);
+
+ if (factoryClassName != null) {
+ return newInstance(contextPath, factoryClassName, classLoader, properties);
+ }
}
String factoryName = classNameFromSystemProperties();
if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties);
- Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger);
+ JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader(
+ JAXBContextFactory.class, logger, EXCEPTION_HANDLER);
+
+ if (obj != null) return obj.createContext(contextPath, classLoader, properties);
+
+ // to ensure backwards compatibility
+ factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader);
+ if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties);
+
+ Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader(
+ "javax.xml.bind.JAXBContext", logger);
+
if (ctxFactory != null) {
return newInstance(contextPath, ctxFactory, classLoader, properties);
}
- // TODO: SPEC change required! This is supposed to be!
- // JAXBContext obj = firstByServiceLoader(JAXBContext.class, EXCEPTION_HANDLER);
- // if (obj != null) return obj;
-
- // TODO: Deprecated - SPEC change required!
- factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader);
- if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties);
-
// else no provider found
logger.fine("Trying to create the platform default provider");
return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties);
}
- static JAXBContext find(Class[] classes, Map properties) throws JAXBException {
+ static JAXBContext find(Class<?>[] classes, Map<String, ?> properties) throws JAXBException {
// search for jaxb.properties in the class loader of each class first
logger.fine("Searching jaxb.properties");
for (final Class c : classes) {
// this classloader is used only to load jaxb.properties, so doing this should be safe.
- if (c.getPackage() == null) continue; // this is possible for primitives, arrays, and classes that are loaded by poorly implemented ClassLoaders
+ // this is possible for primitives, arrays, and classes that are
+ // loaded by poorly implemented ClassLoaders
+ if (c.getPackage() == null) continue;
// TODO: do we want to optimize away searching the same package? org.Foo, org.Bar, com.Baz
// classes from the same package might come from different class loades, so it might be a bad idea
// TODO: it's easier to look things up from the class
// c.getResourceAsStream("jaxb.properties");
- String className = classNameFromPackageProperties(JAXBContext.JAXB_CONTEXT_FACTORY, getClassClassLoader(c), c.getPackage().getName().replace('.', '/'));
- if (className != null) return newInstance(classes, properties, className);
+ String factoryClassName =
+ classNameFromPackageProperties(
+ getClassClassLoader(c),
+ c.getPackage().getName().replace('.', '/'),
+ JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED);
+
+ if (factoryClassName != null) return newInstance(classes, properties, factoryClassName);
}
- String factoryName = classNameFromSystemProperties();
- if (factoryName != null) return newInstance(classes, properties, factoryName);
+ String factoryClassName = classNameFromSystemProperties();
+ if (factoryClassName != null) return newInstance(classes, properties, factoryClassName);
+
+ JAXBContextFactory factory =
+ ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, logger, EXCEPTION_HANDLER);
+
+ if (factory != null) return factory.createContext(classes, properties);
- Class ctxFactoryClass = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger);
+ // to ensure backwards compatibility
+ String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader());
+ if (className != null) return newInstance(classes, properties, className);
+
+ logger.fine("Trying to create the platform default provider");
+ Class ctxFactoryClass =
+ (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger);
+
if (ctxFactoryClass != null) {
return newInstance(classes, properties, ctxFactoryClass);
}
- // TODO: to be removed - deprecated!!! Requires SPEC change!!!
- String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader());
- if (className != null) return newInstance(classes, properties, className);
-
- // // TODO: supposed to be:
- // obj = firstByServiceLoader(JAXBContext.class, EXCEPTION_HANDLER);
- // if (obj != null) return obj;
-
// else no provider found
logger.fine("Trying to create the platform default provider");
return newInstance(classes, properties, PLATFORM_DEFAULT_FACTORY_CLASS);
}
- private static String classNameFromPackageProperties(String factoryId, ClassLoader classLoader, String packageName) throws JAXBException {
+ /**
+ * first factoryId should be the preffered one,
+ * more of those can be provided to support backwards compatibility
+ */
+ private static String classNameFromPackageProperties(ClassLoader classLoader,
+ String packageName,
+ String ... factoryIds) throws JAXBException {
+
String resourceName = packageName + "/jaxb.properties";
logger.log(Level.FINE, "Trying to locate {0}", resourceName);
Properties props = loadJAXBProperties(classLoader, resourceName);
if (props != null) {
- if (props.containsKey(factoryId)) {
- return props.getProperty(factoryId);
- } else {
- throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryId));
+ for(String factoryId : factoryIds) {
+ if (props.containsKey(factoryId)) {
+ return props.getProperty(factoryId);
+ }
}
+ throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryIds[0]));
}
return null;
}
private static String classNameFromSystemProperties() throws JAXBException {
- logger.log(Level.FINE, "Checking system property {0}", JAXBContext.JAXB_CONTEXT_FACTORY);
- // search for a system property second (javax.xml.bind.JAXBContext)
- String factoryClassName = AccessController.doPrivileged(new GetPropertyAction(JAXBContext.JAXB_CONTEXT_FACTORY));
+
+ String factoryClassName = getSystemProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
if (factoryClassName != null) {
- logger.log(Level.FINE, " found {0}", factoryClassName);
return factoryClassName;
- } else { // leave this here to assure compatibility
- logger.fine(" not found");
- logger.log(Level.FINE, "Checking system property {0}", JAXBContext.class.getName());
- factoryClassName = AccessController.doPrivileged(new GetPropertyAction(JAXBContext.class.getName()));
- if (factoryClassName != null) {
- logger.log(Level.FINE, " found {0}", factoryClassName);
- return factoryClassName;
- } else {
- logger.fine(" not found");
- }
+ }
+ // leave this here to assure compatibility
+ factoryClassName = getDeprecatedSystemProperty(JAXB_CONTEXT_FACTORY_DEPRECATED);
+ if (factoryClassName != null) {
+ return factoryClassName;
+ }
+ // leave this here to assure compatibility
+ factoryClassName = getDeprecatedSystemProperty(JAXBContext.class.getName());
+ if (factoryClassName != null) {
+ return factoryClassName;
}
return null;
}
- private static Properties loadJAXBProperties(ClassLoader classLoader, String propFileName) throws JAXBException {
+ private static String getDeprecatedSystemProperty(String property) {
+ String value = getSystemProperty(property);
+ if (value != null) {
+ logger.log(Level.WARNING, "Using non-standard property: {0}. Property {1} should be used instead.",
+ new Object[] {property, JAXBContext.JAXB_CONTEXT_FACTORY});
+ }
+ return value;
+ }
+
+ private static String getSystemProperty(String property) {
+ logger.log(Level.FINE, "Checking system property {0}", property);
+ String value = AccessController.doPrivileged(new GetPropertyAction(property));
+ if (value != null) {
+ logger.log(Level.FINE, " found {0}", value);
+ } else {
+ logger.log(Level.FINE, " not found");
+ }
+ return value;
+ }
+
+ private static Properties loadJAXBProperties(ClassLoader classLoader,
+ String propFileName) throws JAXBException {
Properties props = null;
try {
@@ -480,17 +545,18 @@
}
}
- // TODO: to be removed - SPEC change required
- // ServiceLoaderUtil.firstByServiceLoaderDeprecated should be used instead.
+ // ServiceLoaderUtil.firstByServiceLoaderDeprecated should be used instead.
@Deprecated
- static String firstByServiceLoaderDeprecated(Class spiClass, ClassLoader classLoader) throws JAXBException {
+ static String firstByServiceLoaderDeprecated(Class spiClass,
+ ClassLoader classLoader) throws JAXBException {
+
final String jaxbContextFQCN = spiClass.getName();
logger.fine("Searching META-INF/services");
// search META-INF services next
BufferedReader r = null;
- final String resource = new StringBuilder().append("META-INF/services/").append(jaxbContextFQCN).toString();
+ final String resource = "META-INF/services/" + jaxbContextFQCN;
try {
final InputStream resourceStream =
(classLoader == null) ?
@@ -510,9 +576,6 @@
logger.log(Level.FINE, "Unable to load:{0}", resource);
return null;
}
- } catch (UnsupportedEncodingException e) {
- // should never happen
- throw new JAXBException(e);
} catch (IOException e) {
throw new JAXBException(e);
} finally {
--- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java Thu Jun 25 07:13:27 2015 +0000
@@ -45,29 +45,20 @@
* specialized forms of the method available:
*
* <ul>
- * <li>{@link #newInstance(String,ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br>
- * The JAXBContext instance is initialized from a list of colon
- * separated Java package names. Each java package contains
- * JAXB mapped classes, schema-derived classes and/or user annotated
- * classes. Additionally, the java package may contain JAXB package annotations
- * that must be processed. (see JLS, Section 7.4.1 "Named Packages").
- * </li>
- * <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br>
- * The JAXBContext instance is initialized with class(es)
- * passed as parameter(s) and classes that are statically reachable from
- * these class(es). See {@link #newInstance(Class...)} for details.
- * </li>
+ * <li>{@link #newInstance(String, ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br>
+ * The JAXBContext instance is initialized from a list of colon
+ * separated Java package names. Each java package contains
+ * JAXB mapped classes, schema-derived classes and/or user annotated
+ * classes. Additionally, the java package may contain JAXB package annotations
+ * that must be processed. (see JLS, Section 7.4.1 "Named Packages").
+ * </li>
+ * <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br>
+ * The JAXBContext instance is initialized with class(es)
+ * passed as parameter(s) and classes that are statically reachable from
+ * these class(es). See {@link #newInstance(Class...)} for details.
+ * </li>
* </ul>
*
- * <p>
- * <i><B>SPEC REQUIREMENT:</B> the provider must supply an implementation
- * class containing the following method signatures:</i>
- *
- * <pre>{@code
- * public static JAXBContext createContext( String contextPath, ClassLoader classLoader, Map<String,Object> properties ) throws JAXBException
- * public static JAXBContext createContext( Class[] classes, Map<String,Object> properties ) throws JAXBException
- * }</pre>
- *
* <p><i>
* The following JAXB 1.0 requirement is only required for schema to
* java interface/implementation binding. It does not apply to JAXB annotated
@@ -109,11 +100,11 @@
* any of the schemas listed in the <tt>contextPath</tt>. For example:
*
* <pre>
- * JAXBContext jc = JAXBContext.newInstance( "com.acme.foo:com.acme.bar" );
- * Unmarshaller u = jc.createUnmarshaller();
- * FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // ok
- * BarObject barObj = (BarObject)u.unmarshal( new File( "bar.xml" ) ); // ok
- * BazObject bazObj = (BazObject)u.unmarshal( new File( "baz.xml" ) ); // error, "com.acme.baz" not in contextPath
+ * JAXBContext jc = JAXBContext.newInstance( "com.acme.foo:com.acme.bar" );
+ * Unmarshaller u = jc.createUnmarshaller();
+ * FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // ok
+ * BarObject barObj = (BarObject)u.unmarshal( new File( "bar.xml" ) ); // ok
+ * BazObject bazObj = (BazObject)u.unmarshal( new File( "baz.xml" ) ); // error, "com.acme.baz" not in contextPath
* </pre>
*
* <p>
@@ -146,7 +137,7 @@
* Section 4.2 <i>Java Package</i> of the specification.
*
* <p>
- * <i><B>SPEC REQUIREMENT:</B> the provider must generate a class in each
+ * <i>The provider must generate a class in each
* package that contains all of the necessary object factory methods for that
* package named ObjectFactory as well as the static
* <tt>newInstance( javaContentInterface )</tt> method</i>
@@ -214,6 +205,7 @@
* by the following steps.
*
* <ol>
+ *
* <li>
* For each package/class explicitly passed in to the {@link #newInstance} method, in the order they are specified,
* <tt>jaxb.properties</tt> file is looked up in its package, by using the associated classloader —
@@ -223,7 +215,7 @@
* <p>
* If such a file is discovered, it is {@link Properties#load(InputStream) loaded} as a property file, and
* the value of the {@link #JAXB_CONTEXT_FACTORY} key will be assumed to be the provider factory class.
- * This class is then loaded by the associated classloader discussed above.
+ * This class is then loaded by the associated class loader discussed above.
*
* <p>
* This phase of the look up allows some packages to force the use of a certain JAXB implementation.
@@ -234,10 +226,36 @@
* factory class. This phase of the look up enables per-JVM override of the JAXB implementation.
*
* <li>
- * Look for <tt>/META-INF/services/javax.xml.bind.JAXBContext</tt> file in the associated classloader.
- * This file follows the standard service descriptor convention, and if such a file exists, its content
- * is assumed to be the provider factory class. This phase of the look up is for automatic discovery.
- * It allows users to just put a JAXB implementation in a classpath and use it without any furhter configuration.
+ * Provider of {@link javax.xml.bind.JAXBContextFactory} is loaded using the service-provider loading
+ * facilities, defined by the {@link java.util.ServiceLoader} class, to attempt
+ * to locate and load an implementation of the service using the {@linkplain
+ * java.util.ServiceLoader#load(java.lang.Class) default loading mechanism}: the service-provider loading facility
+ * will use the {@linkplain java.lang.Thread#getContextClassLoader() current thread's context class loader}
+ * to attempt to load the context factory. If the context class loader is null, the
+ * {@linkplain ClassLoader#getSystemClassLoader() system class loader} will be used.
+ * <br>
+ * In case of {@link java.util.ServiceConfigurationError service
+ * configuration error} a {@link javax.xml.bind.JAXBException} will be thrown.
+ * </li>
+ *
+ * <li>
+ * Look for resource {@code /META-INF/services/javax.xml.bind.JAXBContext} using provided class loader.
+ * Methods without class loader parameter use {@code Thread.currentThread().getContextClassLoader()}.
+ * If such a resource exists, its content is assumed to be the provider factory class and must supply
+ * an implementation class containing the following method signatures:
+ *
+ * <pre>
+ *
+ * public static JAXBContext createContext(
+ * String contextPath,
+ * ClassLoader classLoader,
+ * Map<String,Object> properties throws JAXBException
+ *
+ * public static JAXBContext createContext(
+ * Class[] classes,
+ * Map<String,Object> properties ) throws JAXBException
+ * </pre>
+ * This configuration method is deprecated.
*
* <li>
* Finally, if all the steps above fail, then the rest of the look up is unspecified. That said,
@@ -246,17 +264,30 @@
* </ol>
*
* <p>
- * Once the provider factory class is discovered, its
- * <tt>public static JAXBContext createContext(String,ClassLoader,Map)</tt> method
- * (see {@link #newInstance(String, ClassLoader, Map)} for the parameter semantics.)
- * or <tt>public static JAXBContext createContet(Class[],Map)</tt> method
- * (see {@link #newInstance(Class[], Map)} for the parameter semantics) are invoked
+ * Once the provider factory class {@link javax.xml.bind.JAXBContextFactory} is discovered, one of its methods
+ * {@link javax.xml.bind.JAXBContextFactory#createContext(String, ClassLoader, java.util.Map)} or
+ * {@link javax.xml.bind.JAXBContextFactory#createContext(Class[], java.util.Map)} is invoked
* to create a {@link JAXBContext}.
*
- * @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li><li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li><li>Joe Fialli, Sun Microsystems, Inc.</li></ul>
+ * <p/>
+ *
+ * @apiNote
+ * <p>Service discovery method using file /META-INF/services/javax.xml.bind.JAXBContext (described in step 4)
+ * and leveraging provider's static methods is supported only to allow backwards compatibility, but it is strongly
+ * recommended to migrate to standard ServiceLoader mechanism (described in step 3).
+ *
+ * @implNote
+ * Within the last step, if Glassfish AS environment detected, its specific service loader is used to find factory class.
+ *
+ * @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li>
+ * <li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li>
+ * <li>Joe Fialli, Sun Microsystems, Inc.</li></ul>
+ *
* @see Marshaller
* @see Unmarshaller
- * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4.1">S 7.4.1 "Named Packages" in Java Language Specification</a>
+ * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4.1">S 7.4.1 "Named Packages"
+ * in Java Language Specification</a>
+ *
* @since 1.6, JAXB 1.0
*/
public abstract class JAXBContext {
@@ -265,9 +296,7 @@
* The name of the property that contains the name of the class capable
* of creating new <tt>JAXBContext</tt> objects.
*/
- public static final String JAXB_CONTEXT_FACTORY =
- "javax.xml.bind.context.factory";
-
+ public static final String JAXB_CONTEXT_FACTORY = "javax.xml.bind.JAXBContextFactory";
protected JAXBContext() {
}
@@ -275,7 +304,7 @@
/**
* <p>
- * Obtain a new instance of a <tt>JAXBContext</tt> class.
+ * Create a new instance of a <tt>JAXBContext</tt> class.
*
* <p>
* This is a convenience method to invoke the
@@ -300,7 +329,7 @@
/**
* <p>
- * Obtain a new instance of a <tt>JAXBContext</tt> class.
+ * Create a new instance of a <tt>JAXBContext</tt> class.
*
* <p>
* The client application must supply a context path which is a list of
@@ -396,7 +425,7 @@
/**
* <p>
- * Obtain a new instance of a <tt>JAXBContext</tt> class.
+ * Create a new instance of a <tt>JAXBContext</tt> class.
*
* <p>
* This is mostly the same as {@link JAXBContext#newInstance(String, ClassLoader)},
@@ -425,8 +454,9 @@
* </ol>
* @since 1.6, JAXB 2.0
*/
- public static JAXBContext newInstance( String contextPath, ClassLoader classLoader, Map<String,?> properties )
- throws JAXBException {
+ public static JAXBContext newInstance( String contextPath,
+ ClassLoader classLoader,
+ Map<String,?> properties ) throws JAXBException {
return ContextFinder.find(
/* The default property name according to the JAXB spec */
@@ -443,7 +473,7 @@
// TODO: resurrect this once we introduce external annotations
// /**
// * <p>
-// * Obtain a new instance of a <tt>JAXBContext</tt> class.
+// * Create a new instance of a <tt>JAXBContext</tt> class.
// *
// * <p>
// * The client application must supply a list of classes that the new
@@ -479,7 +509,7 @@
// * spec-defined classes will be returned.
// *
// * @return
-// * A new instance of a <tt>JAXBContext</tt>. Always non-null valid object.
+// * A new instance of a <tt>JAXBContext</tt>.
// *
// * @throws JAXBException
// * if an error was encountered while creating the
@@ -517,7 +547,7 @@
/**
* <p>
- * Obtain a new instance of a <tt>JAXBContext</tt> class.
+ * Create a new instance of a <tt>JAXBContext</tt> class.
*
* <p>
* The client application must supply a list of classes that the new
@@ -559,7 +589,7 @@
* spec-defined classes will be returned.
*
* @return
- * A new instance of a <tt>JAXBContext</tt>. Always non-null valid object.
+ * A new instance of a <tt>JAXBContext</tt>.
*
* @throws JAXBException
* if an error was encountered while creating the
@@ -578,7 +608,7 @@
*
* @since 1.6, JAXB 2.0
*/
- public static JAXBContext newInstance( Class... classesToBeBound )
+ public static JAXBContext newInstance( Class<?> ... classesToBeBound )
throws JAXBException {
return newInstance(classesToBeBound,Collections.<String,Object>emptyMap());
@@ -586,7 +616,7 @@
/**
* <p>
- * Obtain a new instance of a <tt>JAXBContext</tt> class.
+ * Create a new instance of a <tt>JAXBContext</tt> class.
*
* <p>
* An overloading of {@link JAXBContext#newInstance(Class...)}
@@ -605,7 +635,7 @@
* in an empty map.
*
* @return
- * A new instance of a <tt>JAXBContext</tt>. Always non-null valid object.
+ * A new instance of a <tt>JAXBContext</tt>.
*
* @throws JAXBException
* if an error was encountered while creating the
@@ -624,7 +654,7 @@
*
* @since 1.6, JAXB 2.0
*/
- public static JAXBContext newInstance( Class[] classesToBeBound, Map<String,?> properties )
+ public static JAXBContext newInstance( Class<?>[] classesToBeBound, Map<String,?> properties )
throws JAXBException {
if (classesToBeBound == null) {
@@ -756,9 +786,9 @@
if (System.getSecurityManager() == null) {
return Thread.currentThread().getContextClassLoader();
} else {
- return (ClassLoader) java.security.AccessController.doPrivileged(
- new java.security.PrivilegedAction() {
- public java.lang.Object run() {
+ return java.security.AccessController.doPrivileged(
+ new java.security.PrivilegedAction<ClassLoader>() {
+ public ClassLoader run() {
return Thread.currentThread().getContextClassLoader();
}
});
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContextFactory.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,109 @@
+/*
+ * 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 javax.xml.bind;
+
+import java.util.Map;
+
+/**
+ * <p>Factory that creates new <code>JAXBContext</code> instances.
+ *
+ * JAXBContextFactory can be located using {@link java.util.ServiceLoader#load(Class)}
+ *
+ * @since 1.9, JAXB 2.3
+ */
+public interface JAXBContextFactory {
+
+ /**
+ * <p>
+ * Create a new instance of a <tt>JAXBContext</tt> class.
+ *
+ * <p>
+ * For semantics see {@link javax.xml.bind.JAXBContext#newInstance(Class[], java.util.Map)}
+ *
+ * @param classesToBeBound
+ * list of java classes to be recognized by the new {@link JAXBContext}.
+ * Can be empty, in which case a {@link JAXBContext} that only knows about
+ * spec-defined classes will be returned.
+ * @param properties
+ * provider-specific properties. Can be null, which means the same thing as passing
+ * in an empty map.
+ *
+ * @return
+ * A new instance of a <tt>JAXBContext</tt>.
+ *
+ * @throws JAXBException
+ * if an error was encountered while creating the
+ * <tt>JAXBContext</tt>, such as (but not limited to):
+ * <ol>
+ * <li>Classes use JAXB annotations incorrectly
+ * <li>Classes have colliding annotations (i.e., two classes with the same type name)
+ * <li>The JAXB implementation was unable to locate
+ * provider-specific out-of-band information (such as additional
+ * files generated at the development time.)
+ * </ol>
+ *
+ * @throws IllegalArgumentException
+ * if the parameter contains {@code null} (i.e., {@code newInstance(null,someMap);})
+ *
+ * @since 1.9, JAXB 2.3
+ */
+ JAXBContext createContext(Class<?>[] classesToBeBound,
+ Map<String, ?> properties ) throws JAXBException;
+
+ /**
+ * <p>
+ * Create a new instance of a <tt>JAXBContext</tt> class.
+ *
+ * <p>
+ * For semantics see {@link javax.xml.bind.JAXBContext#newInstance(String, ClassLoader, java.util.Map)}
+ *
+ * <p>
+ * The interpretation of properties is up to implementations. Implementations should
+ * throw <tt>JAXBException</tt> if it finds properties that it doesn't understand.
+ *
+ * @param contextPath list of java package names that contain schema derived classes
+ * @param classLoader
+ * This class loader will be used to locate the implementation classes.
+ * @param properties
+ * provider-specific properties. Can be null, which means the same thing as passing
+ * in an empty map.
+ *
+ * @return a new instance of a <tt>JAXBContext</tt>
+ * @throws JAXBException if an error was encountered while creating the
+ * <tt>JAXBContext</tt> such as
+ * <ol>
+ * <li>failure to locate either ObjectFactory.class or jaxb.index in the packages</li>
+ * <li>an ambiguity among global elements contained in the contextPath</li>
+ * <li>failure to locate a value for the context factory provider property</li>
+ * <li>mixing schema derived packages from different providers on the same contextPath</li>
+ * </ol>
+ * @since 1.9, JAXB 2.3
+ */
+ JAXBContext createContext(String contextPath,
+ ClassLoader classLoader,
+ Map<String, ?> properties ) throws JAXBException;
+
+}
--- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ServiceLoaderUtil.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ServiceLoaderUtil.java Thu Jun 25 07:13:27 2015 +0000
@@ -25,14 +25,9 @@
package javax.xml.bind;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
import java.util.Iterator;
-import java.util.Properties;
import java.util.ServiceLoader;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -49,27 +44,27 @@
private static final String OSGI_SERVICE_LOADER_CLASS_NAME = "com.sun.org.glassfish.hk2.osgiresourcelocator.ServiceLoader";
private static final String OSGI_SERVICE_LOADER_METHOD_NAME = "lookupProviderClasses";
- static <P> P firstByServiceLoader(Class<P> spiClass, Logger logger) {
+ static <P, T extends Exception> P firstByServiceLoader(Class<P> spiClass,
+ Logger logger,
+ ExceptionHandler<T> handler) throws T {
// service discovery
- ServiceLoader<P> serviceLoader = ServiceLoader.load(spiClass);
- for (P impl : serviceLoader) {
- logger.fine("ServiceProvider loading Facility used; returning object [" + impl.getClass().getName() + "]");
- return impl;
+ try {
+ ServiceLoader<P> serviceLoader = ServiceLoader.load(spiClass);
+
+ for (P impl : serviceLoader) {
+ logger.fine("ServiceProvider loading Facility used; returning object [" +
+ impl.getClass().getName() + "]");
+
+ return impl;
+ }
+ } catch (Throwable t) {
+ throw handler.createException(t, "Error while searching for service [" + spiClass.getName() + "]");
}
return null;
}
- static boolean isOsgi(Logger logger) {
- try {
- Class.forName(OSGI_SERVICE_LOADER_CLASS_NAME);
- return true;
- } catch (ClassNotFoundException ignored) {
- logger.log(Level.FINE, "OSGi classes not found, OSGi not available.", ignored);
- }
- return false;
- }
+ static Object lookupUsingOSGiServiceLoader(String factoryId, Logger logger) {
- static Object lookupUsingOSGiServiceLoader(String factoryId, Logger logger) {
try {
// Use reflection to avoid having any dependendcy on ServiceLoader class
Class serviceClass = Class.forName(factoryId);
@@ -78,39 +73,22 @@
Iterator iter = ((Iterable) m.invoke(null, serviceClass)).iterator();
if (iter.hasNext()) {
Object next = iter.next();
- logger.fine("Found implementation using OSGi facility; returning object [" + next.getClass().getName() + "].");
+ logger.fine("Found implementation using OSGi facility; returning object [" +
+ next.getClass().getName() + "].");
return next;
} else {
return null;
}
- } catch (Exception ignored) {
+ } catch (IllegalAccessException |
+ InvocationTargetException |
+ ClassNotFoundException |
+ NoSuchMethodException ignored) {
+
logger.log(Level.FINE, "Unable to find from OSGi: [" + factoryId + "]", ignored);
return null;
}
}
- static String propertyFileLookup(final String configFullPath, final String factoryId) throws IOException {
- File f = new File(configFullPath);
- String factoryClassName = null;
- if (f.exists()) {
- Properties props = new Properties();
- FileInputStream stream = null;
- try {
- stream = new FileInputStream(f);
- props.load(stream);
- factoryClassName = props.getProperty(factoryId);
- } finally {
- if (stream != null) {
- try {
- stream.close();
- } catch (IOException ignored) {
- }
- }
- }
- }
- return factoryClassName;
- }
-
static void checkPackageAccess(String className) {
// make sure that the current thread has an access to the package of the given name.
SecurityManager s = System.getSecurityManager();
@@ -130,18 +108,12 @@
}
}
- /**
- * Returns instance of required class. It checks package access (security) unless it is defaultClassname. It means if you
- * are trying to instantiate default implementation (fallback), pass the class name to both first and second parameter.
- *
- * @param className class to be instantiated
- * @param isDefaultClassname says whether default implementation class
- * @param handler exception handler - necessary for wrapping exceptions and logging
- * @param <T> Type of exception being thrown (necessary to distinguish between Runtime and checked exceptions)
- * @return instantiated object or throws Runtime/checked exception, depending on ExceptionHandler's type
- * @throws T
- */
- static <T extends Exception> Object newInstance(String className, String defaultImplClassName, final ExceptionHandler<T> handler) throws T {
+ // Returns instance of required class. It checks package access (security)
+ // unless it is defaultClassname. It means if you are trying to instantiate
+ // default implementation (fallback), pass the class name to both first and second parameter.
+ static <T extends Exception> Object newInstance(String className,
+ String defaultImplClassName,
+ final ExceptionHandler<T> handler) throws T {
try {
return safeLoadClass(className, defaultImplClassName, contextClassLoader(handler)).newInstance();
} catch (ClassNotFoundException x) {
@@ -151,7 +123,10 @@
}
}
- static Class safeLoadClass(String className, String defaultImplClassName, ClassLoader classLoader) throws ClassNotFoundException {
+ static Class safeLoadClass(String className,
+ String defaultImplClassName,
+ ClassLoader classLoader) throws ClassNotFoundException {
+
try {
checkPackageAccess(className);
} catch (SecurityException se) {
@@ -165,16 +140,6 @@
return nullSafeLoadClass(className, classLoader);
}
- static String getJavaHomeLibConfigPath(String filename) {
- String javah = AccessController.doPrivileged(new PrivilegedAction<String>() {
- @Override
- public String run() {
- return System.getProperty("java.home");
- }
- });
- return javah + File.separator + "lib" + File.separator + filename;
- }
-
static ClassLoader contextClassLoader(ExceptionHandler exceptionHandler) throws Exception {
try {
return Thread.currentThread().getContextClassLoader();
--- a/jdk/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -310,3 +310,5 @@
ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66
1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
+046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68
+551323004d0ce2f1d4b0e99552f7e0cdcebc6fca jdk9-b69
--- a/jdk/make/lib/Awt2dLibraries.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Awt2dLibraries.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -54,7 +54,7 @@
OPTIMIZATION := HIGHEST, \
CFLAGS := $(CFLAGS_JDKLIB) \
$(BUILD_LIBMLIB_CFLAGS), \
- DISABLED_WARNINGS_gcc := parentheses, \
+ DISABLED_WARNINGS_gcc := parentheses array-bounds, \
DISABLED_WARNINGS_clang := parentheses, \
DISABLED_WARNINGS_solstudio := E_STATEMENT_NOT_REACHED, \
MAPFILE := $(BUILD_LIBMLIB_IMAGE_MAPFILE), \
@@ -491,10 +491,10 @@
SRC := $(LIBJAVAJPEG_SRC), \
INCLUDE_FILES := $(BUILD_LIBJAVAJPEG_INCLUDE_FILES), \
OPTIMIZATION := HIGHEST, \
- CFLAGS := $(CFLAGS_JDKLIB) $(addprefix -I, $(LIBJAVAJPEG_SRC)) \
+ CFLAGS := $(CFLAGS_JDKLIB) $(BUILD_LIBJAVAJPEG_HEADERS) \
$(LIBJAVA_HEADER_FLAGS) \
-I$(SUPPORT_OUTPUTDIR)/headers/java.desktop, \
- DISABLED_WARNINGS_gcc := clobbered parentheses, \
+ DISABLED_WARNINGS_gcc := clobbered parentheses array-bounds, \
DISABLED_WARNINGS_clang := logical-op-parentheses, \
DISABLED_WARNINGS_microsoft := 4267, \
MAPFILE := $(BUILD_LIBJAVAJPEG_MAPFILE), \
--- a/jdk/make/lib/Lib-java.instrument.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-java.instrument.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -61,7 +61,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(LIBINSTRUMENT_SRC), \
OPTIMIZATION := LOW, \
- CFLAGS := $(LIBINSTRUMENT_CFLAGS) $(CFLAGS_WARNINGS_ARE_ERRORS), \
+ CFLAGS := $(LIBINSTRUMENT_CFLAGS), \
CFLAGS_debug := -DJPLIS_LOGGING, \
CFLAGS_release := -DNO_JPLIS_LOGGING, \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libinstrument/mapfile-vers, \
--- a/jdk/make/lib/Lib-java.management.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-java.management.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -50,7 +50,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(LIBMANAGEMENT_SRC), \
OPTIMIZATION := $(LIBMANAGEMENT_OPTIMIZATION), \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_CFLAGS), \
+ CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_CFLAGS), \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
--- a/jdk/make/lib/Lib-jdk.attach.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-jdk.attach.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -39,7 +39,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(call FindSrcDirsForLib, jdk.attach, attach), \
OPTIMIZATION := LOW, \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
+ CFLAGS := $(CFLAGS_JDKLIB) \
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.attach \
$(LIBJAVA_HEADER_FLAGS) $(LIBATTACH_CFLAGS), \
CFLAGS_windows := /Gy, \
--- a/jdk/make/lib/Lib-jdk.hprof.agent.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-jdk.hprof.agent.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -31,7 +31,7 @@
BUILD_LIBHPROF_CFLAGS := $(addprefix -I, $(BUILD_LIBHPROF_SRC)) \
-I$(JDK_TOPDIR)/src/demo/share/jvmti/java_crw_demo
-
+
BUILD_LIBHPROF_LDFLAGS :=
LIBHPROF_OPTIMIZATION := HIGHEST
@@ -46,7 +46,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(BUILD_LIBHPROF_SRC), \
OPTIMIZATION := $(LIBHPROF_OPTIMIZATION), \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
+ CFLAGS := $(CFLAGS_JDKLIB) \
$(BUILD_LIBHPROF_CFLAGS), \
CFLAGS_debug := -DHPROF_LOGGING, \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libhprof/mapfile-vers, \
@@ -75,7 +75,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(LIBJAVA_CRW_DEMO_SRC), \
OPTIMIZATION := LOW, \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
+ CFLAGS := $(CFLAGS_JDKLIB) \
$(addprefix -I, $(LIBJAVA_CRW_DEMO_SRC)), \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjava_crw_demo/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
--- a/jdk/make/lib/Lib-jdk.jdi.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-jdk.jdi.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -44,7 +44,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(LIBDT_SHMEM_SRC), \
OPTIMIZATION := LOW, \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \
+ CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \
$(LIBDT_SHMEM_CPPFLAGS), \
LDFLAGS := $(LDFLAGS_JDKLIB), \
LDFLAGS_windows := -export:jdwpTransport_OnLoad, \
--- a/jdk/make/lib/Lib-jdk.jdwp.agent.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-jdk.jdwp.agent.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -41,7 +41,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(LIBDT_SOCKET_SRC), \
OPTIMIZATION := LOW, \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \
+ CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \
$(LIBDT_SOCKET_CPPFLAGS), \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libdt_socket/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
@@ -77,7 +77,7 @@
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
SRC := $(LIBJDWP_SRC), \
OPTIMIZATION := LOW, \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DJDWP_LOGGING \
+ CFLAGS := $(CFLAGS_JDKLIB) -DJDWP_LOGGING \
$(LIBJDWP_CPPFLAGS) \
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent, \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjdwp/mapfile-vers, \
--- a/jdk/make/lib/Lib-jdk.management.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-jdk.management.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -59,7 +59,7 @@
SRC := $(LIBMANAGEMENT_EXT_SRC), \
LANG := C, \
OPTIMIZATION := $(LIBMANAGEMENT_EXT_OPTIMIZATION), \
- CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_EXT_CFLAGS), \
+ CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_EXT_CFLAGS), \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement_ext/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
--- a/jdk/make/lib/Lib-jdk.sctp.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/lib/Lib-jdk.sctp.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 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
@@ -30,12 +30,8 @@
ifeq ($(OPENJDK_TARGET_OS_TYPE), unix)
ifeq (, $(filter $(OPENJDK_TARGET_OS), macosx aix))
-
- # Suppress unused parameters required by exported JNI functions.
- SCTP_WERROR := -Werror -Wno-error=unused-parameter
- ifeq ($(OPENJDK_TARGET_CPU_ARCH), ppc)
- SCTP_WERROR :=
- endif
+ # DISABLED_WARNINGS_gcc := unused-parameter needed to
+ # suppress unused parameters required by exported JNI functions.
$(eval $(call SetupNativeCompilation,BUILD_LIBSCTP, \
LIBRARY := sctp, \
@@ -49,7 +45,7 @@
$(LIBJAVA_HEADER_FLAGS) \
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.sctp \
-I$(SUPPORT_OUTPUTDIR)/headers/java.base, \
- CFLAGS_linux := $(SCTP_WERROR), \
+ DISABLED_WARNINGS_gcc := unused-parameter, \
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libsctp/mapfile-vers, \
LDFLAGS := $(LDFLAGS_JDKLIB) \
$(call SET_SHARED_LIBRARY_ORIGIN), \
--- a/jdk/make/mapfiles/libjava/mapfile-vers Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/make/mapfiles/libjava/mapfile-vers Thu Jun 25 07:13:27 2015 +0000
@@ -129,11 +129,11 @@
Java_java_lang_ClassLoader_defineClass0;
Java_java_lang_ClassLoader_defineClass1;
Java_java_lang_ClassLoader_defineClass2;
+ Java_java_lang_ClassLoader_findBuiltinLib;
Java_java_lang_ClassLoader_findLoadedClass0;
Java_java_lang_ClassLoader_00024NativeLibrary_find;
Java_java_lang_ClassLoader_00024NativeLibrary_load;
Java_java_lang_ClassLoader_00024NativeLibrary_unload;
- Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib;
Java_java_lang_ClassLoader_registerNatives;
Java_java_lang_Double_longBitsToDouble;
Java_java_lang_Double_doubleToRawLongBits;
--- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java Thu Jun 25 07:13:27 2015 +0000
@@ -58,7 +58,7 @@
*
* @param contextSpi the delegate
* @param provider the provider
- * @param algorithm the algorithm
+ * @param protocol the protocol
*/
protected SSLContext(SSLContextSpi contextSpi, Provider provider,
String protocol) {
--- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java Thu Jun 25 07:13:27 2015 +0000
@@ -49,9 +49,9 @@
/**
* Initializes this context.
*
- * @param km the sources of authentication keys
- * @param tm the sources of peer authentication trust decisions
- * @param random the source of randomness for this generator
+ * @param ah the sources of authentication keys
+ * @param th the sources of peer authentication trust decisions
+ * @param sr the source of randomness for this generator
*/
protected abstract void engineInit(KeyManager[] ah, TrustManager[] th,
SecureRandom sr) throws KeyManagementException;
--- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java Thu Jun 25 07:13:27 2015 +0000
@@ -52,7 +52,6 @@
* The following table lists all the possible SSLPermission target names,
* and for each provides a description of what the permission allows
* and a discussion of the risks of granting code the permission.
- * <P>
*
* <table border=1 cellpadding=5>
* <tr>
--- a/jdk/src/java.base/share/classes/java/io/File.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/io/File.java Thu Jun 25 07:13:27 2015 +0000
@@ -2148,7 +2148,7 @@
* WriteObject is called to save this filename.
* The separator character is saved also so it can be replaced
* in case the path is reconstituted on a different host type.
- * <p>
+ *
* @serialData Default fields followed by separator character.
*/
private synchronized void writeObject(java.io.ObjectOutputStream s)
--- a/jdk/src/java.base/share/classes/java/io/FilePermission.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -27,11 +27,9 @@
import java.security.*;
import java.util.Enumeration;
-import java.util.List;
-import java.util.ArrayList;
+import java.util.StringJoiner;
import java.util.Vector;
-import java.util.Collections;
-import java.util.StringJoiner;
+import java.util.concurrent.ConcurrentHashMap;
import sun.security.util.SecurityConstants;
/**
@@ -288,7 +286,6 @@
* @param path the pathname of the file/directory.
* @param mask the action mask to use.
*/
-
// package private for use by the FilePermissionCollection add method
FilePermission(String path, int mask) {
super(path);
@@ -315,6 +312,7 @@
* <code>null</code> and is implied by this object,
* <code>false</code> otherwise.
*/
+ @Override
public boolean implies(Permission p) {
if (!(p instanceof FilePermission))
return false;
@@ -387,6 +385,7 @@
* pathname and actions as this FilePermission object,
* <code>false</code> otherwise.
*/
+ @Override
public boolean equals(Object obj) {
if (obj == this)
return true;
@@ -407,6 +406,7 @@
*
* @return a hash code value for this object.
*/
+ @Override
public int hashCode() {
return 0;
}
@@ -587,6 +587,7 @@
*
* @return the canonical string representation of the actions.
*/
+ @Override
public String getActions() {
if (actions == null)
actions = getActions(this.mask);
@@ -625,6 +626,7 @@
* @return a new PermissionCollection object suitable for storing
* FilePermissions.
*/
+ @Override
public PermissionCollection newPermissionCollection() {
return new FilePermissionCollection();
}
@@ -689,13 +691,13 @@
implements Serializable
{
// Not serialized; see serialization section at end of class
- private transient List<Permission> perms;
+ private transient ConcurrentHashMap<String, Permission> perms;
/**
* Create an empty FilePermissionCollection object.
*/
public FilePermissionCollection() {
- perms = new ArrayList<>();
+ perms = new ConcurrentHashMap<>();
}
/**
@@ -710,6 +712,7 @@
* @exception SecurityException - if this FilePermissionCollection object
* has been marked readonly
*/
+ @Override
public void add(Permission permission) {
if (! (permission instanceof FilePermission))
throw new IllegalArgumentException("invalid permission: "+
@@ -718,9 +721,31 @@
throw new SecurityException(
"attempt to add a Permission to a readonly PermissionCollection");
- synchronized (this) {
- perms.add(permission);
- }
+ FilePermission fp = (FilePermission)permission;
+
+ // Add permission to map if it is absent, or replace with new
+ // permission if applicable. NOTE: cannot use lambda for
+ // remappingFunction parameter until JDK-8076596 is fixed.
+ perms.merge(fp.getName(), fp,
+ new java.util.function.BiFunction<>() {
+ @Override
+ public Permission apply(Permission existingVal,
+ Permission newVal) {
+ int oldMask = ((FilePermission)existingVal).getMask();
+ int newMask = ((FilePermission)newVal).getMask();
+ if (oldMask != newMask) {
+ int effective = oldMask | newMask;
+ if (effective == newMask) {
+ return newVal;
+ }
+ if (effective != oldMask) {
+ return new FilePermission(fp.getName(), effective);
+ }
+ }
+ return existingVal;
+ }
+ }
+ );
}
/**
@@ -732,26 +757,25 @@
* @return true if "permission" is a proper subset of a permission in
* the set, false if not.
*/
+ @Override
public boolean implies(Permission permission) {
if (! (permission instanceof FilePermission))
return false;
- FilePermission fp = (FilePermission) permission;
+ FilePermission fperm = (FilePermission) permission;
- int desired = fp.getMask();
+ int desired = fperm.getMask();
int effective = 0;
int needed = desired;
- synchronized (this) {
- int len = perms.size();
- for (int i = 0; i < len; i++) {
- FilePermission x = (FilePermission) perms.get(i);
- if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(fp)) {
- effective |= x.getMask();
- if ((effective & desired) == desired)
- return true;
- needed = (desired ^ effective);
+ for (Permission perm : perms.values()) {
+ FilePermission fp = (FilePermission)perm;
+ if (((needed & fp.getMask()) != 0) && fp.impliesIgnoreMask(fperm)) {
+ effective |= fp.getMask();
+ if ((effective & desired) == desired) {
+ return true;
}
+ needed = (desired ^ effective);
}
}
return false;
@@ -763,11 +787,9 @@
*
* @return an enumeration of all the FilePermission objects.
*/
+ @Override
public Enumeration<Permission> elements() {
- // Convert Iterator into Enumeration
- synchronized (this) {
- return Collections.enumeration(perms);
- }
+ return perms.elements();
}
private static final long serialVersionUID = 2202956749081564585L;
@@ -795,10 +817,7 @@
// Don't call out.defaultWriteObject()
// Write out Vector
- Vector<Permission> permissions = new Vector<>(perms.size());
- synchronized (this) {
- permissions.addAll(perms);
- }
+ Vector<Permission> permissions = new Vector<>(perms.values());
ObjectOutputStream.PutField pfields = out.putFields();
pfields.put("permissions", permissions);
@@ -819,7 +838,9 @@
// Get the one we want
@SuppressWarnings("unchecked")
Vector<Permission> permissions = (Vector<Permission>)gfields.get("permissions", null);
- perms = new ArrayList<>(permissions.size());
- perms.addAll(permissions);
+ perms = new ConcurrentHashMap<>(permissions.size());
+ for (Permission perm : permissions) {
+ perms.put(perm.getName(), perm);
+ }
}
}
--- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Thu Jun 25 07:13:27 2015 +0000
@@ -1702,7 +1702,6 @@
native long find(String name);
native void unload(String name, boolean isBuiltin);
- static native String findBuiltinLib(String name);
public NativeLibrary(Class<?> fromClass, String name, boolean isBuiltin) {
this.name = name;
@@ -1861,9 +1860,11 @@
throw new UnsatisfiedLinkError("no " + name + " in java.library.path");
}
+ static native String findBuiltinLib(String name);
+
private static boolean loadLibrary0(Class<?> fromClass, final File file) {
// Check to see if we're attempting to access a static library
- String name = NativeLibrary.findBuiltinLib(file.getName());
+ String name = findBuiltinLib(file.getName());
boolean isBuiltin = (name != null);
if (!isBuiltin) {
name = AccessController.doPrivileged(
--- a/jdk/src/java.base/share/classes/java/lang/Process.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/Process.java Thu Jun 25 07:13:27 2015 +0000
@@ -368,7 +368,7 @@
* Processes returned from {@link ProcessBuilder#start} override the
* default implementation to provide an efficient mechanism to wait
* for process exit.
- * <p>
+ *
* @apiNote
* Using {@link #onExit() onExit} is an alternative to
* {@link #waitFor() waitFor} that enables both additional concurrency
--- a/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java Thu Jun 25 07:13:27 2015 +0000
@@ -71,7 +71,7 @@
* The ability to control processes is also restricted by the native system,
* ProcessHandle provides no more access to, or control over, the native process
* than would be allowed by a native application.
- * <p>
+ *
* @implSpec
* In the case where ProcessHandles cannot be supported then the factory
* methods must consistently throw {@link java.lang.UnsupportedOperationException}.
--- a/jdk/src/java.base/share/classes/java/lang/SecurityManager.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/SecurityManager.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 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
@@ -1447,7 +1447,7 @@
throw new NullPointerException("package name can't be null");
}
- String[] pkgs;
+ String[] restrictedPkgs;
synchronized (packageAccessLock) {
/*
* Do we need to update our property array?
@@ -1457,8 +1457,7 @@
AccessController.doPrivileged(
new PrivilegedAction<>() {
public String run() {
- return java.security.Security.getProperty(
- "package.access");
+ return Security.getProperty("package.access");
}
}
);
@@ -1468,14 +1467,33 @@
// Using a snapshot of packageAccess -- don't care if static field
// changes afterwards; array contents won't change.
- pkgs = packageAccess;
+ restrictedPkgs = packageAccess;
}
/*
* Traverse the list of packages, check for any matches.
*/
- for (String restrictedPkg : pkgs) {
- if (pkg.startsWith(restrictedPkg) || restrictedPkg.equals(pkg + ".")) {
+ final int plen = pkg.length();
+ for (String restrictedPkg : restrictedPkgs) {
+ final int rlast = restrictedPkg.length() - 1;
+
+ // Optimizations:
+ //
+ // If rlast >= plen then restrictedPkg is longer than pkg by at
+ // least one char. This means pkg cannot start with restrictedPkg,
+ // since restrictedPkg will be longer than pkg.
+ //
+ // Similarly if rlast != plen, then pkg + "." cannot be the same
+ // as restrictedPkg, since pkg + "." will have a different length
+ // than restrictedPkg.
+ //
+ if (rlast < plen && pkg.startsWith(restrictedPkg) ||
+ // The following test is equivalent to
+ // restrictedPkg.equals(pkg + ".") but is noticeably more
+ // efficient:
+ rlast == plen && restrictedPkg.startsWith(pkg) &&
+ restrictedPkg.charAt(rlast) == '.')
+ {
checkPermission(
new RuntimePermission("accessClassInPackage." + pkg));
break; // No need to continue; only need to check this once
--- a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Thu Jun 25 07:13:27 2015 +0000
@@ -27,8 +27,6 @@
import static java.lang.invoke.MethodHandleStatics.*;
import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
-import java.lang.reflect.Field;
-import sun.misc.Cleaner;
/**
* A {@code CallSite} is a holder for a variable {@link MethodHandle},
@@ -138,47 +136,9 @@
/**
* {@code CallSite} dependency context.
- * VM uses context class to store nmethod dependencies on the call site target.
- * Can be in 2 states: (a) null; or (b) {@code Cleaner} instance pointing to some Class instance.
- * Lazily initialized when CallSite instance is linked to some indy call site or VM needs
- * it to store dependencies. As a corollary, "null" context means there are no dependencies
- * registered yet. {@code Cleaner} is used in 2 roles:
- * (a) context class access for VM;
- * (b) stale context class cleanup.
- * {@code Cleaner} holds the context class until cleanup action is finished (see {@code PhantomReference}).
- * Though it's impossible to get the context class using {@code Reference.get()}, VM extracts it directly
- * from {@code Reference.referent} field.
- */
- private volatile Cleaner context = null;
-
- /**
- * Default context.
- * VM uses it to initialize non-linked CallSite context.
+ * JVM uses CallSite.context to store nmethod dependencies on the call site target.
*/
- private static class DefaultContext {}
- private static final Cleaner DEFAULT_CONTEXT = makeContext(DefaultContext.class, null);
-
- private static Cleaner makeContext(Class<?> referent, final CallSite holder) {
- return Cleaner.create(referent,
- new Runnable() {
- @Override public void run() {
- MethodHandleNatives.invalidateDependentNMethods(holder);
- }
- });
- }
-
- /** Initialize context class used for nmethod dependency tracking */
- /*package-private*/
- void initContext(Class<?> newContext) {
- // If there are concurrent actions, exactly one succeeds.
- if (context == null) {
- UNSAFE.compareAndSwapObject(this, CONTEXT_OFFSET, /*expected=*/null, makeContext(newContext, this));
- // No need to care about failed CAS attempt.
- // Since initContext is called from indy call site linkage in newContext class, there's no risk
- // that the context class becomes dead while corresponding context cleaner is alive (causing cleanup
- // action in the wrong context).
- }
- }
+ private final MethodHandleNatives.CallSiteContext context = MethodHandleNatives.CallSiteContext.make(this);
/**
* Returns the type of this call site's target.
--- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java Thu Jun 25 07:13:27 2015 +0000
@@ -30,6 +30,7 @@
import static java.lang.invoke.MethodHandleNatives.Constants.*;
import static java.lang.invoke.MethodHandleStatics.*;
import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP;
+import sun.misc.Cleaner;
/**
* The JVM interface for the method handles package is all here.
@@ -61,8 +62,27 @@
static native void setCallSiteTargetNormal(CallSite site, MethodHandle target);
static native void setCallSiteTargetVolatile(CallSite site, MethodHandle target);
- /** Invalidate CallSite context: clean up dependent nmethods and reset call site context to initial state (null). */
- static native void invalidateDependentNMethods(CallSite site);
+ /** Represents a context to track nmethod dependencies on CallSite instance target. */
+ static class CallSiteContext implements Runnable {
+ //@Injected JVM_nmethodBucket* vmdependencies;
+
+ static CallSiteContext make(CallSite cs) {
+ final CallSiteContext newContext = new CallSiteContext();
+ // Cleaner is attached to CallSite instance and it clears native structures allocated for CallSite context.
+ // Though the CallSite can become unreachable, its Context is retained by the Cleaner instance (which is
+ // referenced from Cleaner class) until cleanup is performed.
+ Cleaner.create(cs, newContext);
+ return newContext;
+ }
+
+ @Override
+ public void run() {
+ MethodHandleNatives.clearCallSiteContext(this);
+ }
+ }
+
+ /** Invalidate all recorded nmethods. */
+ private static native void clearCallSiteContext(CallSiteContext context);
private static native void registerNatives();
static {
@@ -235,7 +255,6 @@
return Invokers.linkToTargetMethod(type);
} else {
appendixResult[0] = callSite;
- callSite.initContext(caller);
return Invokers.linkToCallSiteMethod(type);
}
}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedArrayType.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedArrayType.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -39,6 +39,7 @@
* Returns the potentially annotated generic component type of this array type.
*
* @return the potentially annotated generic component type of this array type
+ * @see GenericArrayType#getGenericComponentType()
*/
AnnotatedType getAnnotatedGenericComponentType();
}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -38,6 +38,7 @@
* Returns the potentially annotated actual type arguments of this parameterized type.
*
* @return the potentially annotated actual type arguments of this parameterized type
+ * @see ParameterizedType#getActualTypeArguments()
*/
AnnotatedType[] getAnnotatedActualTypeArguments();
}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedTypeVariable.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedTypeVariable.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -36,8 +36,11 @@
/**
* Returns the potentially annotated bounds of this type variable.
+ * If no bound is explicitly declared, the bound is unannotated
+ * {@code Object}.
*
* @return the potentially annotated bounds of this type variable
+ * @see TypeVariable#getBounds()
*/
AnnotatedType[] getAnnotatedBounds();
}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedWildcardType.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedWildcardType.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -36,15 +36,22 @@
/**
* Returns the potentially annotated lower bounds of this wildcard type.
+ * If no lower bound is explicitly declared, the lower bound is the
+ * type of null. In this case, a zero length array is returned.
*
- * @return the potentially annotated lower bounds of this wildcard type
+ * @return the potentially annotated lower bounds of this wildcard type or
+ * an empty array if no lower bound is explicitly declared.
+ * @see WildcardType#getLowerBounds()
*/
AnnotatedType[] getAnnotatedLowerBounds();
/**
* Returns the potentially annotated upper bounds of this wildcard type.
+ * If no upper bound is explicitly declared, the upper bound is
+ * unannotated {@code Object}
*
* @return the potentially annotated upper bounds of this wildcard type
+ * @see WildcardType#getUpperBounds()
*/
AnnotatedType[] getAnnotatedUpperBounds();
}
--- a/jdk/src/java.base/share/classes/java/lang/reflect/TypeVariable.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/TypeVariable.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -51,7 +51,7 @@
public interface TypeVariable<D extends GenericDeclaration> extends Type, AnnotatedElement {
/**
* Returns an array of {@code Type} objects representing the
- * upper bound(s) of this type variable. Note that if no upper bound is
+ * upper bound(s) of this type variable. If no upper bound is
* explicitly declared, the upper bound is {@code Object}.
*
* <p>For each upper bound B: <ul> <li>if B is a parameterized
@@ -67,7 +67,7 @@
* for any reason
* @return an array of {@code Type}s representing the upper
* bound(s) of this type variable
- */
+ */
Type[] getBounds();
/**
@@ -91,11 +91,11 @@
* Returns an array of AnnotatedType objects that represent the use of
* types to denote the upper bounds of the type parameter represented by
* this TypeVariable. The order of the objects in the array corresponds to
- * the order of the bounds in the declaration of the type parameter.
+ * the order of the bounds in the declaration of the type parameter. Note that
+ * if no upper bound is explicitly declared, the upper bound is unannotated
+ * {@code Object}.
*
- * Returns an array of length 0 if the type parameter declares no bounds.
- *
- * @return an array of objects representing the upper bounds of the type variable
+ * @return an array of objects representing the upper bound(s) of the type variable
* @since 1.8
*/
AnnotatedType[] getAnnotatedBounds();
--- a/jdk/src/java.base/share/classes/java/lang/reflect/WildcardType.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/WildcardType.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -34,7 +34,7 @@
public interface WildcardType extends Type {
/**
* Returns an array of {@code Type} objects representing the upper
- * bound(s) of this type variable. Note that if no upper bound is
+ * bound(s) of this type variable. If no upper bound is
* explicitly declared, the upper bound is {@code Object}.
*
* <p>For each upper bound B :
@@ -57,7 +57,7 @@
/**
* Returns an array of {@code Type} objects representing the
- * lower bound(s) of this type variable. Note that if no lower bound is
+ * lower bound(s) of this type variable. If no lower bound is
* explicitly declared, the lower bound is the type of {@code null}.
* In this case, a zero length array is returned.
*
--- a/jdk/src/java.base/share/classes/java/math/BigInteger.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/math/BigInteger.java Thu Jun 25 07:13:27 2015 +0000
@@ -1963,6 +1963,43 @@
* int array z. The contents of x are not changed.
*/
private static final int[] squareToLen(int[] x, int len, int[] z) {
+ int zlen = len << 1;
+ if (z == null || z.length < zlen)
+ z = new int[zlen];
+
+ // Execute checks before calling intrinsified method.
+ implSquareToLenChecks(x, len, z, zlen);
+ return implSquareToLen(x, len, z, zlen);
+ }
+
+ /**
+ * Parameters validation.
+ */
+ private static void implSquareToLenChecks(int[] x, int len, int[] z, int zlen) throws RuntimeException {
+ if (len < 1) {
+ throw new IllegalArgumentException("invalid input length: " + len);
+ }
+ if (len > x.length) {
+ throw new IllegalArgumentException("input length out of bound: " +
+ len + " > " + x.length);
+ }
+ if (len * 2 > z.length) {
+ throw new IllegalArgumentException("input length out of bound: " +
+ (len * 2) + " > " + z.length);
+ }
+ if (zlen < 1) {
+ throw new IllegalArgumentException("invalid input length: " + zlen);
+ }
+ if (zlen > z.length) {
+ throw new IllegalArgumentException("input length out of bound: " +
+ len + " > " + z.length);
+ }
+ }
+
+ /**
+ * Java Runtime may use intrinsic for this method.
+ */
+ private static final int[] implSquareToLen(int[] x, int len, int[] z, int zlen) {
/*
* The algorithm used here is adapted from Colin Plumb's C library.
* Technique: Consider the partial products in the multiplication
@@ -1997,9 +2034,6 @@
* again. The low bit is simply a copy of the low bit of the
* input, so it doesn't need special care.
*/
- int zlen = len << 1;
- if (z == null || z.length < zlen)
- z = new int[zlen];
// Store the squares, right shifted one bit (i.e., divided by 2)
int lastProductLowWord = 0;
@@ -2857,6 +2891,32 @@
* Multiply an array by one word k and add to result, return the carry
*/
static int mulAdd(int[] out, int[] in, int offset, int len, int k) {
+ implMulAddCheck(out, in, offset, len, k);
+ return implMulAdd(out, in, offset, len, k);
+ }
+
+ /**
+ * Parameters validation.
+ */
+ private static void implMulAddCheck(int[] out, int[] in, int offset, int len, int k) {
+ if (len > in.length) {
+ throw new IllegalArgumentException("input length is out of bound: " + len + " > " + in.length);
+ }
+ if (offset < 0) {
+ throw new IllegalArgumentException("input offset is invalid: " + offset);
+ }
+ if (offset > (out.length - 1)) {
+ throw new IllegalArgumentException("input offset is out of bound: " + offset + " > " + (out.length - 1));
+ }
+ if (len > (out.length - offset)) {
+ throw new IllegalArgumentException("input len is out of bound: " + len + " > " + (out.length - offset));
+ }
+ }
+
+ /**
+ * Java Runtime may use intrinsic for this method.
+ */
+ private static int implMulAdd(int[] out, int[] in, int offset, int len, int k) {
long kLong = k & LONG_MASK;
long carry = 0;
--- a/jdk/src/java.base/share/classes/java/net/SocketPermission.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/net/SocketPermission.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -25,24 +25,24 @@
package java.net;
-import java.util.Enumeration;
-import java.util.Vector;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.StringJoiner;
-import java.util.StringTokenizer;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
+import java.io.Serializable;
import java.net.InetAddress;
+import java.security.AccessController;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.PrivilegedAction;
-import java.security.AccessController;
import java.security.Security;
-import java.io.Serializable;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.Vector;
+import java.util.StringJoiner;
+import java.util.StringTokenizer;
+import java.util.concurrent.ConcurrentSkipListMap;
import sun.net.util.IPAddressUtil;
import sun.net.RegisteredDomain;
import sun.net.PortConfig;
@@ -832,6 +832,7 @@
* @return true if the specified permission is implied by this object,
* false if not.
*/
+ @Override
public boolean implies(Permission p) {
int i,j;
@@ -1010,6 +1011,7 @@
* SocketPermission object. However, port range will be ignored
* in the comparison if <i>obj</i> only contains the action, 'resolve'.
*/
+ @Override
public boolean equals(Object obj) {
if (obj == this)
return true;
@@ -1069,7 +1071,7 @@
*
* @return a hash code value for this object.
*/
-
+ @Override
public int hashCode() {
/*
* If this SocketPermission was initialized with an IP address
@@ -1137,6 +1139,7 @@
*
* @return the canonical string representation of the actions.
*/
+ @Override
public String getActions()
{
if (actions == null)
@@ -1156,7 +1159,7 @@
*
* @return a new PermissionCollection object suitable for storing SocketPermissions.
*/
-
+ @Override
public PermissionCollection newPermissionCollection() {
return new SocketPermissionCollection();
}
@@ -1320,15 +1323,16 @@
implements Serializable
{
// Not serialized; see serialization section at end of class
- private transient List<SocketPermission> perms;
+ // A ConcurrentSkipListMap is used to preserve order, so that most
+ // recently added permissions are checked first (see JDK-4301064).
+ private transient ConcurrentSkipListMap<String, SocketPermission> perms;
/**
* Create an empty SocketPermissions object.
*
*/
-
public SocketPermissionCollection() {
- perms = new ArrayList<>();
+ perms = new ConcurrentSkipListMap<>(new SPCComparator());
}
/**
@@ -1343,6 +1347,7 @@
* @exception SecurityException - if this SocketPermissionCollection object
* has been marked readonly
*/
+ @Override
public void add(Permission permission) {
if (! (permission instanceof SocketPermission))
throw new IllegalArgumentException("invalid permission: "+
@@ -1351,11 +1356,32 @@
throw new SecurityException(
"attempt to add a Permission to a readonly PermissionCollection");
- // optimization to ensure perms most likely to be tested
- // show up early (4301064)
- synchronized (this) {
- perms.add(0, (SocketPermission)permission);
- }
+ SocketPermission sp = (SocketPermission)permission;
+
+ // Add permission to map if it is absent, or replace with new
+ // permission if applicable. NOTE: cannot use lambda for
+ // remappingFunction parameter until JDK-8076596 is fixed.
+ perms.merge(sp.getName(), sp,
+ new java.util.function.BiFunction<>() {
+ @Override
+ public SocketPermission apply(SocketPermission existingVal,
+ SocketPermission newVal) {
+ int oldMask = existingVal.getMask();
+ int newMask = newVal.getMask();
+ if (oldMask != newMask) {
+ int effective = oldMask | newMask;
+ if (effective == newMask) {
+ return newVal;
+ }
+ if (effective != oldMask) {
+ return new SocketPermission(sp.getName(),
+ effective);
+ }
+ }
+ return existingVal;
+ }
+ }
+ );
}
/**
@@ -1367,7 +1393,7 @@
* @return true if "permission" is a proper subset of a permission in
* the collection, false if not.
*/
-
+ @Override
public boolean implies(Permission permission)
{
if (! (permission instanceof SocketPermission))
@@ -1379,18 +1405,15 @@
int effective = 0;
int needed = desired;
- synchronized (this) {
- int len = perms.size();
- //System.out.println("implies "+np);
- for (int i = 0; i < len; i++) {
- SocketPermission x = perms.get(i);
- //System.out.println(" trying "+x);
- if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) {
- effective |= x.getMask();
- if ((effective & desired) == desired)
- return true;
- needed = (desired ^ effective);
+ //System.out.println("implies "+np);
+ for (SocketPermission x : perms.values()) {
+ //System.out.println(" trying "+x);
+ if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) {
+ effective |= x.getMask();
+ if ((effective & desired) == desired) {
+ return true;
}
+ needed = (desired ^ effective);
}
}
return false;
@@ -1402,13 +1425,10 @@
*
* @return an enumeration of all the SocketPermission objects.
*/
-
+ @Override
@SuppressWarnings("unchecked")
public Enumeration<Permission> elements() {
- // Convert Iterator into Enumeration
- synchronized (this) {
- return Collections.enumeration((List<Permission>)(List)perms);
- }
+ return (Enumeration)Collections.enumeration(perms.values());
}
private static final long serialVersionUID = 2787186408602843674L;
@@ -1441,11 +1461,7 @@
// Don't call out.defaultWriteObject()
// Write out Vector
- Vector<SocketPermission> permissions = new Vector<>(perms.size());
-
- synchronized (this) {
- permissions.addAll(perms);
- }
+ Vector<SocketPermission> permissions = new Vector<>(perms.values());
ObjectOutputStream.PutField pfields = out.putFields();
pfields.put("permissions", permissions);
@@ -1466,7 +1482,22 @@
// Get the one we want
@SuppressWarnings("unchecked")
Vector<SocketPermission> permissions = (Vector<SocketPermission>)gfields.get("permissions", null);
- perms = new ArrayList<>(permissions.size());
- perms.addAll(permissions);
+ perms = new ConcurrentSkipListMap<>(new SPCComparator());
+ for (SocketPermission sp : permissions) {
+ perms.put(sp.getName(), sp);
+ }
+ }
+
+ /**
+ * A simple comparator that orders new non-equal entries at the beginning.
+ */
+ private static class SPCComparator implements Comparator<String> {
+ @Override
+ public int compare(String s1, String s2) {
+ if (s1.equals(s2)) {
+ return 0;
+ }
+ return -1;
+ }
}
}
--- a/jdk/src/java.base/share/classes/java/security/BasicPermission.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/security/BasicPermission.java Thu Jun 25 07:13:27 2015 +0000
@@ -25,15 +25,13 @@
package java.security;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
import java.util.Enumeration;
-import java.util.Map;
-import java.util.HashMap;
import java.util.Hashtable;
-import java.util.Collections;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
/**
* The BasicPermission class extends the Permission class, and
@@ -165,6 +163,7 @@
* @return true if the passed permission is equal to or
* implied by this permission, false otherwise.
*/
+ @Override
public boolean implies(Permission p) {
if ((p == null) || (p.getClass() != getClass()))
return false;
@@ -200,6 +199,7 @@
* @return true if {@code obj}'s class is the same as this object's class
* and has the same name as this BasicPermission object, false otherwise.
*/
+ @Override
public boolean equals(Object obj) {
if (obj == this)
return true;
@@ -221,6 +221,7 @@
*
* @return a hash code value for this object.
*/
+ @Override
public int hashCode() {
return this.getName().hashCode();
}
@@ -232,6 +233,7 @@
*
* @return the empty string "".
*/
+ @Override
public String getActions() {
return "";
}
@@ -248,6 +250,7 @@
* @return a new PermissionCollection object suitable for
* storing BasicPermissions.
*/
+ @Override
public PermissionCollection newPermissionCollection() {
return new BasicPermissionCollection(this.getClass());
}
@@ -308,7 +311,7 @@
* collection must be of the same type.
* Not serialized; see serialization section at end of class.
*/
- private transient Map<String, Permission> perms;
+ private transient ConcurrentHashMap<String, Permission> perms;
/**
* This is set to {@code true} if this BasicPermissionCollection
@@ -320,7 +323,7 @@
/**
* The class to which all BasicPermissions in this
- * BasicPermissionCollection belongs.
+ * BasicPermissionCollection belong.
*
* @see #serialPersistentFields
*/
@@ -330,9 +333,8 @@
* Create an empty BasicPermissionCollection object.
*
*/
-
public BasicPermissionCollection(Class<?> clazz) {
- perms = new HashMap<>(11);
+ perms = new ConcurrentHashMap<>(11);
all_allowed = false;
permClass = clazz;
}
@@ -352,6 +354,7 @@
* @exception SecurityException - if this BasicPermissionCollection object
* has been marked readonly
*/
+ @Override
public void add(Permission permission) {
if (! (permission instanceof BasicPermission))
throw new IllegalArgumentException("invalid permission: "+
@@ -373,13 +376,12 @@
permission);
}
- synchronized (this) {
- perms.put(bp.getCanonicalName(), permission);
- }
+ String canonName = bp.getCanonicalName();
+ perms.put(canonName, permission);
// No sync on all_allowed; staleness OK
if (!all_allowed) {
- if (bp.getCanonicalName().equals("*"))
+ if (canonName.equals("*"))
all_allowed = true;
}
}
@@ -393,6 +395,7 @@
* @return true if "permission" is a proper subset of a permission in
* the set, false if not.
*/
+ @Override
public boolean implies(Permission permission) {
if (! (permission instanceof BasicPermission))
return false;
@@ -414,11 +417,7 @@
String path = bp.getCanonicalName();
//System.out.println("check "+path);
- Permission x;
-
- synchronized (this) {
- x = perms.get(path);
- }
+ Permission x = perms.get(path);
if (x != null) {
// we have a direct hit!
@@ -435,9 +434,7 @@
path = path.substring(0, last+1) + "*";
//System.out.println("check "+path);
- synchronized (this) {
- x = perms.get(path);
- }
+ x = perms.get(path);
if (x != null) {
return x.implies(permission);
@@ -456,11 +453,9 @@
*
* @return an enumeration of all the BasicPermission objects.
*/
+ @Override
public Enumeration<Permission> elements() {
- // Convert Iterator of Map values into an Enumeration
- synchronized (this) {
- return Collections.enumeration(perms.values());
- }
+ return perms.elements();
}
// Need to maintain serialization interoperability with earlier releases,
@@ -503,9 +498,7 @@
Hashtable<String, Permission> permissions =
new Hashtable<>(perms.size()*2);
- synchronized (this) {
- permissions.putAll(perms);
- }
+ permissions.putAll(perms);
// Write out serializable fields
ObjectOutputStream.PutField pfields = out.putFields();
@@ -533,7 +526,7 @@
@SuppressWarnings("unchecked")
Hashtable<String, Permission> permissions =
(Hashtable<String, Permission>)gfields.get("permissions", null);
- perms = new HashMap<>(permissions.size()*2);
+ perms = new ConcurrentHashMap<>(permissions.size()*2);
perms.putAll(permissions);
// Get all_allowed
--- a/jdk/src/java.base/share/classes/java/security/CodeSource.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/security/CodeSource.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -34,6 +34,7 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.cert.*;
+import sun.net.util.URLUtil;
/**
*
@@ -73,6 +74,15 @@
private transient CertificateFactory factory = null;
/**
+ * A String form of the URL for use as a key in HashMaps/Sets. The String
+ * form should be behave in the same manner as the URL when compared for
+ * equality in a HashMap/Set, except that no nameservice lookup is done
+ * on the hostname (only string comparison), and the fragment is not
+ * considered.
+ */
+ private transient String locationNoFragString;
+
+ /**
* Constructs a CodeSource and associates it with the specified
* location and set of certificates.
*
@@ -83,6 +93,9 @@
*/
public CodeSource(URL url, java.security.cert.Certificate certs[]) {
this.location = url;
+ if (url != null) {
+ this.locationNoFragString = URLUtil.urlNoFragString(url);
+ }
// Copy the supplied certs
if (certs != null) {
@@ -102,6 +115,9 @@
*/
public CodeSource(URL url, CodeSigner[] signers) {
this.location = url;
+ if (url != null) {
+ this.locationNoFragString = URLUtil.urlNoFragString(url);
+ }
// Copy the supplied signers
if (signers != null) {
@@ -169,6 +185,13 @@
}
/**
+ * Returns a String form of the URL for use as a key in HashMaps/Sets.
+ */
+ String getLocationNoFragString() {
+ return locationNoFragString;
+ }
+
+ /**
* Returns the certificates associated with this CodeSource.
* <p>
* If this CodeSource object was created using the
@@ -588,6 +611,10 @@
} catch (IOException ioe) {
// no signers present
}
+
+ if (location != null) {
+ locationNoFragString = URLUtil.urlNoFragString(location);
+ }
}
/*
--- a/jdk/src/java.base/share/classes/java/security/Permissions.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/security/Permissions.java Thu Jun 25 07:13:27 2015 +0000
@@ -33,6 +33,7 @@
import java.util.List;
import java.util.Iterator;
import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
import java.io.Serializable;
import java.io.ObjectStreamField;
import java.io.ObjectOutputStream;
@@ -85,7 +86,7 @@
* Key is permissions Class, value is PermissionCollection for that class.
* Not serialized; see serialization section at end of class.
*/
- private transient Map<Class<?>, PermissionCollection> permsMap;
+ private transient ConcurrentHashMap<Class<?>, PermissionCollection> permsMap;
// optimization. keep track of whether unresolved permissions need to be
// checked
@@ -99,7 +100,7 @@
* Creates a new Permissions object containing no PermissionCollections.
*/
public Permissions() {
- permsMap = new HashMap<>(11);
+ permsMap = new ConcurrentHashMap<>(11);
allPermission = null;
}
@@ -120,18 +121,14 @@
*
* @see PermissionCollection#isReadOnly()
*/
-
+ @Override
public void add(Permission permission) {
if (isReadOnly())
throw new SecurityException(
"attempt to add a Permission to a readonly Permissions object");
- PermissionCollection pc;
-
- synchronized (this) {
- pc = getPermissionCollection(permission, true);
- pc.add(permission);
- }
+ PermissionCollection pc = getPermissionCollection(permission, true);
+ pc.add(permission);
// No sync; staleness -> optimizations delayed, which is OK
if (permission instanceof AllPermission) {
@@ -169,21 +166,19 @@
* PermissionCollection it
* belongs to, false if not.
*/
-
+ @Override
public boolean implies(Permission permission) {
// No sync; staleness -> skip optimization, which is OK
if (allPermission != null) {
return true; // AllPermission has already been added
} else {
- synchronized (this) {
- PermissionCollection pc = getPermissionCollection(permission,
- false);
- if (pc != null) {
- return pc.implies(permission);
- } else {
- // none found
- return false;
- }
+ PermissionCollection pc = getPermissionCollection(permission,
+ false);
+ if (pc != null) {
+ return pc.implies(permission);
+ } else {
+ // none found
+ return false;
}
}
}
@@ -194,14 +189,12 @@
*
* @return an enumeration of all the Permissions.
*/
-
+ @Override
public Enumeration<Permission> elements() {
// go through each Permissions in the hash table
// and call their elements() function.
- synchronized (this) {
- return new PermissionsEnumerator(permsMap.values().iterator());
- }
+ return new PermissionsEnumerator(permsMap.values().iterator());
}
/**
@@ -236,34 +229,39 @@
* It should be set to true when invoked from add().
*/
private PermissionCollection getPermissionCollection(Permission p,
- boolean createEmpty) {
+ boolean createEmpty) {
Class<?> c = p.getClass();
- PermissionCollection pc = permsMap.get(c);
-
if (!hasUnresolved && !createEmpty) {
- return pc;
- } else if (pc == null) {
+ return permsMap.get(c);
+ }
- // Check for unresolved permissions
- pc = (hasUnresolved ? getUnresolvedPermissions(p) : null);
-
- // if still null, create a new collection
- if (pc == null && createEmpty) {
-
- pc = p.newPermissionCollection();
+ // Create and add permission collection to map if it is absent.
+ // NOTE: cannot use lambda for mappingFunction parameter until
+ // JDK-8076596 is fixed.
+ return permsMap.computeIfAbsent(c,
+ new java.util.function.Function<>() {
+ @Override
+ public PermissionCollection apply(Class<?> k) {
+ // Check for unresolved permissions
+ PermissionCollection pc =
+ (hasUnresolved ? getUnresolvedPermissions(p) : null);
- // still no PermissionCollection?
- // We'll give them a PermissionsHash.
- if (pc == null)
- pc = new PermissionsHash();
- }
+ // if still null, create a new collection
+ if (pc == null && createEmpty) {
+
+ pc = p.newPermissionCollection();
- if (pc != null) {
- permsMap.put(c, pc);
+ // still no PermissionCollection?
+ // We'll give them a PermissionsHash.
+ if (pc == null) {
+ pc = new PermissionsHash();
+ }
+ }
+ return pc;
+ }
}
- }
- return pc;
+ );
}
/**
@@ -277,8 +275,6 @@
*/
private PermissionCollection getUnresolvedPermissions(Permission p)
{
- // Called from within synchronized method so permsMap doesn't need lock
-
UnresolvedPermissionCollection uc =
(UnresolvedPermissionCollection) permsMap.get(UnresolvedPermission.class);
@@ -362,9 +358,7 @@
// Copy perms into a Hashtable
Hashtable<Class<?>, PermissionCollection> perms =
new Hashtable<>(permsMap.size()*2); // no sync; estimate
- synchronized (this) {
- perms.putAll(permsMap);
- }
+ perms.putAll(permsMap);
// Write out serializable fields
ObjectOutputStream.PutField pfields = out.putFields();
@@ -394,7 +388,7 @@
@SuppressWarnings("unchecked")
Hashtable<Class<?>, PermissionCollection> perms =
(Hashtable<Class<?>, PermissionCollection>)gfields.get("perms", null);
- permsMap = new HashMap<>(perms.size()*2);
+ permsMap = new ConcurrentHashMap<>(perms.size()*2);
permsMap.putAll(perms);
// Set hasUnresolved
@@ -481,14 +475,13 @@
* Key and value are (same) permissions objects.
* Not serialized; see serialization section at end of class.
*/
- private transient Map<Permission, Permission> permsMap;
+ private transient ConcurrentHashMap<Permission, Permission> permsMap;
/**
* Create an empty PermissionsHash object.
*/
-
PermissionsHash() {
- permsMap = new HashMap<>(11);
+ permsMap = new ConcurrentHashMap<>(11);
}
/**
@@ -496,11 +489,9 @@
*
* @param permission the Permission object to add.
*/
-
+ @Override
public void add(Permission permission) {
- synchronized (this) {
- permsMap.put(permission, permission);
- }
+ permsMap.put(permission, permission);
}
/**
@@ -512,23 +503,21 @@
* @return true if "permission" is a proper subset of a permission in
* the set, false if not.
*/
-
+ @Override
public boolean implies(Permission permission) {
// attempt a fast lookup and implies. If that fails
// then enumerate through all the permissions.
- synchronized (this) {
- Permission p = permsMap.get(permission);
+ Permission p = permsMap.get(permission);
- // If permission is found, then p.equals(permission)
- if (p == null) {
- for (Permission p_ : permsMap.values()) {
- if (p_.implies(permission))
- return true;
- }
- return false;
- } else {
- return true;
+ // If permission is found, then p.equals(permission)
+ if (p == null) {
+ for (Permission p_ : permsMap.values()) {
+ if (p_.implies(permission))
+ return true;
}
+ return false;
+ } else {
+ return true;
}
}
@@ -537,12 +526,9 @@
*
* @return an enumeration of all the Permissions.
*/
-
+ @Override
public Enumeration<Permission> elements() {
- // Convert Iterator of Map values into an Enumeration
- synchronized (this) {
- return Collections.enumeration(permsMap.values());
- }
+ return permsMap.elements();
}
private static final long serialVersionUID = -8491988220802933440L;
@@ -570,9 +556,7 @@
// Copy perms into a Hashtable
Hashtable<Permission, Permission> perms =
new Hashtable<>(permsMap.size()*2);
- synchronized (this) {
- perms.putAll(permsMap);
- }
+ perms.putAll(permsMap);
// Write out serializable fields
ObjectOutputStream.PutField pfields = out.putFields();
@@ -597,7 +581,7 @@
@SuppressWarnings("unchecked")
Hashtable<Permission, Permission> perms =
(Hashtable<Permission, Permission>)gfields.get("perms", null);
- permsMap = new HashMap<>(perms.size()*2);
+ permsMap = new ConcurrentHashMap<>(perms.size()*2);
permsMap.putAll(perms);
}
}
--- a/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java Thu Jun 25 07:13:27 2015 +0000
@@ -25,9 +25,11 @@
package java.security;
-import java.util.HashMap;
+import java.util.Map;
import java.util.ArrayList;
import java.net.URL;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
import sun.security.util.Debug;
@@ -47,10 +49,17 @@
*/
private final boolean initialized;
- // HashMap that maps CodeSource to ProtectionDomain
- // @GuardedBy("pdcache")
- private final HashMap<CodeSource, ProtectionDomain> pdcache =
- new HashMap<>(11);
+ /*
+ * Map that maps the CodeSource URL (as a String) to ProtectionDomain.
+ * We use a String instead of a CodeSource/URL as the key to avoid
+ * potential expensive name service lookups. This does mean that URLs that
+ * are equivalent after nameservice lookup will be placed in separate
+ * ProtectionDomains; however during policy enforcement these URLs will be
+ * canonicalized and resolved resulting in a consistent set of granted
+ * permissions.
+ */
+ private final Map<String, ProtectionDomain> pdcache
+ = new ConcurrentHashMap<>(11);
private static final Debug debug = Debug.getInstance("scl");
@@ -196,23 +205,32 @@
* Returned cached ProtectionDomain for the specified CodeSource.
*/
private ProtectionDomain getProtectionDomain(CodeSource cs) {
- if (cs == null)
+ if (cs == null) {
return null;
+ }
- ProtectionDomain pd = null;
- synchronized (pdcache) {
- pd = pdcache.get(cs);
- if (pd == null) {
- PermissionCollection perms = getPermissions(cs);
- pd = new ProtectionDomain(cs, perms, this, null);
- pdcache.put(cs, pd);
+ // Use a String form of the URL as the key. It should behave in the
+ // same manner as the URL when compared for equality except that no
+ // nameservice lookup is done on the hostname (String comparison
+ // only), and the fragment is not considered.
+ String key = cs.getLocationNoFragString();
+ if (key == null) {
+ key = "<null>";
+ }
+ return pdcache.computeIfAbsent(key, new Function<>() {
+ @Override
+ public ProtectionDomain apply(String key /* not used */) {
+ PermissionCollection perms
+ = SecureClassLoader.this.getPermissions(cs);
+ ProtectionDomain pd = new ProtectionDomain(
+ cs, perms, SecureClassLoader.this, null);
if (debug != null) {
- debug.println(" getPermissions "+ pd);
+ debug.println(" getPermissions " + pd);
debug.println("");
}
+ return pd;
}
- }
- return pd;
+ });
}
/*
--- a/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -25,11 +25,13 @@
package java.security;
-import java.util.*;
-import java.io.ObjectStreamField;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.io.ObjectStreamField;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* A UnresolvedPermissionCollection stores a collection
@@ -54,14 +56,14 @@
* of the same type.
* Not serialized; see serialization section at end of class.
*/
- private transient Map<String, List<UnresolvedPermission>> perms;
+ private transient ConcurrentHashMap<String, List<UnresolvedPermission>> perms;
/**
* Create an empty UnresolvedPermissionCollection object.
*
*/
public UnresolvedPermissionCollection() {
- perms = new HashMap<>(11);
+ perms = new ConcurrentHashMap<>(11);
}
/**
@@ -70,25 +72,32 @@
*
* @param permission the Permission object to add.
*/
-
- public void add(Permission permission)
- {
+ @Override
+ public void add(Permission permission) {
if (! (permission instanceof UnresolvedPermission))
throw new IllegalArgumentException("invalid permission: "+
permission);
UnresolvedPermission up = (UnresolvedPermission) permission;
- List<UnresolvedPermission> v;
- synchronized (this) {
- v = perms.get(up.getName());
- if (v == null) {
- v = new ArrayList<>();
- perms.put(up.getName(), v);
+ // Add permission to map. NOTE: cannot use lambda for
+ // remappingFunction parameter until JDK-8076596 is fixed.
+ perms.compute(up.getName(),
+ new java.util.function.BiFunction<>() {
+ @Override
+ public List<UnresolvedPermission> apply(String key,
+ List<UnresolvedPermission> oldValue) {
+ if (oldValue == null) {
+ List<UnresolvedPermission> v =
+ new CopyOnWriteArrayList<>();
+ v.add(up);
+ return v;
+ } else {
+ oldValue.add(up);
+ return oldValue;
+ }
+ }
}
- }
- synchronized (v) {
- v.add(up);
- }
+ );
}
/**
@@ -96,17 +105,15 @@
* and return the List containing them.
*/
List<UnresolvedPermission> getUnresolvedPermissions(Permission p) {
- synchronized (this) {
- return perms.get(p.getClass().getName());
- }
+ return perms.get(p.getClass().getName());
}
/**
* always returns false for unresolved permissions
*
*/
- public boolean implies(Permission permission)
- {
+ @Override
+ public boolean implies(Permission permission) {
return false;
}
@@ -116,18 +123,14 @@
*
* @return an enumeration of all the UnresolvedPermission objects.
*/
-
+ @Override
public Enumeration<Permission> elements() {
List<Permission> results =
new ArrayList<>(); // where results are stored
// Get iterator of Map values (which are lists of permissions)
- synchronized (this) {
- for (List<UnresolvedPermission> l : perms.values()) {
- synchronized (l) {
- results.addAll(l);
- }
- }
+ for (List<UnresolvedPermission> l : perms.values()) {
+ results.addAll(l);
}
return Collections.enumeration(results);
@@ -164,19 +167,14 @@
new Hashtable<>(perms.size()*2);
// Convert each entry (List) into a Vector
- synchronized (this) {
- Set<Map.Entry<String, List<UnresolvedPermission>>> set = perms.entrySet();
- for (Map.Entry<String, List<UnresolvedPermission>> e : set) {
- // Convert list into Vector
- List<UnresolvedPermission> list = e.getValue();
- Vector<UnresolvedPermission> vec = new Vector<>(list.size());
- synchronized (list) {
- vec.addAll(list);
- }
+ Set<Map.Entry<String, List<UnresolvedPermission>>> set = perms.entrySet();
+ for (Map.Entry<String, List<UnresolvedPermission>> e : set) {
+ // Convert list into Vector
+ List<UnresolvedPermission> list = e.getValue();
+ Vector<UnresolvedPermission> vec = new Vector<>(list);
- // Add to Hashtable being serialized
- permissions.put(e.getKey(), vec);
- }
+ // Add to Hashtable being serialized
+ permissions.put(e.getKey(), vec);
}
// Write out serializable fields
@@ -203,15 +201,14 @@
Hashtable<String, Vector<UnresolvedPermission>> permissions =
(Hashtable<String, Vector<UnresolvedPermission>>)
gfields.get("permissions", null);
- perms = new HashMap<>(permissions.size()*2);
+ perms = new ConcurrentHashMap<>(permissions.size()*2);
// Convert each entry (Vector) into a List
Set<Map.Entry<String, Vector<UnresolvedPermission>>> set = permissions.entrySet();
for (Map.Entry<String, Vector<UnresolvedPermission>> e : set) {
// Convert Vector into ArrayList
Vector<UnresolvedPermission> vec = e.getValue();
- List<UnresolvedPermission> list = new ArrayList<>(vec.size());
- list.addAll(vec);
+ List<UnresolvedPermission> list = new CopyOnWriteArrayList<>(vec);
// Add to Hashtable being serialized
perms.put(e.getKey(), list);
--- a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Thu Jun 25 07:13:27 2015 +0000
@@ -2374,7 +2374,7 @@
/**
* After reading an object from the input stream, the format
* pattern in the object is verified.
- * <p>
+ *
* @exception InvalidObjectException if the pattern is invalid
*/
private void readObject(ObjectInputStream stream)
--- a/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -61,11 +61,6 @@
private static final int MAX_RUN_COUNT = 67;
/**
- * The maximum length of run in merge sort.
- */
- private static final int MAX_RUN_LENGTH = 33;
-
- /**
* If the length of an array to be sorted is less than this
* constant, Quicksort is used in preference to merge sort.
*/
@@ -121,20 +116,24 @@
// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
+ // Equal items in the beginning of the sequence
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break; // Sequence finishes with equal items
if (a[k] < a[k + 1]) { // ascending
while (++k <= right && a[k - 1] <= a[k]);
} else if (a[k] > a[k + 1]) { // descending
while (++k <= right && a[k - 1] >= a[k]);
+ // Transform into an ascending sequence
for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
}
- } else { // equal
- for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
- if (--m == 0) {
- sort(a, left, right, true);
- return;
- }
- }
+ }
+
+ // Merge a transformed descending sequence followed by an
+ // ascending sequence
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
}
/*
@@ -151,7 +150,7 @@
// Implementation note: variable "right" is increased by 1.
if (run[count] == right++) { // The last run contains one element
run[++count] = right;
- } else if (count == 1) { // The array is already sorted
+ } else if (count <= 1) { // The array is already sorted
return;
}
@@ -569,20 +568,24 @@
// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
+ // Equal items in the beginning of the sequence
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break; // Sequence finishes with equal items
if (a[k] < a[k + 1]) { // ascending
while (++k <= right && a[k - 1] <= a[k]);
} else if (a[k] > a[k + 1]) { // descending
while (++k <= right && a[k - 1] >= a[k]);
+ // Transform into an ascending sequence
for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
long t = a[lo]; a[lo] = a[hi]; a[hi] = t;
}
- } else { // equal
- for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
- if (--m == 0) {
- sort(a, left, right, true);
- return;
- }
- }
+ }
+
+ // Merge a transformed descending sequence followed by an
+ // ascending sequence
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
}
/*
@@ -599,7 +602,7 @@
// Implementation note: variable "right" is increased by 1.
if (run[count] == right++) { // The last run contains one element
run[++count] = right;
- } else if (count == 1) { // The array is already sorted
+ } else if (count <= 1) { // The array is already sorted
return;
}
@@ -1053,20 +1056,24 @@
// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
+ // Equal items in the beginning of the sequence
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break; // Sequence finishes with equal items
if (a[k] < a[k + 1]) { // ascending
while (++k <= right && a[k - 1] <= a[k]);
} else if (a[k] > a[k + 1]) { // descending
while (++k <= right && a[k - 1] >= a[k]);
+ // Transform into an ascending sequence
for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
short t = a[lo]; a[lo] = a[hi]; a[hi] = t;
}
- } else { // equal
- for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
- if (--m == 0) {
- sort(a, left, right, true);
- return;
- }
- }
+ }
+
+ // Merge a transformed descending sequence followed by an
+ // ascending sequence
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
}
/*
@@ -1083,7 +1090,7 @@
// Implementation note: variable "right" is increased by 1.
if (run[count] == right++) { // The last run contains one element
run[++count] = right;
- } else if (count == 1) { // The array is already sorted
+ } else if (count <= 1) { // The array is already sorted
return;
}
@@ -1537,20 +1544,24 @@
// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
+ // Equal items in the beginning of the sequence
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break; // Sequence finishes with equal items
if (a[k] < a[k + 1]) { // ascending
while (++k <= right && a[k - 1] <= a[k]);
} else if (a[k] > a[k + 1]) { // descending
while (++k <= right && a[k - 1] >= a[k]);
+ // Transform into an ascending sequence
for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
char t = a[lo]; a[lo] = a[hi]; a[hi] = t;
}
- } else { // equal
- for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
- if (--m == 0) {
- sort(a, left, right, true);
- return;
- }
- }
+ }
+
+ // Merge a transformed descending sequence followed by an
+ // ascending sequence
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
}
/*
@@ -1567,7 +1578,7 @@
// Implementation note: variable "right" is increased by 1.
if (run[count] == right++) { // The last run contains one element
run[++count] = right;
- } else if (count == 1) { // The array is already sorted
+ } else if (count <= 1) { // The array is already sorted
return;
}
@@ -2117,20 +2128,24 @@
// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
+ // Equal items in the beginning of the sequence
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break; // Sequence finishes with equal items
if (a[k] < a[k + 1]) { // ascending
while (++k <= right && a[k - 1] <= a[k]);
} else if (a[k] > a[k + 1]) { // descending
while (++k <= right && a[k - 1] >= a[k]);
+ // Transform into an ascending sequence
for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
float t = a[lo]; a[lo] = a[hi]; a[hi] = t;
}
- } else { // equal
- for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
- if (--m == 0) {
- sort(a, left, right, true);
- return;
- }
- }
+ }
+
+ // Merge a transformed descending sequence followed by an
+ // ascending sequence
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
}
/*
@@ -2147,7 +2162,7 @@
// Implementation note: variable "right" is increased by 1.
if (run[count] == right++) { // The last run contains one element
run[++count] = right;
- } else if (count == 1) { // The array is already sorted
+ } else if (count <= 1) { // The array is already sorted
return;
}
@@ -2656,20 +2671,24 @@
// Check if the array is nearly sorted
for (int k = left; k < right; run[count] = k) {
+ // Equal items in the beginning of the sequence
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break; // Sequence finishes with equal items
if (a[k] < a[k + 1]) { // ascending
while (++k <= right && a[k - 1] <= a[k]);
} else if (a[k] > a[k + 1]) { // descending
while (++k <= right && a[k - 1] >= a[k]);
+ // Transform into an ascending sequence
for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
double t = a[lo]; a[lo] = a[hi]; a[hi] = t;
}
- } else { // equal
- for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
- if (--m == 0) {
- sort(a, left, right, true);
- return;
- }
- }
+ }
+
+ // Merge a transformed descending sequence followed by an
+ // ascending sequence
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
}
/*
@@ -2686,7 +2705,7 @@
// Implementation note: variable "right" is increased by 1.
if (run[count] == right++) { // The last run contains one element
run[++count] = right;
- } else if (count == 1) { // The array is already sorted
+ } else if (count <= 1) { // The array is already sorted
return;
}
--- a/jdk/src/java.base/share/classes/java/util/PropertyPermission.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/util/PropertyPermission.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -25,18 +25,15 @@
package java.util;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
import java.io.Serializable;
-import java.io.IOException;
import java.security.*;
-import java.util.Map;
-import java.util.HashMap;
import java.util.Enumeration;
import java.util.Hashtable;
-import java.util.Collections;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
import sun.security.util.SecurityConstants;
/**
@@ -162,6 +159,16 @@
}
/**
+ * Creates a PropertyPermission object with the specified name and
+ * a pre-calculated mask. Avoids the overhead of re-computing the mask.
+ * Called by PropertyPermissionCollection.
+ */
+ PropertyPermission(String name, int mask) {
+ super(name, getActions(mask));
+ this.mask = mask;
+ }
+
+ /**
* Checks if this PropertyPermission object "implies" the specified
* permission.
* <P>
@@ -178,6 +185,7 @@
* @return true if the specified permission is implied by this object,
* false if not.
*/
+ @Override
public boolean implies(Permission p) {
if (!(p instanceof PropertyPermission))
return false;
@@ -198,6 +206,7 @@
* @return true if obj is a PropertyPermission, and has the same name and
* actions as this PropertyPermission object.
*/
+ @Override
public boolean equals(Object obj) {
if (obj == this)
return true;
@@ -219,6 +228,7 @@
*
* @return a hash code value for this object.
*/
+ @Override
public int hashCode() {
return this.getName().hashCode();
}
@@ -345,6 +355,7 @@
*
* @return the canonical string representation of the actions.
*/
+ @Override
public String getActions() {
if (actions == null)
actions = getActions(this.mask);
@@ -369,6 +380,7 @@
* @return a new PermissionCollection object suitable for storing
* PropertyPermissions.
*/
+ @Override
public PermissionCollection newPermissionCollection() {
return new PropertyPermissionCollection();
}
@@ -425,7 +437,7 @@
* Key is property name; value is PropertyPermission.
* Not serialized; see serialization section at end of class.
*/
- private transient Map<String, PropertyPermission> perms;
+ private transient ConcurrentHashMap<String, PropertyPermission> perms;
/**
* Boolean saying if "*" is in the collection.
@@ -439,7 +451,7 @@
* Create an empty PropertyPermissionCollection object.
*/
public PropertyPermissionCollection() {
- perms = new HashMap<>(32); // Capacity for default policy
+ perms = new ConcurrentHashMap<>(32); // Capacity for default policy
all_allowed = false;
}
@@ -455,6 +467,7 @@
* @exception SecurityException - if this PropertyPermissionCollection
* object has been marked readonly
*/
+ @Override
public void add(Permission permission) {
if (! (permission instanceof PropertyPermission))
throw new IllegalArgumentException("invalid permission: "+
@@ -466,21 +479,30 @@
PropertyPermission pp = (PropertyPermission) permission;
String propName = pp.getName();
- synchronized (this) {
- PropertyPermission existing = perms.get(propName);
+ // Add permission to map if it is absent, or replace with new
+ // permission if applicable. NOTE: cannot use lambda for
+ // remappingFunction parameter until JDK-8076596 is fixed.
+ perms.merge(propName, pp,
+ new java.util.function.BiFunction<>() {
+ @Override
+ public PropertyPermission apply(PropertyPermission existingVal,
+ PropertyPermission newVal) {
- if (existing != null) {
- int oldMask = existing.getMask();
- int newMask = pp.getMask();
- if (oldMask != newMask) {
- int effective = oldMask | newMask;
- String actions = PropertyPermission.getActions(effective);
- perms.put(propName, new PropertyPermission(propName, actions));
+ int oldMask = existingVal.getMask();
+ int newMask = newVal.getMask();
+ if (oldMask != newMask) {
+ int effective = oldMask | newMask;
+ if (effective == newMask) {
+ return newVal;
+ }
+ if (effective != oldMask) {
+ return new PropertyPermission(propName, effective);
+ }
+ }
+ return existingVal;
}
- } else {
- perms.put(propName, pp);
}
- }
+ );
if (!all_allowed) {
if (propName.equals("*"))
@@ -497,9 +519,10 @@
* @return true if "permission" is a proper subset of a permission in
* the set, false if not.
*/
+ @Override
public boolean implies(Permission permission) {
if (! (permission instanceof PropertyPermission))
- return false;
+ return false;
PropertyPermission pp = (PropertyPermission) permission;
PropertyPermission x;
@@ -509,9 +532,7 @@
// short circuit if the "*" Permission was added
if (all_allowed) {
- synchronized (this) {
- x = perms.get("*");
- }
+ x = perms.get("*");
if (x != null) {
effective |= x.getMask();
if ((effective & desired) == desired)
@@ -526,9 +547,7 @@
String name = pp.getName();
//System.out.println("check "+name);
- synchronized (this) {
- x = perms.get(name);
- }
+ x = perms.get(name);
if (x != null) {
// we have a direct hit!
@@ -546,9 +565,7 @@
name = name.substring(0, last+1) + "*";
//System.out.println("check "+name);
- synchronized (this) {
- x = perms.get(name);
- }
+ x = perms.get(name);
if (x != null) {
effective |= x.getMask();
@@ -569,16 +586,14 @@
*
* @return an enumeration of all the PropertyPermission objects.
*/
+ @Override
@SuppressWarnings("unchecked")
public Enumeration<Permission> elements() {
- // Convert Iterator of Map values into an Enumeration
- synchronized (this) {
- /**
- * Casting to rawtype since Enumeration<PropertyPermission>
- * cannot be directly cast to Enumeration<Permission>
- */
- return (Enumeration)Collections.enumeration(perms.values());
- }
+ /**
+ * Casting to rawtype since Enumeration<PropertyPermission>
+ * cannot be directly cast to Enumeration<Permission>
+ */
+ return (Enumeration)perms.elements();
}
private static final long serialVersionUID = 7015263904581634791L;
@@ -616,9 +631,7 @@
// Copy perms into a Hashtable
Hashtable<String, Permission> permissions =
new Hashtable<>(perms.size()*2);
- synchronized (this) {
- permissions.putAll(perms);
- }
+ permissions.putAll(perms);
// Write out serializable fields
ObjectOutputStream.PutField pfields = out.putFields();
@@ -646,7 +659,7 @@
@SuppressWarnings("unchecked")
Hashtable<String, PropertyPermission> permissions =
(Hashtable<String, PropertyPermission>)gfields.get("permissions", null);
- perms = new HashMap<>(permissions.size()*2);
+ perms = new ConcurrentHashMap<>(permissions.size()*2);
perms.putAll(permissions);
}
}
--- a/jdk/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java Thu Jun 25 07:13:27 2015 +0000
@@ -780,7 +780,9 @@
}
/**
- * Version of firstOfMode used by Spliterator
+ * Version of firstOfMode used by Spliterator. Callers must
+ * recheck if the returned node's item field is null or
+ * self-linked before using.
*/
final Node firstDataNode() {
for (Node p = head; p != null;) {
@@ -953,11 +955,12 @@
Object[] a = new Object[n];
int i = 0;
do {
- if ((a[i] = p.item) != null)
+ Object e = p.item;
+ if (e != p && (a[i] = e) != null)
++i;
if (p == (p = p.next))
p = q.firstDataNode();
- } while (p != null && i < n);
+ } while (p != null && i < n && p.isData);
if ((current = p) == null)
exhausted = true;
if (i > 0) {
@@ -980,11 +983,11 @@
exhausted = true;
do {
Object e = p.item;
+ if (e != null && e != p)
+ action.accept((E)e);
if (p == (p = p.next))
p = q.firstDataNode();
- if (e != null)
- action.accept((E)e);
- } while (p != null);
+ } while (p != null && p.isData);
}
}
@@ -997,10 +1000,11 @@
((p = current) != null || (p = q.firstDataNode()) != null)) {
Object e;
do {
- e = p.item;
+ if ((e = p.item) == p)
+ e = null;
if (p == (p = p.next))
p = q.firstDataNode();
- } while (e == null && p != null);
+ } while (e == null && p != null && p.isData);
if ((current = p) == null)
exhausted = true;
if (e != null) {
--- a/jdk/src/java.base/share/classes/javax/security/auth/Subject.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/javax/security/auth/Subject.java Thu Jun 25 07:13:27 2015 +0000
@@ -1401,8 +1401,6 @@
/**
* Writes this object out to a stream (i.e., serializes it).
*
- * <p>
- *
* @serialData If this is a private credential set,
* a security check is performed to ensure that
* the caller has permission to access each credential
--- a/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java Thu Jun 25 07:13:27 2015 +0000
@@ -74,36 +74,34 @@
* visitor chain to trace the class that is visited at a given point in this
* chain. This may be useful for debugging purposes.
* <p>
- * The trace printed when visiting the <tt>Hello</tt> class is the following:
- * <p>
+ * The trace printed when visiting the {@code Hello} class is the following:
* <blockquote>
*
- * <pre>
+ * <pre>{@code
* // class version 49.0 (49) // access flags 0x21 public class Hello {
*
* // compiled from: Hello.java
*
- * // access flags 0x1 public <init> ()V ALOAD 0 INVOKESPECIAL
- * java/lang/Object <init> ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
+ * // access flags 0x1 public <init> ()V ALOAD 0 INVOKESPECIAL
+ * java/lang/Object <init> ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
*
* // access flags 0x9 public static main ([Ljava/lang/String;)V GETSTATIC
- * java/lang/System out Ljava/io/PrintStream; LDC "hello"
+ * java/lang/System out Ljava/io/PrintStream; LDC "hello"
* INVOKEVIRTUAL java/io/PrintStream println (Ljava/lang/String;)V RETURN
* MAXSTACK = 2 MAXLOCALS = 1 }
- * </pre>
+ * }</pre>
*
- * </blockquote> where <tt>Hello</tt> is defined by:
- * <p>
+ * </blockquote> where {@code Hello} is defined by:
* <blockquote>
*
- * <pre>
+ * <pre>{@code
* public class Hello {
*
* public static void main(String[] args) {
- * System.out.println("hello");
+ * System.out.println("hello");
* }
* }
- * </pre>
+ * }</pre>
*
* </blockquote>
*
@@ -137,7 +135,7 @@
*
* @param cv
* the {@link ClassVisitor} to which this visitor delegates
- * calls. May be <tt>null</tt>.
+ * calls. May be {@code null}.
* @param pw
* the print writer to be used to print the class.
*/
@@ -150,7 +148,7 @@
*
* @param cv
* the {@link ClassVisitor} to which this visitor delegates
- * calls. May be <tt>null</tt>.
+ * calls. May be {@code null}.
* @param p
* the object that actually converts visit events into text.
* @param pw
--- a/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java Thu Jun 25 07:13:27 2015 +0000
@@ -464,7 +464,7 @@
* Report whether a character is safe in a bytecode name.
* This is true of any unicode character except the following
* <em>dangerous characters</em>: {@code ".;:$[]<>/"}.
- * @param s the proposed character
+ * @param c the proposed character
* @return true if the character is safe to use in classfiles
*/
public static boolean isSafeBytecodeChar(char c) {
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,554 +0,0 @@
-/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.misc;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.FileNotFoundException;
-import java.util.StringTokenizer;
-import java.util.Vector;
-import java.util.Enumeration;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-import java.util.jar.Attributes;
-import java.util.jar.Attributes.Name;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
-import java.security.PrivilegedActionException;
-import java.net.URL;
-import java.net.MalformedURLException;
-import sun.net.www.ParseUtil;
-
-/**
- * This class checks dependent extensions a particular jar file may have
- * declared through its manifest attributes.
- * <p>
- * Jar file declared dependent extensions through the extension-list
- * attribute. The extension-list contains a list of keys used to
- * fetch the other attributes describing the required extension.
- * If key is the extension key declared in the extension-list
- * attribute, the following describing attribute can be found in
- * the manifest:
- * <ul>
- * <li>key-Extension-Name: (Specification package name)</li>
- * <li>key-Specification-Version: (Specification-Version)</li>
- * <li>key-Implementation-Version: (Implementation-Version)</li>
- * <li>key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)</li>
- * <li>key-Implementation-Version: (Implementation version)</li>
- * <li>key-Implementation-URL: (URL to download the requested extension)</li>
- * </ul>
- * <p>
- * This class also maintain versioning consistency of installed
- * extensions dependencies declared in jar file manifest.
- *
- * @deprecated this class will be removed in a future release.
- * @author Jerome Dochez
- */
-@Deprecated
-public class ExtensionDependency {
-
- /* Callbak interfaces to delegate installation of missing extensions */
- private static Vector<ExtensionInstallationProvider> providers;
-
- /**
- * Register an ExtensionInstallationProvider. The provider is responsible
- * for handling the installation (upgrade) of any missing extensions.
- *
- * @param eip ExtensionInstallationProvider implementation
- */
- public synchronized static void addExtensionInstallationProvider
- (ExtensionInstallationProvider eip)
- {
- if (providers == null) {
- providers = new Vector<>();
- }
- providers.add(eip);
- }
-
- /**
- * Unregister a previously installed installation provider
- */
- public synchronized static void removeExtensionInstallationProvider
- (ExtensionInstallationProvider eip)
- {
- providers.remove(eip);
- }
-
- /**
- * Checks the dependencies of the jar file on installed extension.
- *
- * @param jar containing the attributes declaring the dependencies
- */
- public static boolean checkExtensionsDependencies(JarFile jar)
- {
- if (providers == null) {
- // no need to bother, nobody is registered to install missing
- // extensions
- return true;
- }
-
- try {
- ExtensionDependency extDep = new ExtensionDependency();
- return extDep.checkExtensions(jar);
- } catch (ExtensionInstallationException e) {
- debug(e.getMessage());
- }
- return false;
- }
-
- /*
- * Check for all declared required extensions in the jar file
- * manifest.
- */
- protected boolean checkExtensions(JarFile jar)
- throws ExtensionInstallationException
- {
- Manifest man;
- try {
- man = jar.getManifest();
- } catch (IOException e) {
- return false;
- }
-
- if (man == null) {
- // The applet does not define a manifest file, so
- // we just assume all dependencies are satisfied.
- return true;
- }
-
- boolean result = true;
- Attributes attr = man.getMainAttributes();
- if (attr != null) {
- // Let's get the list of declared dependencies
- String value = attr.getValue(Name.EXTENSION_LIST);
- if (value != null) {
- StringTokenizer st = new StringTokenizer(value);
- // Iterate over all declared dependencies
- while (st.hasMoreTokens()) {
- String extensionName = st.nextToken();
- debug("The file " + jar.getName() +
- " appears to depend on " + extensionName);
- // Sanity Check
- String extName = extensionName + "-" +
- Name.EXTENSION_NAME.toString();
- if (attr.getValue(extName) == null) {
- debug("The jar file " + jar.getName() +
- " appers to depend on "
- + extensionName + " but does not define the " +
- extName + " attribute in its manifest ");
-
- } else {
- if (!checkExtension(extensionName, attr)) {
- debug("Failed installing " + extensionName);
- result = false;
- }
- }
- }
- } else {
- debug("No dependencies for " + jar.getName());
- }
- }
- return result;
- }
-
-
- /*
- * Check that a particular dependency on an extension is satisfied.
- *
- * @param extensionName is the key used for the attributes in the manifest
- * @param attr is the attributes of the manifest file
- *
- * @return true if the dependency is satisfied by the installed extensions
- */
- protected synchronized boolean checkExtension(final String extensionName,
- final Attributes attr)
- throws ExtensionInstallationException
- {
- debug("Checking extension " + extensionName);
- if (checkExtensionAgainstInstalled(extensionName, attr))
- return true;
-
- debug("Extension not currently installed ");
- ExtensionInfo reqInfo = new ExtensionInfo(extensionName, attr);
- return installExtension(reqInfo, null);
- }
-
- /*
- * Check if a particular extension is part of the currently installed
- * extensions.
- *
- * @param extensionName is the key for the attributes in the manifest
- * @param attr is the attributes of the manifest
- *
- * @return true if the requested extension is already installed
- */
- boolean checkExtensionAgainstInstalled(String extensionName,
- Attributes attr)
- throws ExtensionInstallationException
- {
- File fExtension = checkExtensionExists(extensionName);
-
- if (fExtension != null) {
- // Extension already installed, just check against this one
- try {
- if (checkExtensionAgainst(extensionName, attr, fExtension))
- return true;
- } catch (FileNotFoundException e) {
- debugException(e);
- } catch (IOException e) {
- debugException(e);
- }
- return false;
-
- } else {
- // Not sure if extension is already installed, so check all the
- // installed extension jar files to see if we get a match
-
- File[] installedExts;
-
- try {
- // Get the list of installed extension jar files so we can
- // compare the installed versus the requested extension
- installedExts = getInstalledExtensions();
- } catch(IOException e) {
- debugException(e);
- return false;
- }
-
- for (int i=0;i<installedExts.length;i++) {
- try {
- if (checkExtensionAgainst(extensionName, attr, installedExts[i]))
- return true;
- } catch (FileNotFoundException e) {
- debugException(e);
- } catch (IOException e) {
- debugException(e);
- // let's continue with the next installed extension
- }
- }
- }
- return false;
- }
-
- /*
- * Check if the requested extension described by the attributes
- * in the manifest under the key extensionName is compatible with
- * the jar file.
- *
- * @param extensionName key in the attribute list
- * @param attr manifest file attributes
- * @param file installed extension jar file to compare the requested
- * extension against.
- */
- protected boolean checkExtensionAgainst(String extensionName,
- Attributes attr,
- final File file)
- throws IOException,
- FileNotFoundException,
- ExtensionInstallationException
- {
-
- debug("Checking extension " + extensionName +
- " against " + file.getName());
-
- // Load the jar file ...
- Manifest man;
- try {
- man = AccessController.doPrivileged(
- new PrivilegedExceptionAction<Manifest>() {
- public Manifest run()
- throws IOException, FileNotFoundException {
- if (!file.exists())
- throw new FileNotFoundException(file.getName());
- JarFile jarFile = new JarFile(file);
- return jarFile.getManifest();
- }
- });
- } catch(PrivilegedActionException e) {
- if (e.getException() instanceof FileNotFoundException)
- throw (FileNotFoundException) e.getException();
- throw (IOException) e.getException();
- }
-
- // Construct the extension information object
- ExtensionInfo reqInfo = new ExtensionInfo(extensionName, attr);
- debug("Requested Extension : " + reqInfo);
-
- int isCompatible = ExtensionInfo.INCOMPATIBLE;
- ExtensionInfo instInfo = null;
-
- if (man != null) {
- Attributes instAttr = man.getMainAttributes();
- if (instAttr != null) {
- instInfo = new ExtensionInfo(null, instAttr);
- debug("Extension Installed " + instInfo);
- isCompatible = instInfo.isCompatibleWith(reqInfo);
- switch(isCompatible) {
- case ExtensionInfo.COMPATIBLE:
- debug("Extensions are compatible");
- return true;
-
- case ExtensionInfo.INCOMPATIBLE:
- debug("Extensions are incompatible");
- return false;
-
- default:
- // everything else
- debug("Extensions require an upgrade or vendor switch");
- return installExtension(reqInfo, instInfo);
-
- }
- }
- }
- return false;
- }
-
- /*
- * An required extension is missing, if an ExtensionInstallationProvider is
- * registered, delegate the installation of that particular extension to it.
- *
- * @param reqInfo Missing extension information
- * @param instInfo Older installed version information
- *
- * @return true if the installation is successful
- */
- protected boolean installExtension(ExtensionInfo reqInfo,
- ExtensionInfo instInfo)
- throws ExtensionInstallationException
- {
- Vector<ExtensionInstallationProvider> currentProviders;
- synchronized(providers) {
- @SuppressWarnings("unchecked")
- Vector<ExtensionInstallationProvider> tmp =
- (Vector<ExtensionInstallationProvider>) providers.clone();
- currentProviders = tmp;
- }
- for (Enumeration<ExtensionInstallationProvider> e = currentProviders.elements();
- e.hasMoreElements();) {
- ExtensionInstallationProvider eip = e.nextElement();
-
- if (eip!=null) {
- // delegate the installation to the provider
- if (eip.installExtension(reqInfo, instInfo)) {
- debug(reqInfo.name + " installation successful");
- Launcher.ExtClassLoader cl = (Launcher.ExtClassLoader)
- Launcher.getLauncher().getClassLoader().getParent();
- addNewExtensionsToClassLoader(cl);
- return true;
- }
- }
- }
- // We have tried all of our providers, noone could install this
- // extension, we just return failure at this point
- debug(reqInfo.name + " installation failed");
- return false;
- }
-
- /**
- * Checks if the extension, that is specified in the extension-list in
- * the applet jar manifest, is already installed (i.e. exists in the
- * extension directory).
- *
- * @param extensionName extension name in the extension-list
- *
- * @return the extension if it exists in the extension directory
- */
- private File checkExtensionExists(String extensionName) {
- // Function added to fix bug 4504166
- final String extName = extensionName;
- final String[] fileExt = {".jar", ".zip"};
-
- return AccessController.doPrivileged(
- new PrivilegedAction<File>() {
- public File run() {
- try {
- File fExtension;
- File[] dirs = getExtDirs();
-
- // Search the extension directories for the extension that is specified
- // in the attribute extension-list in the applet jar manifest
- for (int i=0;i<dirs.length;i++) {
- for (int j=0;j<fileExt.length;j++) {
- if (extName.toLowerCase().endsWith(fileExt[j])) {
- fExtension = new File(dirs[i], extName);
- } else {
- fExtension = new File(dirs[i], extName+fileExt[j]);
- }
- debug("checkExtensionExists:fileName " + fExtension.getName());
- if (fExtension.exists()) {
- return fExtension;
- }
- }
- }
- return null;
-
- } catch(Exception e) {
- debugException(e);
- return null;
- }
- }
- });
- }
-
- /**
- * @return the java.ext.dirs property as a list of directory
- */
- private static File[] getExtDirs() {
- String s = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("java.ext.dirs"));
-
- File[] dirs;
- if (s != null) {
- StringTokenizer st =
- new StringTokenizer(s, File.pathSeparator);
- int count = st.countTokens();
- debug("getExtDirs count " + count);
- dirs = new File[count];
- for (int i = 0; i < count; i++) {
- dirs[i] = new File(st.nextToken());
- debug("getExtDirs dirs["+i+"] "+ dirs[i]);
- }
- } else {
- dirs = new File[0];
- debug("getExtDirs dirs " + dirs);
- }
- debug("getExtDirs dirs.length " + dirs.length);
- return dirs;
- }
-
- /*
- * Scan the directories and return all files installed in those
- *
- * @param dirs list of directories to scan
- *
- * @return the list of files installed in all the directories
- */
- private static File[] getExtFiles(File[] dirs) throws IOException {
- Vector<File> urls = new Vector<File>();
- for (int i = 0; i < dirs.length; i++) {
- String[] files = dirs[i].list(new JarFilter());
- if (files != null) {
- debug("getExtFiles files.length " + files.length);
- for (int j = 0; j < files.length; j++) {
- File f = new File(dirs[i], files[j]);
- urls.add(f);
- debug("getExtFiles f["+j+"] "+ f);
- }
- }
- }
- File[] ua = new File[urls.size()];
- urls.copyInto(ua);
- debug("getExtFiles ua.length " + ua.length);
- return ua;
- }
-
- /*
- * @return the list of installed extensions jar files
- */
- private File[] getInstalledExtensions() throws IOException {
- return AccessController.doPrivileged(
- new PrivilegedAction<File[]>() {
- public File[] run() {
- try {
- return getExtFiles(getExtDirs());
- } catch(IOException e) {
- debug("Cannot get list of installed extensions");
- debugException(e);
- return new File[0];
- }
- }
- });
- }
-
- /*
- * Add the newly installed jar file to the extension class loader.
- *
- * @param cl the current installed extension class loader
- *
- * @return true if successful
- */
- private Boolean addNewExtensionsToClassLoader(Launcher.ExtClassLoader cl) {
- try {
- File[] installedExts = getInstalledExtensions();
- for (int i=0;i<installedExts.length;i++) {
- final File instFile = installedExts[i];
- URL instURL = AccessController.doPrivileged(
- new PrivilegedAction<URL>() {
- public URL run() {
- try {
- return ParseUtil.fileToEncodedURL(instFile);
- } catch (MalformedURLException e) {
- debugException(e);
- return null;
- }
- }
- });
- if (instURL != null) {
- URL[] urls = cl.getURLs();
- boolean found=false;
- for (int j = 0; j<urls.length; j++) {
- debug("URL["+j+"] is " + urls[j] + " looking for "+
- instURL);
- if (urls[j].toString().compareToIgnoreCase(
- instURL.toString())==0) {
- found=true;
- debug("Found !");
- }
- }
- if (!found) {
- debug("Not Found ! adding to the classloader " +
- instURL);
- cl.addExtURL(instURL);
- }
- }
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- // let's continue with the next installed extension
- }
- return Boolean.TRUE;
- }
-
- // True to display all debug and trace messages
- static final boolean DEBUG = false;
-
- private static void debug(String s) {
- if (DEBUG) {
- System.err.println(s);
- }
- }
-
- private void debugException(Throwable e) {
- if (DEBUG) {
- e.printStackTrace();
- }
- }
-
-}
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,407 +0,0 @@
-/*
- * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.misc;
-
-import java.util.StringTokenizer;
-import java.util.jar.Attributes;
-import java.util.jar.Attributes.Name;
-import java.util.ResourceBundle;
-import java.util.MissingResourceException;
-import java.text.MessageFormat;
-import java.lang.Character.*;
-
-
-/**
- * This class holds all necessary information to install or
- * upgrade a extension on the user's disk
- *
- * @deprecated this class will be removed in a future release.
- * @author Jerome Dochez
- */
-@Deprecated
-public class ExtensionInfo {
-
- /**
- * public static values returned by the isCompatible method
- */
- public static final int COMPATIBLE = 0;
- public static final int REQUIRE_SPECIFICATION_UPGRADE = 1;
- public static final int REQUIRE_IMPLEMENTATION_UPGRADE = 2;
- public static final int REQUIRE_VENDOR_SWITCH = 3;
- public static final int INCOMPATIBLE = 4;
-
- /**
- * attributes fully describer an extension. The underlying described
- * extension may be installed and requested.
- */
- public String title;
- public String name;
- public String specVersion;
- public String specVendor;
- public String implementationVersion;
- public String vendor;
- public String vendorId;
- public String url;
-
- // For I18N support
- private static final ResourceBundle rb =
- ResourceBundle.getBundle("sun.misc.resources.Messages");
-
-
- /**
- * Create a new uninitialized extension information object
- */
- public ExtensionInfo() {
- }
-
- /**
- * Create and initialize an extension information object.
- * The initialization uses the attributes passed as being
- * the content of a manifest file to load the extension
- * information from.
- * Since manifest file may contain information on several
- * extension they may depend on, the extension key parameter
- * is prepanded to the attribute name to make the key used
- * to retrieve the attribute from the manifest file
- *
- * @param extensionKey unique extension key in the manifest
- * @param attr Attributes of a manifest file
- */
- public ExtensionInfo(String extensionKey, Attributes attr)
- throws NullPointerException
- {
- String s;
- if (extensionKey!=null) {
- s = extensionKey + "-";
- } else {
- s ="";
- }
-
- String attrKey = s + Name.EXTENSION_NAME.toString();
- name = attr.getValue(attrKey);
- if (name != null)
- name = name.trim();
-
- attrKey = s + Name.SPECIFICATION_TITLE.toString();
- title = attr.getValue(attrKey);
- if (title != null)
- title = title.trim();
-
- attrKey = s + Name.SPECIFICATION_VERSION.toString();
- specVersion = attr.getValue(attrKey);
- if (specVersion != null)
- specVersion = specVersion.trim();
-
- attrKey = s + Name.SPECIFICATION_VENDOR.toString();
- specVendor = attr.getValue(attrKey);
- if (specVendor != null)
- specVendor = specVendor.trim();
-
- attrKey = s + Name.IMPLEMENTATION_VERSION.toString();
- implementationVersion = attr.getValue(attrKey);
- if (implementationVersion != null)
- implementationVersion = implementationVersion.trim();
-
- attrKey = s + Name.IMPLEMENTATION_VENDOR.toString();
- vendor = attr.getValue(attrKey);
- if (vendor != null)
- vendor = vendor.trim();
-
- attrKey = s + Name.IMPLEMENTATION_VENDOR_ID.toString();
- vendorId = attr.getValue(attrKey);
- if (vendorId != null)
- vendorId = vendorId.trim();
-
- attrKey =s + Name.IMPLEMENTATION_URL.toString();
- url = attr.getValue(attrKey);
- if (url != null)
- url = url.trim();
- }
-
- /**
- * @return true if the extension described by this extension information
- * is compatible with the extension described by the extension
- * information passed as a parameter
- *
- * @param ei the requested extension information to compare to
- */
- public int isCompatibleWith(ExtensionInfo ei) {
-
- if (name == null || ei.name == null)
- return INCOMPATIBLE;
- if (name.compareTo(ei.name)==0) {
- // is this true, if not spec version is specified, we consider
- // the value as being "any".
- if (specVersion == null || ei.specVersion == null)
- return COMPATIBLE;
-
- int version = compareExtensionVersion(specVersion, ei.specVersion);
- if (version<0) {
- // this extension specification is "older"
- if (vendorId != null && ei.vendorId !=null) {
- if (vendorId.compareTo(ei.vendorId)!=0) {
- return REQUIRE_VENDOR_SWITCH;
- }
- }
- return REQUIRE_SPECIFICATION_UPGRADE;
- } else {
- // the extension spec is compatible, let's look at the
- // implementation attributes
- if (vendorId != null && ei.vendorId != null) {
- // They care who provides the extension
- if (vendorId.compareTo(ei.vendorId)!=0) {
- // They want to use another vendor implementation
- return REQUIRE_VENDOR_SWITCH;
- } else {
- // Vendor matches, let's see the implementation version
- if (implementationVersion != null && ei.implementationVersion != null) {
- // they care about the implementation version
- version = compareExtensionVersion(implementationVersion, ei.implementationVersion);
- if (version<0) {
- // This extension is an older implementation
- return REQUIRE_IMPLEMENTATION_UPGRADE;
- }
- }
- }
- }
- // All othe cases, we consider the extensions to be compatible
- return COMPATIBLE;
- }
- }
- return INCOMPATIBLE;
- }
-
- /**
- * helper method to print sensible information on the undelying described
- * extension
- */
- public String toString() {
- return "Extension : title(" + title + "), name(" + name + "), spec vendor(" +
- specVendor + "), spec version(" + specVersion + "), impl vendor(" +
- vendor + "), impl vendor id(" + vendorId + "), impl version(" +
- implementationVersion + "), impl url(" + url + ")";
- }
-
- /*
- * helper method to compare two versions.
- * version are in the x.y.z.t pattern.
- *
- * @param source version to compare to
- * @param target version used to compare against
- * @return <pre>{@code
- * < 0 if source < version
- * > 0 if source > version
- * = 0 if source = version}</pre>
- */
- private int compareExtensionVersion(String source, String target)
- throws NumberFormatException
- {
- source = source.toLowerCase();
- target = target.toLowerCase();
-
- return strictCompareExtensionVersion(source, target);
- }
-
-
- /*
- * helper method to compare two versions.
- * version are in the x.y.z.t pattern.
- *
- * @param source version to compare to
- * @param target version used to compare against
- * @return <pre>{@code
- * < 0 if source < version
- * > 0 if source > version
- * = 0 if source = version}</pre>
- */
- private int strictCompareExtensionVersion(String source, String target)
- throws NumberFormatException
- {
- if (source.equals(target))
- return 0;
-
- StringTokenizer stk = new StringTokenizer(source, ".,");
- StringTokenizer ttk = new StringTokenizer(target, ".,");
-
- // Compare number
- int n = 0, m = 0, result = 0;
-
- // Convert token into meaning number for comparision
- if (stk.hasMoreTokens())
- n = convertToken(stk.nextToken().toString());
-
- // Convert token into meaning number for comparision
- if (ttk.hasMoreTokens())
- m = convertToken(ttk.nextToken().toString());
-
- if (n > m)
- return 1;
- else if (m > n)
- return -1;
- else
- {
- // Look for index of "." in the string
- int sIdx = source.indexOf('.');
- int tIdx = target.indexOf('.');
-
- if (sIdx == -1)
- sIdx = source.length() - 1;
-
- if (tIdx == -1)
- tIdx = target.length() - 1;
-
- return strictCompareExtensionVersion(source.substring(sIdx + 1),
- target.substring(tIdx + 1));
- }
- }
-
- private int convertToken(String token)
- {
- if (token == null || token.equals(""))
- return 0;
-
- int charValue = 0;
- int charVersion = 0;
- int patchVersion = 0;
- int strLength = token.length();
- int endIndex = strLength;
- char lastChar;
-
- Object[] args = {name};
- MessageFormat mf = new MessageFormat(rb.getString("optpkg.versionerror"));
- String versionError = mf.format(args);
-
- // Look for "-" for pre-release
- int prIndex = token.indexOf('-');
-
- // Look for "_" for patch release
- int patchIndex = token.indexOf('_');
-
- if (prIndex == -1 && patchIndex == -1)
- {
- // This is a FCS release
- try {
- return Integer.parseInt(token) * 100;
- } catch (NumberFormatException e) {
- System.out.println(versionError);
- return 0;
- }
- }
- else if (patchIndex != -1)
- {
- // This is a patch (update) release
- int prversion;
- try {
- // Obtain the version
- prversion = Integer.parseInt(token.substring(0, patchIndex));
-
- // Check to see if the patch version is in the n.n.n_nnl format (special release)
- lastChar = token.charAt(strLength-1);
- if (Character.isLetter(lastChar)) {
- // letters a-z have values from 10-35
- charValue = Character.getNumericValue(lastChar);
- endIndex = strLength-1;
-
- // Obtain the patch version id
- patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex));
-
- if (charValue >= Character.getNumericValue('a') && charValue <= Character.getNumericValue('z')) {
- // This is a special release
- charVersion = (patchVersion * 100) + charValue;
- } else {
- // character is not a a-z letter, ignore
- charVersion = 0;
- System.out.println(versionError);
- }
- } else {
- // This is a regular update release. Obtain the patch version id
- patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex));
- }
- } catch (NumberFormatException e) {
- System.out.println(versionError);
- return 0;
- }
- return prversion * 100 + (patchVersion + charVersion);
- }
- else
- {
- //This is a milestone release, either a early access, alpha, beta, or RC
-
- // Obtain the version
- int mrversion;
- try {
- mrversion = Integer.parseInt(token.substring(0, prIndex));
- } catch (NumberFormatException e) {
- System.out.println(versionError);
- return 0;
- }
-
- // Obtain the patch version string, including the milestone + version
- String prString = token.substring(prIndex + 1);
-
- // Milestone version
- String msVersion = "";
- int delta = 0;
-
- if (prString.indexOf("ea") != -1)
- {
- msVersion = prString.substring(2);
- delta = 50;
- }
- else if (prString.indexOf("alpha") != -1)
- {
- msVersion = prString.substring(5);
- delta = 40;
- }
- else if (prString.indexOf("beta") != -1)
- {
- msVersion = prString.substring(4);
- delta = 30;
- }
- else if (prString.indexOf("rc") != -1)
- {
- msVersion = prString.substring(2);
- delta = 20;
- }
-
- if (msVersion == null || msVersion.equals(""))
- {
- // No version after the milestone, assume 0
- return mrversion * 100 - delta ;
- }
- else
- {
- // Convert the milestone version
- try {
- return mrversion * 100 - delta + Integer.parseInt(msVersion);
- } catch (NumberFormatException e) {
- System.out.println(versionError);
- return 0;
- }
- }
- }
- }
-}
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationException.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.misc;
-
-/*
- * Exception when installation of an extension has failed for
- * any reason
- *
- * @deprecated this class will be removed in a future release.
- * @author Jerome Dochez
- */
-@Deprecated
-public class ExtensionInstallationException extends Exception {
-
- static final long serialVersionUID = 3139688306909345924L;
-
- /*
- * <p>
- * Construct a new exception with an exception reason
- * </p>
- */
- public ExtensionInstallationException(String s) {
- super(s);
- }
-}
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationProvider.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
- * 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.misc;
-
-/**
- * This interface defines the contract a extension installation capable
- * provided to the extension installation dependency mechanism to
- * install new extensions on the user's disk
- *
- * @deprecated this class will be removed in a future release.
- * @author Jerome Dochez
- */
-@Deprecated
-public interface ExtensionInstallationProvider {
-
- /*
- * <p>
- * Request the installation of an extension in the extension directory
- * </p>
- *
- * @param requestExtInfo information on the extension that need to be
- * installed
- * @param installedExtInfo information on the current compatible installed
- * extension. Can be null if no current installation has been found.
- * @return true if the installation is successful, false if the
- * installation could not be attempted.
- * @exception ExtensionInstallationException if an installation was
- * attempted but did not succeed.
- */
- boolean installExtension(ExtensionInfo requestExtInfo,
- ExtensionInfo installedExtInfo)
- throws ExtensionInstallationException;
-}
--- a/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java Thu Jun 25 07:13:27 2015 +0000
@@ -31,7 +31,7 @@
* This class provides input and output streams for telnet clients.
* This class overrides read to do CRLF processing as specified in
* RFC 854. The class assumes it is running on a system where lines
- * are terminated with a single newline <LF> character.
+ * are terminated with a single newline {@literal <LF>} character.
*
* This is the relevant section of RFC 824 regarding CRLF processing:
*
--- a/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java Thu Jun 25 07:13:27 2015 +0000
@@ -31,7 +31,7 @@
* This class provides input and output streams for telnet clients.
* This class overrides write to do CRLF processing as specified in
* RFC 854. The class assumes it is running on a system where lines
- * are terminated with a single newline <LF> character.
+ * are terminated with a single newline {@literal <LF>} character.
*
* This is the relevant section of RFC 824 regarding CRLF processing:
*
--- a/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java Thu Jun 25 07:13:27 2015 +0000
@@ -28,10 +28,12 @@
/**
* Helper class to map URL "abbreviations" to real URLs.
* The default implementation supports the following mappings:
+ * <pre>{@code
* ftp.mumble.bar/... => ftp://ftp.mumble.bar/...
* gopher.mumble.bar/... => gopher://gopher.mumble.bar/...
* other.name.dom/... => http://other.name.dom/...
* /foo/... => file:/foo/...
+ * }</pre>
*
* Full URLs (those including a protocol name) are passed through unchanged.
*
--- a/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java Thu Jun 25 07:13:27 2015 +0000
@@ -1211,7 +1211,7 @@
* The <code>OutputStream</code> is not closed by this method at the end
* of the transfer.
*
- * @param name a <code>String<code> containing the name of the file to
+ * @param name a {@code String} containing the name of the file to
* retreive from the server.
* @param local the <code>OutputStream</code> the file should be written to.
* @throws IOException if the transfer fails.
--- a/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java Thu Jun 25 07:13:27 2015 +0000
@@ -411,7 +411,7 @@
}
/** Convert a message-id string to canonical form (strips off
- leading and trailing <>s) */
+ leading and trailing {@literal <>s}) */
public static String canonicalID(String id) {
if (id == null)
return "";
--- a/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java Thu Jun 25 07:13:27 2015 +0000
@@ -625,7 +625,7 @@
}
/** Parse the first line of the HTTP request. It usually looks
- something like: "HTTP/1.0 <number> comment\r\n". */
+ something like: {@literal "HTTP/1.0 <number> comment\r\n"}. */
public boolean parseHTTP(MessageHeader responses, ProgressSource pi, HttpURLConnection httpuc)
throws IOException {
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Thu Jun 25 07:13:27 2015 +0000
@@ -68,13 +68,14 @@
* <LI>Disconnect</LI>
* </UL>
* You should not have to use it directly in most cases because all will be handled
- * in a abstract layer. Here is an example of how to use the class :
- * <P>
- * <code>URL url = new URL("ftp://ftp.sun.com/pub/test.txt");<p>
- * UrlConnection con = url.openConnection();<p>
- * InputStream is = con.getInputStream();<p>
- * ...<p>
- * is.close();</code>
+ * in a abstract layer. Here is an example of how to use the class:
+ * <pre>{@code
+ * URL url = new URL("ftp://ftp.sun.com/pub/test.txt");
+ * UrlConnection con = url.openConnection();
+ * InputStream is = con.getInputStream();
+ * ...
+ * is.close();
+ * }</pre>
*
* @see sun.net.ftp.FtpClient
*/
@@ -158,7 +159,7 @@
/**
* Creates an FtpURLConnection from a URL.
*
- * @param url The <code>URL</code> to retrieve or store.
+ * @param url The {@code URL} to retrieve or store.
*/
public FtpURLConnection(URL url) {
this(url, null);
@@ -382,7 +383,7 @@
* Get the InputStream to retreive the remote file. It will issue the
* "get" (or "dir") command to the ftp server.
*
- * @return the <code>InputStream</code> to the connection.
+ * @return the {@code InputStream} to the connection.
*
* @throws IOException if already opened for output
* @throws FtpProtocolException if errors occur during the transfert.
@@ -495,7 +496,7 @@
* Get the OutputStream to store the remote file. It will issue the
* "put" command to the ftp server.
*
- * @return the <code>OutputStream</code> to the connection.
+ * @return the {@code OutputStream} to the connection.
*
* @throws IOException if already opened for input or the URL
* points to a directory
@@ -548,9 +549,9 @@
}
/**
- * Gets the <code>Permission</code> associated with the host & port.
+ * Gets the {@code Permission} associated with the host and port.
*
- * @return The <code>Permission</code> object.
+ * @return The {@code Permission} object.
*/
@Override
public Permission getPermission() {
@@ -568,7 +569,7 @@
* exists, overwrite its value with the new value.
*
* @param key the keyword by which the request is known
- * (e.g., "<code>accept</code>").
+ * (e.g., "{@code accept}").
* @param value the value associated with it.
* @throws IllegalStateException if already connected
* @see #getRequestProperty(java.lang.String)
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java Thu Jun 25 07:13:27 2015 +0000
@@ -59,6 +59,7 @@
* supplied or could be found.
* <P>
* Example:
+ * <pre>{@code
* --> GET http://www.authorization-required.com/ HTTP/1.0
* <-- HTTP/1.0 403 Unauthorized
* <-- WWW-Authenticate: Basic realm="WallyWorld"
@@ -67,8 +68,9 @@
* return "QWadhgWERghghWERfdfQ=="
* --> GET http://www.authorization-required.com/ HTTP/1.0
* --> Authorization: Basic QWadhgWERghghWERfdfQ==
- * <-- HTTP/1.0 200 OK
+ * <-- HTTP/1.0 200 OK}
* <B> YAY!!!</B>
+ * </pre>
*/
public String authString (URL u, String scheme, String realm);
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu Jun 25 07:13:27 2015 +0000
@@ -1954,7 +1954,7 @@
/**
* Set the tunneling status.
*
- * @param the state
+ * @param tunnelState the state
*/
public void setTunnelState(TunnelState tunnelState) {
this.tunnelState = tunnelState;
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java Thu Jun 25 07:13:27 2015 +0000
@@ -338,7 +338,7 @@
* Sets the value of the <code>ifModifiedSince</code> field of
* this <code>URLConnection</code> to the specified value.
*
- * @param value the new value.
+ * @param ifmodifiedsince the new value.
* @see java.net.URLConnection#ifModifiedSince
*/
public void setIfModifiedSince(long ifmodifiedsince) {
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -277,8 +277,14 @@
@Override
public AnnotatedType[] getAnnotatedUpperBounds() {
- if (!hasUpperBounds())
- return new AnnotatedType[0];
+ if (!hasUpperBounds()) {
+ return new AnnotatedType[] { buildAnnotatedType(Object.class,
+ LocationInfo.BASE_LOCATION,
+ new TypeAnnotation[0],
+ new TypeAnnotation[0],
+ null)
+ };
+ }
return getAnnotatedBounds(getWildcardType().getUpperBounds());
}
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java Thu Jun 25 07:13:27 2015 +0000
@@ -295,7 +295,7 @@
/**
* Returns an annotation of the given type backed by the given
- * member -> value map.
+ * member {@literal ->} value map.
*/
public static Annotation annotationForMap(final Class<? extends Annotation> type,
final Map<String, Object> memberValues)
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java Thu Jun 25 07:13:27 2015 +0000
@@ -73,8 +73,8 @@
/**
* Returns an AnnotationType instance for the specified annotation type.
*
- * @throw IllegalArgumentException if the specified class object for
- * does not represent a valid annotation type
+ * @throws IllegalArgumentException if the specified class object
+ * does not represent a valid annotation type
*/
public static AnnotationType getInstance(
Class<? extends Annotation> annotationClass)
@@ -183,7 +183,7 @@
/**
* Returns member types for this annotation type
- * (member name -> type mapping).
+ * (member name {@literal ->} type mapping).
*/
public Map<String, Class<?>> memberTypes() {
return memberTypes;
@@ -191,7 +191,7 @@
/**
* Returns members of this annotation type
- * (member name -> associated Method object mapping).
+ * (member name {@literal ->} associated Method object mapping).
*/
public Map<String, Method> members() {
return members;
@@ -199,7 +199,7 @@
/**
* Returns the default values for this annotation type
- * (Member name -> default value mapping).
+ * (Member name {@literal ->} default value mapping).
*/
public Map<String, Object> memberDefaults() {
return memberDefaults;
--- a/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java Thu Jun 25 07:13:27 2015 +0000
@@ -199,7 +199,7 @@
* Regular Annotations on TypeVariables are stored in the type
* annotation byte[] in the class file.
*
- * @param genericsDecl the declaration declaring the type variable
+ * @param genericDecl the declaration declaring the type variable
* @param typeVarIndex the 0-based index of this type variable in the declaration
*/
public static <D extends GenericDeclaration> Annotation[] parseTypeVariableAnnotations(D genericDecl,
--- a/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -73,17 +73,17 @@
* <p> This method throws a MalformedParameterizedTypeException
* under the following circumstances:
* If the number of actual type arguments (i.e., the size of the
- * array <tt>typeArgs</tt>) does not correspond to the number of
+ * array {@code typeArgs}) does not correspond to the number of
* formal type arguments.
* If any of the actual type arguments is not an instance of the
* bounds on the corresponding formal.
* @param rawType the Class representing the generic type declaration being
* instantiated
- * @param actualTypeArguments - a (possibly empty) array of types
+ * @param actualTypeArguments a (possibly empty) array of types
* representing the actual type arguments to the parameterized type
- * @param ownerType - the enclosing type, if known.
- * @return An instance of <tt>ParameterizedType</tt>
- * @throws MalformedParameterizedTypeException - if the instantiation
+ * @param ownerType the enclosing type, if known.
+ * @return An instance of {@code ParameterizedType}
+ * @throws MalformedParameterizedTypeException if the instantiation
* is invalid
*/
public static ParameterizedTypeImpl make(Class<?> rawType,
@@ -95,18 +95,18 @@
/**
- * Returns an array of <tt>Type</tt> objects representing the actual type
+ * Returns an array of {@code Type} objects representing the actual type
* arguments to this type.
*
* <p>Note that in some cases, the returned array be empty. This can occur
* if this type represents a non-parameterized type nested within
* a parameterized type.
*
- * @return an array of <tt>Type</tt> objects representing the actual type
+ * @return an array of {@code Type} objects representing the actual type
* arguments to this type
- * @throws <tt>TypeNotPresentException</tt> if any of the
+ * @throws TypeNotPresentException if any of the
* actual type arguments refers to a non-existent type declaration
- * @throws <tt>MalformedParameterizedTypeException</tt> if any of the
+ * @throws MalformedParameterizedTypeException if any of the
* actual type parameters refer to a parameterized type that cannot
* be instantiated for any reason
* @since 1.5
@@ -116,10 +116,10 @@
}
/**
- * Returns the <tt>Type</tt> object representing the class or interface
+ * Returns the {@code Type} object representing the class or interface
* that declared this type.
*
- * @return the <tt>Type</tt> object representing the class or interface
+ * @return the {@code Type} object representing the class or interface
* that declared this type
*/
public Class<?> getRawType() {
@@ -128,18 +128,18 @@
/**
- * Returns a <tt>Type</tt> object representing the type that this type
- * is a member of. For example, if this type is <tt>O<T>.I<S></tt>,
- * return a representation of <tt>O<T></tt>.
+ * Returns a {@code Type} object representing the type that this type
+ * is a member of. For example, if this type is {@code O<T>.I<S>},
+ * return a representation of {@code O<T>}.
*
- * <p>If this type is a top-level type, <tt>null</tt> is returned.
+ * <p>If this type is a top-level type, {@code null} is returned.
*
- * @return a <tt>Type</tt> object representing the type that
+ * @return a {@code Type} object representing the type that
* this type is a member of. If this type is a top-level type,
- * <tt>null</tt> is returned
- * @throws <tt>TypeNotPresentException</tt> if the owner type
+ * {@code null} is returned
+ * @throws TypeNotPresentException if the owner type
* refers to a non-existent type declaration
- * @throws <tt>MalformedParameterizedTypeException</tt> if the owner type
+ * @throws MalformedParameterizedTypeException if the owner type
* refers to a parameterized type that cannot be instantiated
* for any reason
*
--- a/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java Thu Jun 25 07:13:27 2015 +0000
@@ -56,9 +56,9 @@
}
/**
- * Factory method. Takes a <tt>Constructor</tt> object and creates a
+ * Factory method. Takes a {@code Constructor} object and creates a
* scope for it.
- * @param m - A Constructor whose scope we want to obtain
+ * @param c - A Constructor whose scope we want to obtain
* @return The type-variable scope for the constructor m
*/
public static ConstructorScope make(Constructor<?> c) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Thu Jun 25 07:13:27 2015 +0000
@@ -28,6 +28,7 @@
import java.security.AlgorithmConstraints;
import java.security.CryptoPrimitive;
import java.security.PrivateKey;
+import java.security.Security;
import java.util.Set;
import java.util.HashSet;
@@ -415,10 +416,12 @@
"SHA1withRSA", --p);
supports(HashAlgorithm.SHA1, SignatureAlgorithm.ECDSA,
"SHA1withECDSA", --p);
+ if (Security.getProvider("SunMSCAPI") == null) {
supports(HashAlgorithm.SHA224, SignatureAlgorithm.RSA,
"SHA224withRSA", --p);
supports(HashAlgorithm.SHA224, SignatureAlgorithm.ECDSA,
"SHA224withECDSA", --p);
+ }
supports(HashAlgorithm.SHA256, SignatureAlgorithm.RSA,
"SHA256withRSA", --p);
supports(HashAlgorithm.SHA256, SignatureAlgorithm.ECDSA,
--- a/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java Thu Jun 25 07:13:27 2015 +0000
@@ -88,6 +88,14 @@
"NaN",
}
},
+ { "DatePatterns",
+ new String[] {
+ "EEEE, d MMMM, yyyy", // full date pattern
+ "d MMMM, yyyy", // long date pattern
+ "d MMM, yyyy", // medium date pattern
+ "d/M/yy", // short date pattern
+ }
+ },
};
}
}
--- a/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java Thu Jun 25 07:13:27 2015 +0000
@@ -121,8 +121,7 @@
* <p> This method must construct the map's hash chains and store them into
* the appropriate elements of the given hash-table row array.
*
- * @param rows
- * The row array to be initialized
+ * @param ht The row array to be initialized
*/
protected abstract void init(Object[] ht);
--- a/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java Thu Jun 25 07:13:27 2015 +0000
@@ -28,7 +28,7 @@
import java.util.TimeZone;
/**
- * The <code>BaseCalendar</code> provides basic calendar calculation
+ * The {@code BaseCalendar} provides basic calendar calculation
* functions to support the Julian, Gregorian, and Gregorian-based
* calendar systems.
*
@@ -290,11 +290,11 @@
/**
* Returns 366 if the specified date is in a leap year, or 365
* otherwise This method does not perform the normalization with
- * the specified <code>CalendarDate</code>. The
- * <code>CalendarDate</code> must be normalized to get a correct
+ * the specified {@code CalendarDate}. The
+ * {@code CalendarDate} must be normalized to get a correct
* value.
*
- * @param a <code>CalendarDate</code>
+ * @param date a {@code CalendarDate}
* @return a year length in days
* @throws ClassCastException if the specified date is not a
* {@link BaseCalendar.Date}
@@ -412,7 +412,7 @@
/**
* Calculates calendar fields and store them in the specified
- * <code>CalendarDate</code>.
+ * {@code CalendarDate}.
*/
// should be 'protected'
public void getCalendarDateFromFixedDate(CalendarDate date,
--- a/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java Thu Jun 25 07:13:27 2015 +0000
@@ -94,7 +94,7 @@
* <code>0</code> and <code>-1%4</code> is <code>-1</code>.
*
* @param n the numerator
- * @param d a divisor which must be > 0
+ * @param d a divisor which must be {@literal > 0}
* @param r an array of at least one element in which the value
* <code>mod(n, d)</code> is returned.
* @return the floor of the quotient.
@@ -117,7 +117,7 @@
* <code>0</code> and <code>-1%4</code> is <code>-1</code>.
*
* @param n the numerator
- * @param d a divisor which must be > 0
+ * @param d a divisor which must be {@literal > 0}
* @param r an array of at least one element in which the value
* <code>mod(n, d)</code> is returned.
* @return the floor of the quotient.
--- a/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java Thu Jun 25 07:13:27 2015 +0000
@@ -364,7 +364,7 @@
* 0 for January.
* @param day The day-in-month of the given date.
* @param dayOfWeek The day-of-week of the given date.
- * @param millis The milliseconds in day in <em>standard</em> local time.
+ * @param milliseconds The milliseconds in day in <em>standard</em> local time.
* @return The milliseconds to add to UTC to get local time.
*/
public int getOffset(int era, int year, int month, int day,
--- a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -72,7 +72,7 @@
* If the name returned cannot be localized according to <code>locale</code>,
* (say, the provider does not have a Japanese name for Croatian),
* this method returns null.
- * @param languageCode the ISO 639 language code string in the form of two
+ * @param lang the ISO 639 language code string in the form of two
* lower-case letters between 'a' (U+0061) and 'z' (U+007A)
* @param locale the desired locale
* @return the name of the given language code for the specified locale, or null if it's not
@@ -129,7 +129,7 @@
* If the name returned cannot be localized according to <code>locale</code>,
* (say, the provider does not have a Japanese name for Croatia),
* this method returns null.
- * @param countryCode the ISO 3166 country code string in the form of two
+ * @param ctry the ISO 3166 country code string in the form of two
* upper-case letters between 'A' (U+0041) and 'Z' (U+005A)
* @param locale the desired locale
* @return the name of the given country code for the specified locale, or null if it's not
@@ -152,7 +152,7 @@
* is appropriate for display to the user.
* If the name returned cannot be localized according to <code>locale</code>,
* this method returns null.
- * @param variant the variant string
+ * @param vrnt the variant string
* @param locale the desired locale
* @return the name of the given variant string for the specified locale, or null if it's not
* available.
--- a/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -79,7 +79,7 @@
* appropriate for daylight saving time even if the specified time zone
* has not observed daylight saving time in the past.
*
- * @param ID a time zone ID string
+ * @param id a time zone ID string
* @param daylight if true, return the daylight saving name.
* @param style either {@link java.util.TimeZone#LONG TimeZone.LONG} or
* {@link java.util.TimeZone#SHORT TimeZone.SHORT}
--- a/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java Thu Jun 25 07:13:27 2015 +0000
@@ -74,10 +74,10 @@
* java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
*
* Limitation:
- * <JAVA_HOME>/conf/logging.properties is the system-wide logging
+ * {@code <JAVA_HOME>/conf/logging.properties} is the system-wide logging
* configuration defined in the specification and read in the
* default case to configure any java.util.logging.Logger instances.
- * Platform loggers will not detect if <JAVA_HOME>/conf/logging.properties
+ * Platform loggers will not detect if {@code <JAVA_HOME>/conf/logging.properties}
* is modified. In other words, unless the java.util.logging API
* is used at runtime or the logging system properties is set,
* the platform loggers will use the default setting described above.
--- a/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java Thu Jun 25 07:13:27 2015 +0000
@@ -55,7 +55,7 @@
* array for the enumeration returned by <code>getKeys</code>.
* <li>Inserts the time zone ID (the key of the bundle entries) into
* the string arrays returned by <code>handleGetObject</code>.
- * <ul>
+ * </ul>
* All <code>TimeZoneNames</code> resource bundles must extend this
* class and implement the <code>getContents</code> method.
*/
--- a/jdk/src/java.base/share/native/libjava/ClassLoader.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/share/native/libjava/ClassLoader.c Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -479,12 +479,12 @@
return res;
}
/*
- * Class: java_lang_ClassLoader_NativeLibrary
+ * Class: java_lang_ClassLoader
* Method: findBuiltinLib
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL
-Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib
+Java_java_lang_ClassLoader_findBuiltinLib
(JNIEnv *env, jclass cls, jstring name)
{
const char *cname;
@@ -500,8 +500,6 @@
JNU_ThrowInternalError(env, "NULL filename for native library");
return NULL;
}
- // Can't call initIDs because it will recurse into NativeLibrary via
- // FindClass to check context so set prochandle here as well.
procHandle = getProcessHandle();
cname = JNU_GetStringPlatformChars(env, name, 0);
if (cname == NULL) {
--- a/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -542,7 +542,22 @@
@Override
public CompletableFuture<Process> onExit() {
return ProcessHandleImpl.completion(pid, false)
- .handleAsync((exitStatus, unusedThrowable) -> this);
+ .handleAsync((exitStatus, unusedThrowable) -> {
+ boolean interrupted = false;
+ while (true) {
+ // Ensure that the concurrent task setting the exit status has completed
+ try {
+ waitFor();
+ break;
+ } catch (InterruptedException ie) {
+ interrupted = true;
+ }
+ }
+ if (interrupted) {
+ Thread.currentThread().interrupt();
+ }
+ return this;
+ });
}
@Override
--- a/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java Thu Jun 25 07:13:27 2015 +0000
@@ -50,7 +50,7 @@
}
/**
- * @returns the platform specific path corresponding to the URL
+ * @return the platform specific path corresponding to the URL
* so long as the URL does not contain a hostname in the authority field.
*/
--- a/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Thu Jun 25 07:13:27 2015 +0000
@@ -113,7 +113,8 @@
Client client;
/**
* Create a NTLMAuthentication:
- * Username may be specified as domain<BACKSLASH>username in the application Authenticator.
+ * Username may be specified as {@literal domain<BACKSLASH>username}
+ * in the application Authenticator.
* If this notation is not used, then the domain will be taken
* from a system property: "http.auth.ntlm.domain".
*/
--- a/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -27,7 +27,12 @@
#include <sys/types.h>
#include <sys/time.h>
#include <sys/stat.h>
+#ifdef MACOSX
+#include <sys/param.h>
+#include <sys/mount.h>
+#else
#include <sys/statvfs.h>
+#endif
#include <string.h>
#include <stdlib.h>
#include <dlfcn.h>
@@ -46,8 +51,10 @@
#define dirent64 dirent
#define readdir64_r readdir_r
#define stat64 stat
+#ifndef MACOSX
#define statvfs64 statvfs
#endif
+#endif
/* -- Field IDs -- */
@@ -432,8 +439,32 @@
jlong rv = 0L;
WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path) {
+#ifdef MACOSX
+ struct statfs fsstat;
+#else
struct statvfs64 fsstat;
+#endif
memset(&fsstat, 0, sizeof(fsstat));
+#ifdef MACOSX
+ if (statfs(path, &fsstat) == 0) {
+ switch(t) {
+ case java_io_FileSystem_SPACE_TOTAL:
+ rv = jlong_mul(long_to_jlong(fsstat.f_bsize),
+ long_to_jlong(fsstat.f_blocks));
+ break;
+ case java_io_FileSystem_SPACE_FREE:
+ rv = jlong_mul(long_to_jlong(fsstat.f_bsize),
+ long_to_jlong(fsstat.f_bfree));
+ break;
+ case java_io_FileSystem_SPACE_USABLE:
+ rv = jlong_mul(long_to_jlong(fsstat.f_bsize),
+ long_to_jlong(fsstat.f_bavail));
+ break;
+ default:
+ assert(0);
+ }
+ }
+#else
if (statvfs64(path, &fsstat) == 0) {
switch(t) {
case java_io_FileSystem_SPACE_TOTAL:
@@ -452,6 +483,7 @@
assert(0);
}
}
+#endif
} END_PLATFORM_STRING(env, path);
return rv;
}
--- a/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c Thu Jun 25 07:13:27 2015 +0000
@@ -121,7 +121,7 @@
jobjectArray ret = 0;
int retLen = 0;
- int error=0;
+ int getaddrinfo_error=0;
struct addrinfo hints, *res, *resNew = NULL;
initInetAddressIDs(env);
@@ -149,22 +149,24 @@
return NULL;
}
+
+ getaddrinfo_error = getaddrinfo(hostname, NULL, &hints, &res);
+
#ifdef MACOSX
- /* If we're looking up the local machine, bypass DNS lookups and get
- * address from getifaddrs.
- */
- ret = lookupIfLocalhost(env, hostname, JNI_FALSE);
- if (ret != NULL || (*env)->ExceptionCheck(env)) {
- JNU_ReleaseStringPlatformChars(env, host, hostname);
- return ret;
+ if (getaddrinfo_error) {
+ // If getaddrinfo fails try getifaddrs.
+ ret = lookupIfLocalhost(env, hostname, JNI_FALSE);
+ if (ret != NULL || (*env)->ExceptionCheck(env)) {
+ JNU_ReleaseStringPlatformChars(env, host, hostname);
+ return ret;
+ }
}
#endif
- error = getaddrinfo(hostname, NULL, &hints, &res);
-
- if (error) {
+ if (getaddrinfo_error) {
/* report error */
- NET_ThrowUnknownHostExceptionWithGaiError(env, hostname, error);
+ NET_ThrowUnknownHostExceptionWithGaiError(
+ env, hostname, getaddrinfo_error);
JNU_ReleaseStringPlatformChars(env, host, hostname);
return NULL;
} else {
--- a/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c Thu Jun 25 07:13:27 2015 +0000
@@ -254,7 +254,7 @@
jobjectArray ret = 0;
int retLen = 0;
- int error=0;
+ int getaddrinfo_error=0;
#ifdef AF_INET6
struct addrinfo hints, *res, *resNew = NULL;
#endif /* AF_INET6 */
@@ -269,19 +269,6 @@
hostname = JNU_GetStringPlatformChars(env, host, JNI_FALSE);
CHECK_NULL_RETURN(hostname, NULL);
-#ifdef MACOSX
- /*
- * If we're looking up the local machine, attempt to get the address
- * from getifaddrs. This ensures we get an IPv6 address for the local
- * machine.
- */
- ret = lookupIfLocalhost(env, hostname, JNI_TRUE);
- if (ret != NULL || (*env)->ExceptionCheck(env)) {
- JNU_ReleaseStringPlatformChars(env, host, hostname);
- return ret;
- }
-#endif
-
#ifdef AF_INET6
/* Try once, with our static buffer. */
memset(&hints, 0, sizeof(hints));
@@ -301,11 +288,27 @@
}
#endif
- error = getaddrinfo(hostname, NULL, &hints, &res);
+ getaddrinfo_error = getaddrinfo(hostname, NULL, &hints, &res);
- if (error) {
+#ifdef MACOSX
+ if (getaddrinfo_error) {
+ /*
+ * If getaddrinfo fails looking up the local machine, attempt to get the
+ * address from getifaddrs. This ensures we get an IPv6 address for the
+ * local machine.
+ */
+ ret = lookupIfLocalhost(env, hostname, JNI_TRUE);
+ if (ret != NULL || (*env)->ExceptionCheck(env)) {
+ JNU_ReleaseStringPlatformChars(env, host, hostname);
+ return ret;
+ }
+ }
+#endif
+
+ if (getaddrinfo_error) {
/* report error */
- NET_ThrowUnknownHostExceptionWithGaiError(env, hostname, error);
+ NET_ThrowUnknownHostExceptionWithGaiError(
+ env, hostname, getaddrinfo_error);
JNU_ReleaseStringPlatformChars(env, host, hostname);
return NULL;
} else {
--- a/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c Thu Jun 25 07:13:27 2015 +0000
@@ -35,7 +35,12 @@
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/stat.h>
+#ifdef MACOSX
+#include <sys/param.h>
+#include <sys/mount.h>
+#else
#include <sys/statvfs.h>
+#endif
#include <sys/time.h>
#ifdef __solaris__
@@ -50,7 +55,9 @@
#include <string.h>
#define stat64 stat
+#ifndef MACOSX
#define statvfs64 statvfs
+#endif
#define open64 open
#define fstat64 fstat
@@ -901,11 +908,18 @@
jlong pathAddress, jobject attrs)
{
int err;
+#ifdef MACOSX
+ struct statfs buf;
+#else
struct statvfs64 buf;
+#endif
const char* path = (const char*)jlong_to_ptr(pathAddress);
-
+#ifdef MACOSX
+ RESTARTABLE(statfs(path, &buf), err);
+#else
RESTARTABLE(statvfs64(path, &buf), err);
+#endif
if (err == -1) {
throwUnixException(env, errno);
} else {
@@ -921,7 +935,11 @@
buf.f_bavail = 0;
}
#endif
+#ifdef MACOSX
+ (*env)->SetLongField(env, attrs, attrs_f_frsize, long_to_jlong(buf.f_bsize));
+#else
(*env)->SetLongField(env, attrs, attrs_f_frsize, long_to_jlong(buf.f_frsize));
+#endif
(*env)->SetLongField(env, attrs, attrs_f_blocks, long_to_jlong(buf.f_blocks));
(*env)->SetLongField(env, attrs, attrs_f_bfree, long_to_jlong(buf.f_bfree));
(*env)->SetLongField(env, attrs, attrs_f_bavail, long_to_jlong(buf.f_bavail));
--- a/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java Thu Jun 25 07:13:27 2015 +0000
@@ -46,7 +46,7 @@
}
/**
- * @returns the platform specific path corresponding to the URL, and in particular
+ * @return the platform specific path corresponding to the URL, and in particular
* returns a UNC when the authority contains a hostname
*/
--- a/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Thu Jun 25 07:13:27 2015 +0000
@@ -83,7 +83,8 @@
/**
* Create a NTLMAuthentication:
- * Username may be specified as domain<BACKSLASH>username in the application Authenticator.
+ * Username may be specified as {@literal domain<BACKSLASH>username}
+ * in the application Authenticator.
* If this notation is not used, then the domain will be taken
* from a system property: "http.auth.ntlm.domain".
*/
--- a/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java Thu Jun 25 07:13:27 2015 +0000
@@ -55,7 +55,7 @@
/**
* Utility class with different datatransfer helper functions
*
- * @see 1.9
+ * @since 1.9
*/
public class DataFlavorUtil {
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java Thu Jun 25 07:13:27 2015 +0000
@@ -97,7 +97,8 @@
/**
- * Converts an OSType (e.g. "macs" from <CarbonCore/Folders.h>) into an int.
+ * Converts an OSType (e.g. "macs"
+ * from {@literal <CarbonCore/Folders.h>}) into an int.
*
* @param type the 4 character type to convert.
* @return an int representing the 4 character value
@@ -355,7 +356,7 @@
/**
* Moves the specified file to the Trash
*
- * @param file
+ * @param file the file
* @return returns true if the NSFileManager successfully moved the file to the Trash.
* @throws FileNotFoundException
*
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Thu Jun 25 07:13:27 2015 +0000
@@ -985,11 +985,13 @@
}
private void checkZoom() {
- int state = peer.getState();
- if (state != Frame.MAXIMIZED_BOTH && isMaximized()) {
- deliverZoom(true);
- } else if (state == Frame.MAXIMIZED_BOTH && !isMaximized()) {
- deliverZoom(false);
+ if (peer != null) {
+ int state = peer.getState();
+ if (state != Frame.MAXIMIZED_BOTH && isMaximized()) {
+ deliverZoom(true);
+ } else if (state == Frame.MAXIMIZED_BOTH && !isMaximized()) {
+ deliverZoom(false);
+ }
}
}
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Jun 25 07:13:27 2015 +0000
@@ -370,8 +370,7 @@
protected void initializeDesktopProperties() {
super.initializeDesktopProperties();
Map <Object, Object> fontHints = new HashMap<>();
- fontHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- fontHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+ fontHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
desktopProperties.put(SunToolkit.DESKTOPFONTHINTS, fontHints);
desktopProperties.put("awt.mouse.numButtons", BUTTONS);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m Thu Jun 25 07:13:27 2015 +0000
@@ -23,6 +23,7 @@
* questions.
*/
+#import <Cocoa/Cocoa.h>
#import <JavaNativeFoundation/JavaNativeFoundation.h>
#import "sun_lwawt_macosx_CFRetainedResource.h"
@@ -37,7 +38,10 @@
(JNIEnv *env, jclass clazz, jlong ptr, jboolean releaseOnAppKitThread)
{
if (releaseOnAppKitThread) {
- [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
+ // Releasing resources on the main AppKit message loop only
+ // Releasing resources on the nested loops may cause dangling
+ // pointers after the nested loop is exited
+ [NSApp postRunnableEvent:^(){
CFRelease(jlong_to_ptr(ptr));
}];
} else {
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m Thu Jun 25 07:13:27 2015 +0000
@@ -516,8 +516,10 @@
beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.010]];
if (processEvents) {
//We do not spin a runloop here as date is nil, so does not matter which mode to use
+ // Processing all events excluding NSApplicationDefined which need to be processed
+ // on the main loop only (those events are intended for disposing resources)
NSEvent *event;
- if ((event = [NSApp nextEventMatchingMask:NSAnyEventMask
+ if ((event = [NSApp nextEventMatchingMask:(NSAnyEventMask & ~NSApplicationDefined)
untilDate:nil
inMode:NSDefaultRunLoopMode
dequeue:YES]) != nil) {
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/AWTStrike.m Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/AWTStrike.m Thu Jun 25 07:13:27 2015 +0000
@@ -311,21 +311,26 @@
jlong *glyphInfos =
(*env)->GetPrimitiveArrayCritical(env, glyphInfoLongArray, NULL);
- if (glyphInfos != NULL) {
- jint *rawGlyphCodes =
+
+ jint *rawGlyphCodes =
(*env)->GetPrimitiveArrayCritical(env, glyphCodes, NULL);
-
- if (rawGlyphCodes != NULL) {
+ @try {
+ if (rawGlyphCodes != NULL && glyphInfos != NULL) {
CGGlyphImages_GetGlyphImagePtrs(glyphInfos, awtStrike,
- rawGlyphCodes, len);
-
- (*env)->ReleasePrimitiveArrayCritical(env, glyphCodes,
- rawGlyphCodes, JNI_ABORT);
+ rawGlyphCodes, len);
}
- // Do not use JNI_COMMIT, as that will not free the buffer copy
- // when +ProtectJavaHeap is on.
- (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoLongArray,
- glyphInfos, 0);
+ }
+ @finally {
+ if (rawGlyphCodes != NULL) {
+ (*env)->ReleasePrimitiveArrayCritical(env, glyphCodes,
+ rawGlyphCodes, JNI_ABORT);
+ }
+ if (glyphInfos != NULL) {
+ // Do not use JNI_COMMIT, as that will not free the buffer copy
+ // when +ProtectJavaHeap is on.
+ (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoLongArray,
+ glyphInfos, 0);
+ }
}
JNF_COCOA_EXIT(env);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m Thu Jun 25 07:13:27 2015 +0000
@@ -195,19 +195,41 @@
#pragma mark --- Font Rendering Mode Descriptors ---
+static Int32 reverseGamma = 0;
+
+static UInt8 reverseGammaLut[256] = { 0 };
+
+static inline UInt8* getReverseGammaLut() {
+ if (reverseGamma == 0) {
+ // initialize gamma lut
+ double gamma;
+ int i;
+ const char* pGammaEnv = getenv("J2D_LCD_REVERSE_GAMMA");
+ if (pGammaEnv != NULL) {
+ reverseGamma = atol(pGammaEnv);
+ }
+
+ if (reverseGamma < 100 || reverseGamma > 250) {
+ reverseGamma = 180;
+ }
+
+ gamma = 100.0 / reverseGamma;
+ for (i = 0; i < 256; i++) {
+ double x = ((double)i) / 255.0;
+ reverseGammaLut[i] = (UInt8)(255 * pow(x, gamma));
+ }
+ }
+ return reverseGammaLut;
+}
static inline void
CGGI_CopyARGBPixelToRGBPixel(const UInt32 p, UInt8 *dst)
{
-#if __LITTLE_ENDIAN__
- *(dst + 2) = 0xFF - (p >> 24 & 0xFF);
- *(dst + 1) = 0xFF - (p >> 16 & 0xFF);
- *(dst) = 0xFF - (p >> 8 & 0xFF);
-#else
- *(dst) = 0xFF - (p >> 16 & 0xFF);
- *(dst + 1) = 0xFF - (p >> 8 & 0xFF);
- *(dst + 2) = 0xFF - (p & 0xFF);
-#endif
+ UInt8* lut = getReverseGammaLut();
+
+ *(dst + 0) = lut[0xFF - (p >> 16 & 0xFF)]; // red
+ *(dst + 1) = lut[0xFF - (p >> 8 & 0xFF)]; // green
+ *(dst + 2) = lut[0xFF - (p & 0xFF)]; // blue
}
static void
@@ -222,17 +244,14 @@
size_t height = info->height;
size_t y;
+
+ // fill empty glyph image with black-on-white glyph
for (y = 0; y < height; y++) {
size_t destRow = y * destRowWidth * 3;
size_t srcRow = y * srcRowWidth;
size_t x;
for (x = 0; x < destRowWidth; x++) {
- // size_t x3 = x * 3;
- // UInt32 p = src[srcRow + x];
- // dest[destRow + x3] = 0xFF - (p >> 16 & 0xFF);
- // dest[destRow + x3 + 1] = 0xFF - (p >> 8 & 0xFF);
- // dest[destRow + x3 + 2] = 0xFF - (p & 0xFF);
CGGI_CopyARGBPixelToRGBPixel(src[srcRow + x],
dest + destRow + x * 3);
}
@@ -260,13 +279,9 @@
//}
static inline UInt8
-CGGI_ConvertPixelToGreyBit(UInt32 p)
+CGGI_ConvertBWPixelToByteGray(UInt32 p)
{
-#ifdef __LITTLE_ENDIAN__
- return 0xFF - ((p >> 24 & 0xFF) + (p >> 16 & 0xFF) + (p >> 8 & 0xFF)) / 3;
-#else
- return 0xFF - ((p >> 16 & 0xFF) + (p >> 8 & 0xFF) + (p & 0xFF)) / 3;
-#endif
+ return 0xFF - (((p >> 24 & 0xFF) + (p >> 16 & 0xFF) + (p >> 8 & 0xFF)) / 3);
}
static void
@@ -281,14 +296,15 @@
size_t height = info->height;
size_t y;
+
+ // fill empty glyph image with black-on-white glyph
for (y = 0; y < height; y++) {
size_t destRow = y * destRowWidth;
size_t srcRow = y * srcRowWidth;
-
size_t x;
for (x = 0; x < destRowWidth; x++) {
UInt32 p = src[srcRow + x];
- dest[destRow + x] = CGGI_ConvertPixelToGreyBit(p);
+ dest[destRow + x] = CGGI_ConvertBWPixelToByteGray(p);
}
}
}
@@ -316,13 +332,11 @@
{
CGGI_RenderingMode mode;
mode.cgFontMode = strike->fStyle;
+ NSException *e = nil;
switch (strike->fAAStyle) {
- case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_DEFAULT:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_OFF:
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_ON:
- case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_GASP:
- default:
mode.glyphDescriptor = &grey;
break;
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_HRGB:
@@ -331,6 +345,17 @@
case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_VBGR:
mode.glyphDescriptor = &rgb;
break;
+ case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_GASP:
+ case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_DEFAULT:
+ default:
+ /* we expect that text antialiasing hint has been already
+ * evaluated. Report an error if we get 'unevaluated' hint here.
+ */
+ e = [NSException
+ exceptionWithName:@"IllegalArgumentException"
+ reason:@"Invalid hint value"
+ userInfo:nil];
+ @throw e;
}
return mode;
@@ -345,7 +370,8 @@
*/
static inline void
CGGI_InitCanvas(CGGI_GlyphCanvas *canvas,
- const vImagePixelCount width, const vImagePixelCount height)
+ const vImagePixelCount width, const vImagePixelCount height,
+ const CGGI_RenderingMode* mode)
{
// our canvas is *always* 4-byte ARGB
size_t bytesPerRow = width * sizeof(UInt32);
@@ -356,19 +382,26 @@
canvas->image->height = height;
canvas->image->rowBytes = bytesPerRow;
- canvas->image->data = (void *)calloc(byteCount, sizeof(UInt32));
+ canvas->image->data = (void *)calloc(byteCount, sizeof(UInt8));
if (canvas->image->data == NULL) {
[[NSException exceptionWithName:NSMallocException
reason:@"Failed to allocate memory for the buffer which backs the CGContext for glyph strikes." userInfo:nil] raise];
}
- CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
+ uint32_t bmpInfo = kCGImageAlphaPremultipliedFirst;
+ if (mode->glyphDescriptor == &rgb) {
+ bmpInfo |= kCGBitmapByteOrder32Host;
+ }
+
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
canvas->context = CGBitmapContextCreate(canvas->image->data,
width, height, 8, bytesPerRow,
colorSpace,
- kCGImageAlphaPremultipliedFirst);
+ bmpInfo);
+ // set foreground color
CGContextSetRGBFillColor(canvas->context, 0.0f, 0.0f, 0.0f, 1.0f);
+
CGContextSetFontSize(canvas->context, 1);
CGContextSaveGState(canvas->context);
@@ -404,7 +437,9 @@
* Quick and easy inline to check if this canvas is big enough.
*/
static inline void
-CGGI_SizeCanvas(CGGI_GlyphCanvas *canvas, const vImagePixelCount width, const vImagePixelCount height, const JRSFontRenderingStyle style)
+CGGI_SizeCanvas(CGGI_GlyphCanvas *canvas, const vImagePixelCount width,
+ const vImagePixelCount height,
+ const CGGI_RenderingMode* mode)
{
if (canvas->image != NULL &&
width < canvas->image->width &&
@@ -418,8 +453,9 @@
CGGI_FreeCanvas(canvas);
CGGI_InitCanvas(canvas,
width * CGGI_GLYPH_CANVAS_SLACK,
- height * CGGI_GLYPH_CANVAS_SLACK);
- JRSFontSetRenderingStyleOnContext(canvas->context, style);
+ height * CGGI_GLYPH_CANVAS_SLACK,
+ mode);
+ JRSFontSetRenderingStyleOnContext(canvas->context, mode->cgFontMode);
}
/*
@@ -443,6 +479,7 @@
Pixel_8888 opaqueWhite = { 0xFF, 0xFF, 0xFF, 0xFF };
#endif
+ // clear canvas background and set foreground color
vImageBufferFill_ARGB8888(&canvasRectToClear, opaqueWhite, kvImageNoFlags);
}
@@ -577,7 +614,7 @@
GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode);
// fix the context size, just in case the substituted character is unexpectedly large
- CGGI_SizeCanvas(canvas, info->width, info->height, mode->cgFontMode);
+ CGGI_SizeCanvas(canvas, info->width, info->height, mode);
// align the transform for the real CoreText strike
CGContextSetTextMatrix(canvas->context, strike->fAltTx);
@@ -653,8 +690,11 @@
#endif
}
-static NSString *threadLocalCanvasKey =
- @"Java CoreGraphics Text Renderer Cached Canvas";
+static NSString *threadLocalAACanvasKey =
+ @"Java CoreGraphics Text Renderer Cached Canvas for AA";
+
+static NSString *threadLocalLCDCanvasKey =
+ @"Java CoreGraphics Text Renderer Cached Canvas for LCD";
/*
* This is the maximum length and height times the above slack squared
@@ -678,25 +718,28 @@
CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_SLACK*CGGI_GLYPH_CANVAS_SLACK)
{
CGGI_GlyphCanvas *tmpCanvas = [[CGGI_GlyphCanvas alloc] init];
- CGGI_InitCanvas(tmpCanvas, maxWidth, maxHeight);
+ CGGI_InitCanvas(tmpCanvas, maxWidth, maxHeight, mode);
CGGI_FillImagesForGlyphsWithSizedCanvas(tmpCanvas, strike,
- mode, glyphInfos, uniChars,
- glyphs, len);
+ mode, glyphInfos, uniChars,
+ glyphs, len);
CGGI_FreeCanvas(tmpCanvas);
[tmpCanvas release];
return;
}
-
NSMutableDictionary *threadDict =
[[NSThread currentThread] threadDictionary];
- CGGI_GlyphCanvas *canvas = [threadDict objectForKey:threadLocalCanvasKey];
+
+ NSString* theKey = (mode->glyphDescriptor == &rgb) ?
+ threadLocalLCDCanvasKey : threadLocalAACanvasKey;
+
+ CGGI_GlyphCanvas *canvas = [threadDict objectForKey:theKey];
if (canvas == nil) {
canvas = [[CGGI_GlyphCanvas alloc] init];
- [threadDict setObject:canvas forKey:threadLocalCanvasKey];
+ [threadDict setObject:canvas forKey:theKey];
}
- CGGI_SizeCanvas(canvas, maxWidth, maxHeight, mode->cgFontMode);
+ CGGI_SizeCanvas(canvas, maxWidth, maxHeight, mode);
CGGI_FillImagesForGlyphsWithSizedCanvas(canvas, strike, mode,
glyphInfos, uniChars, glyphs, len);
}
--- a/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h Thu Jun 25 07:13:27 2015 +0000
@@ -37,6 +37,7 @@
- (void) registerWithProcessManager;
- (void) setDockIconWithEnv:(JNIEnv *)env;
- (void) postDummyEvent;
+- (void) postRunnableEvent:(void (^)())block;
- (void) waitForDummyEvent;
+ (void) runAWTLoopWithApp:(NSApplication*)app;
--- a/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m Thu Jun 25 07:13:27 2015 +0000
@@ -337,9 +337,13 @@
- (void)sendEvent:(NSEvent *)event
{
- if ([event type] == NSApplicationDefined && TS_EQUAL([event timestamp], dummyEventTimestamp)) {
+ if ([event type] == NSApplicationDefined && TS_EQUAL([event timestamp], dummyEventTimestamp) && [event subtype] == 0) {
[seenDummyEventLock lockWhenCondition:NO];
[seenDummyEventLock unlockWithCondition:YES];
+ } else if ([event type] == NSApplicationDefined && [event subtype] == 777) {
+ void (^block)() = (void (^)()) [event data1];
+ block();
+ [block release];
} else if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask)) {
// Cocoa won't send us key up event when releasing a key while Cmd is down,
// so we have to do it ourselves.
@@ -349,6 +353,33 @@
}
}
+/*
+ * Posts the block to the AppKit event queue which will be executed
+ * on the main AppKit loop.
+ * While running nested loops this event will be ignored.
+ */
+- (void)postRunnableEvent:(void (^)())block
+{
+ void (^copy)() = [block copy];
+ NSInteger encode = (NSInteger) copy;
+ [copy retain];
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ NSEvent* event = [NSEvent otherEventWithType: NSApplicationDefined
+ location: NSMakePoint(0,0)
+ modifierFlags: 0
+ timestamp: 0
+ windowNumber: 0
+ context: nil
+ subtype: 777
+ data1: encode
+ data2: 0];
+
+ [NSApp postEvent: event atStart: NO];
+ [pool drain];
+}
+
+
+
- (void)postDummyEvent {
seenDummyEventLock = [[NSConditionLock alloc] initWithCondition:NO];
dummyEventTimestamp = [NSProcessInfo processInfo].systemUptime;
--- a/jdk/src/java.desktop/share/classes/com/sun/beans/introspect/PropertyInfo.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/beans/introspect/PropertyInfo.java Thu Jun 25 07:13:27 2015 +0000
@@ -125,38 +125,36 @@
put(Name.visualUpdate, annotation.visualUpdate());
put(Name.description, annotation.description());
String[] values = annotation.enumerationValues();
- if (0 < values.length) {
- try {
- Object[] array = new Object[3 * values.length];
- int index = 0;
- for (String value : values) {
- Class<?> type = info.method.getDeclaringClass();
- String name = value;
- int pos = value.lastIndexOf('.');
- if (pos > 0) {
- name = value.substring(0, pos);
- if (name.indexOf('.') < 0) {
- String pkg = type.getName();
- name = pkg.substring(0, 1 + Math.max(
- pkg.lastIndexOf('.'),
- pkg.lastIndexOf('$'))) + name;
- }
- type = findClass(name);
- name = value.substring(pos + 1);
+ try {
+ Object[] array = new Object[3 * values.length];
+ int index = 0;
+ for (String value : values) {
+ Class<?> type = info.method.getDeclaringClass();
+ String name = value;
+ int pos = value.lastIndexOf('.');
+ if (pos > 0) {
+ name = value.substring(0, pos);
+ if (name.indexOf('.') < 0) {
+ String pkg = type.getName();
+ name = pkg.substring(0, 1 + Math.max(
+ pkg.lastIndexOf('.'),
+ pkg.lastIndexOf('$'))) + name;
}
- Field field = type.getField(name);
- if (Modifier.isStatic(field.getModifiers()) && info.type.isAssignableFrom(field.getType())) {
- array[index++] = name;
- array[index++] = field.get(null);
- array[index++] = value;
- }
+ type = findClass(name);
+ name = value.substring(pos + 1);
}
- if (index == array.length) {
- put(Name.enumerationValues, array);
+ Field field = type.getField(name);
+ if (Modifier.isStatic(field.getModifiers()) && info.type.isAssignableFrom(field.getType())) {
+ array[index++] = name;
+ array[index++] = field.get(null);
+ array[index++] = value;
}
- } catch (Exception ignored) {
- ignored.printStackTrace();
}
+ if (index == array.length) {
+ put(Name.enumerationValues, array);
+ }
+ } catch (Exception ignored) {
+ ignored.printStackTrace();
}
}
}
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifBorders.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifBorders.java Thu Jun 25 07:13:27 2015 +0000
@@ -41,7 +41,7 @@
import java.awt.Rectangle;
/**
- * Factory object that can vend Icons appropriate for the basic L & F.
+ * Factory object that can vend Icons appropriate for the basic {@literal L & F}.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifButtonListener.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifButtonListener.java Thu Jun 25 07:13:27 2015 +0000
@@ -34,7 +34,6 @@
/**
* Button Listener
- * <p>
*
* @author Rich Schiavi
*/
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxMenuItemUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxMenuItemUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -37,7 +37,6 @@
/**
* MotifCheckboxMenuItem implementation
- * <p>
*
* @author Georges Saab
* @author Rich Schiavi
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifComboBoxUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifComboBoxUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -35,7 +35,8 @@
/**
* ComboBox motif look and feel
- * <p> * <strong>Warning:</strong>
+ * <p>
+ * <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is appropriate
* for short term storage or RMI between applications running the same
@@ -261,9 +262,9 @@
}
/**
- * This inner class is marked "public" due to a compiler bug.
- * This class should be treated as a "protected" inner class.
- * Instantiate it only within subclasses of <FooUI>.
+ * This inner class is marked "public" due to a compiler bug.
+ * This class should be treated as a "protected" inner class.
+ * Instantiate it only within subclasses of {@code <FooUI>}.
*/
public class ComboBoxLayoutManager extends BasicComboBoxUI.ComboBoxLayoutManager {
public ComboBoxLayoutManager() {
@@ -344,7 +345,7 @@
}
/**
- * This class should be made "protected" in future releases.
+ * This class should be made "protected" in future releases.
*/
private class MotifPropertyChangeListener
extends BasicComboBoxUI.PropertyChangeHandler {
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -38,7 +38,7 @@
/**
- * A Motif L&F implementation of InternalFrame.
+ * A Motif {@literal L&F} implementation of InternalFrame.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -32,7 +32,7 @@
import javax.swing.plaf.ComponentUI;
/**
- * A Motif L&F implementation of LabelUI.
+ * A Motif {@literal L&F} implementation of LabelUI.
* This merely sets up new default values in MotifLookAndFeel.
* <p>
* <strong>Warning:</strong>
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuBarUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuBarUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -45,7 +45,7 @@
import javax.swing.plaf.basic.*;
/**
- * A Windows L&F implementation of MenuBarUI. This implementation
+ * A Windows {@literal L&F} implementation of MenuBarUI. This implementation
* is a "combined" view/controller.
* <p>
* <strong>Warning:</strong>
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuItemUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuItemUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -37,7 +37,6 @@
/**
* MotifMenuItem implementation
- * <p>
*
* @author Rich Schiavi
* @author Georges Saab
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -36,8 +36,7 @@
import javax.swing.plaf.basic.BasicMenuUI;
/**
- * A Motif L&F implementation of MenuUI.
- * <p>
+ * A Motif {@literal L&F} implementation of MenuUI.
*
* @author Georges Saab
* @author Rich Schiavi
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuSeparatorUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuSeparatorUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -34,8 +34,8 @@
import javax.swing.plaf.*;
/**
- * A Motif L&F implementation of PopupMenuSeparatorUI. This implementation
- * is a "combined" view/controller.
+ * A Motif {@literal L&F} implementation of PopupMenuSeparatorUI.
+ * This implementation is a "combined" view/controller.
*
* @author Jeff Shapiro
*/
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -47,7 +47,7 @@
/**
- * A Motif L&F implementation of PopupMenuUI.
+ * A Motif {@literal L&F} implementation of PopupMenuUI.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -34,7 +34,7 @@
import java.beans.PropertyChangeListener;
/**
- * A CDE/Motif L&F implementation of ScrollPaneUI.
+ * A CDE/Motif {@code L&F} implementation of ScrollPaneUI.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifSeparatorUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifSeparatorUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -35,8 +35,8 @@
import javax.swing.plaf.basic.BasicSeparatorUI;
/**
- * A Motif L&F implementation of SeparatorUI. This implementation
- * is a "combined" view/controller.
+ * A Motif {@literal L&F} implementation of SeparatorUI.
+ * This implementation is a "combined" view/controller.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifTabbedPaneUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifTabbedPaneUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -34,7 +34,7 @@
import java.io.Serializable;
/**
- * A Motif L&F implementation of TabbedPaneUI.
+ * A Motif {@literal L&F} implementation of TabbedPaneUI.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java Thu Jun 25 07:13:27 2015 +0000
@@ -199,7 +199,7 @@
/**
* Requests that all components in the GUI hierarchy be updated
- * to reflect dynamic changes in this look&feel. This update occurs
+ * to reflect dynamic changes in this {@literal look&feel}. This update occurs
* by uninstalling and re-installing the UI objects. Requests are
* batched and collapsed into a single update pass because often
* many desktop properties will change at once.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsBorders.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsBorders.java Thu Jun 25 07:13:27 2015 +0000
@@ -39,7 +39,7 @@
import static com.sun.java.swing.plaf.windows.XPStyle.Skin;
/**
- * Factory object that can vend Borders appropriate for the Windows 95 L & F.
+ * Factory object that can vend Borders appropriate for the Windows 95 {@literal L & F}.
* @author Rich Schiavi
*/
@@ -142,7 +142,7 @@
/**
* A border for the ToolBar. If the ToolBar is floatable then the handle grip is drawn
- * <p>
+ *
* @since 1.4
*/
@SuppressWarnings("serial") // Superclass is not serializable across versions
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -76,7 +76,7 @@
}
/**
* Method which renders the text of the current menu item.
- * <p>
+ *
* @param g Graphics context
* @param menuItem Current menu item to render
* @param textRect Bounding rectangle to render the text.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -48,7 +48,7 @@
import javax.accessibility.*;
/**
- * Windows L&F implementation of a FileChooser.
+ * Windows {@literal L&F} implementation of a FileChooser.
*
* @author Jeff Dinkins
*/
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java Thu Jun 25 07:13:27 2015 +0000
@@ -47,7 +47,7 @@
* Renders a text String in Windows without the mnemonic.
* This is here because the WindowsUI hierarchy doesn't match the Component hierarchy. All
* the overriden paintText methods of the ButtonUI delegates will call this static method.
- * <p>
+ *
* @param g Graphics context
* @param b Current button to render
* @param textRect Bounding rectangle to render the text.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java Thu Jun 25 07:13:27 2015 +0000
@@ -38,7 +38,7 @@
import sun.swing.MenuItemCheckIconFactory;
/**
- * Factory object that can vend Icons appropriate for the Windows L & F.
+ * Factory object that can vend Icons appropriate for the Windows {@literal L & F}.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java Thu Jun 25 07:13:27 2015 +0000
@@ -503,7 +503,7 @@
private Icon[] icons;
/**
- * @params objects an array of Icon or UIDefaults.LazyValue
+ * @param objects an array of Icon or UIDefaults.LazyValue
* <p>
* The constructor is public so it can be called by UIDefaults.ProxyLazyValue.
*/
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -70,7 +70,7 @@
/**
* Method which renders the text of the current menu item.
- * <p>
+ *
* @param g Graphics context
* @param menuItem Current menu item to render
* @param textRect Bounding rectangle to render the text.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -199,7 +199,7 @@
/**
* Method which renders the text of the current menu item.
- * <p>
+ *
* @param g Graphics context
* @param menuItem Current menu item to render
* @param textRect Bounding rectangle to render the text.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -36,7 +36,7 @@
import com.sun.java.swing.plaf.windows.XPStyle.Skin;
/**
- * Windows L&F implementation of PopupMenuSeparatorUI.
+ * Windows {@literal L&F} implementation of PopupMenuSeparatorUI.
*
* @author Leif Samuelsson
* @author Igor Kushnirskiy
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -76,7 +76,7 @@
/**
* Method which renders the text of the current menu item.
- * <p>
+ *
* @param g Graphics context
* @param menuItem Current menu item to render
* @param textRect Bounding rectangle to render the text.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsSeparatorUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsSeparatorUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -29,7 +29,5 @@
/**
* Windows Separator.
- * <p>
- *
*/
public class WindowsSeparatorUI extends BasicSeparatorUI { }
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI.java Thu Jun 25 07:13:27 2015 +0000
@@ -37,7 +37,6 @@
/**
* Draws Windows toolbar separators.
- * <p>
*
* @author Mark Davidson
*/
--- a/jdk/src/java.desktop/share/classes/java/awt/ScrollPane.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/java/awt/ScrollPane.java Thu Jun 25 07:13:27 2015 +0000
@@ -499,9 +499,8 @@
Point p = getScrollPosition();
Dimension cs = calculateChildSize();
Dimension vs = getViewportSize();
- Insets i = getInsets();
- c.reshape(i.left - p.x, i.top - p.y, cs.width, cs.height);
+ c.reshape(- p.x, - p.y, cs.width, cs.height);
ScrollPanePeer peer = (ScrollPanePeer)this.peer;
if (peer != null) {
peer.childResized(cs.width, cs.height);
--- a/jdk/src/java.desktop/share/classes/java/beans/BeanDescriptor.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/java/beans/BeanDescriptor.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 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
@@ -81,10 +81,7 @@
SwingContainer container = beanClass.getAnnotation(SwingContainer.class);
if (container != null) {
setValue("isContainer", container.value());
- String delegate = container.delegate();
- if (!delegate.isEmpty()) {
- setValue("containerDelegate", delegate);
- }
+ setValue("containerDelegate", container.delegate());
}
}
--- a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java Thu Jun 25 07:13:27 2015 +0000
@@ -70,8 +70,8 @@
* The standard MultipleDocumentHandling values are:
* <UL>
* <LI>
- * <A NAME="sdfi">{@link #SINGLE_DOCUMENT
- * <B>SINGLE_DOCUMENT</B>}</A>. If a print job has multiple
+ * <a NAME="sdfi"></a>{@link #SINGLE_DOCUMENT
+ * <B>SINGLE_DOCUMENT</B>}. If a print job has multiple
* documents -- say, the document data is called <CODE>a</CODE> and
* <CODE>b</CODE> -- then the result of processing all the document data
* (<CODE>a</CODE> and then <CODE>b</CODE>) must be treated as a single sequence
@@ -85,8 +85,8 @@
* each copy (<CODE>a(*),b(*)</CODE>) to start on a new media sheet.
*
* <LI>
- * <A NAME="sducfi">{@link #SEPARATE_DOCUMENTS_UNCOLLATED_COPIES
- * <B>SEPARATE_DOCUMENTS_UNCOLLATED_COPIES</B>}</A>. If a print job
+ * <a NAME="sducfi"></a>{@link #SEPARATE_DOCUMENTS_UNCOLLATED_COPIES
+ * <B>SEPARATE_DOCUMENTS_UNCOLLATED_COPIES</B>}. If a print job
* has multiple documents -- say, the document data is called <CODE>a</CODE> and
* <CODE>b</CODE> -- then the result of processing the data in each document
* instance must be treated as a single sequence of media sheets for finishing
@@ -98,8 +98,8 @@
* <CODE>a(*),a(*),...,b(*),b(*)...</CODE>.
*
* <LI>
- * <A NAME="sdccfi">{@link #SEPARATE_DOCUMENTS_COLLATED_COPIES
- * <B>SEPARATE_DOCUMENTS_COLLATED_COPIES</B>}</A>. If a print job
+ * <a NAME="sdccfi"></a>{@link #SEPARATE_DOCUMENTS_COLLATED_COPIES
+ * <B>SEPARATE_DOCUMENTS_COLLATED_COPIES</B>}. If a print job
* has multiple documents -- say, the document data is called <CODE>a</CODE> and
* <CODE>b</CODE> -- then the result of processing the data in each document
* instance must be treated as a single sequence of media sheets for finishing
@@ -111,8 +111,8 @@
* <CODE>a(*),b(*),a(*),b(*),...</CODE>.
*
* <LI>
- * <A NAME="sdnsfi">{@link #SINGLE_DOCUMENT_NEW_SHEET
- * <B>SINGLE_DOCUMENT_NEW_SHEET</B>}</A>. Same as SINGLE_DOCUMENT,
+ * <a NAME="sdnsfi"></a>{@link #SINGLE_DOCUMENT_NEW_SHEET
+ * <B>SINGLE_DOCUMENT_NEW_SHEET</B>}. Same as SINGLE_DOCUMENT,
* except that the printer must ensure that the first impression of each
* document instance in the job is placed on a new media sheet. This value
* allows multiple documents to be stapled together with a single staple where
@@ -153,7 +153,6 @@
* <CODE>getName()</CODE> is the IPP attribute name. The enumeration's
* integer value is the IPP enum value. The <code>toString()</code> method
* returns the IPP string representation of the attribute value.
- * <P>
*
* @see Copies
* @see Finishings
--- a/jdk/src/java.desktop/share/classes/javax/swing/Timer.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/javax/swing/Timer.java Thu Jun 25 07:13:27 2015 +0000
@@ -141,7 +141,7 @@
* has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
*
- * @see java.util.Timer <code>java.util.Timer</code>
+ * @see java.util.Timer
*
*
* @author Dave Moore
--- a/jdk/src/java.desktop/share/classes/sun/applet/AppletPanel.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletPanel.java Thu Jun 25 07:13:27 2015 +0000
@@ -344,12 +344,14 @@
* Execute applet events.
* Here is the state transition diagram
*
+ * <pre>{@literal
* Note: (XXX) is the action
* APPLET_XXX is the state
- * (applet code loaded) --> APPLET_LOAD -- (applet init called)--> APPLET_INIT -- (
- * applet start called) --> APPLET_START -- (applet stop called) -->APPLET_STOP --(applet
- * destroyed called) --> APPLET_DESTROY -->(applet gets disposed) -->
- * APPLET_DISPOSE -->....
+ * (applet code loaded) --> APPLET_LOAD -- (applet init called)--> APPLET_INIT --
+ * (applet start called) --> APPLET_START -- (applet stop called) --> APPLET_STOP --
+ * (applet destroyed called) --> APPLET_DESTROY --> (applet gets disposed) -->
+ * APPLET_DISPOSE --> ...
+ * }</pre>
*
* In the legacy lifecycle model. The applet gets loaded, inited and started. So it stays
* in the APPLET_START state unless the applet goes away(refresh page or leave the page).
@@ -364,10 +366,9 @@
* APPLET_STOP to APPLET_DESTROY and to APPLET_INIT .
*
* Also, the applet can jump from APPLET_INIT state to APPLET_DESTROY (in Netscape/Mozilla case).
- * Same as APPLET_LOAD to
+ * Same as APPLET_LOAD to
* APPLET_DISPOSE since all of this are triggered by browser.
*
- *
*/
@Override
public void run() {
--- a/jdk/src/java.desktop/share/classes/sun/applet/AppletViewer.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletViewer.java Thu Jun 25 07:13:27 2015 +0000
@@ -1093,7 +1093,7 @@
}
/**
- * Scan an html file for <applet> tags
+ * Scan an html file for {@code <applet>} tags
*/
public static void parse(URL url, String enc) throws IOException {
encoding = enc;
--- a/jdk/src/java.desktop/share/classes/sun/java2d/opengl/OGLBlitLoops.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/opengl/OGLBlitLoops.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -59,6 +59,10 @@
TransformBlit transformBlitIntArgbPreToSurface =
new OGLSwToSurfaceTransform(SurfaceType.IntArgbPre,
OGLSurfaceData.PF_INT_ARGB_PRE);
+ OGLSurfaceToSwBlit blitSurfaceToIntArgbPre =
+ new OGLSurfaceToSwBlit(SurfaceType.IntArgbPre,
+ OGLSurfaceData.PF_INT_ARGB_PRE);
+
GraphicsPrimitive[] primitives = {
// surface->surface ops
new OGLSurfaceToSurfaceBlit(),
@@ -73,8 +77,7 @@
// surface->sw ops
new OGLSurfaceToSwBlit(SurfaceType.IntArgb,
OGLSurfaceData.PF_INT_ARGB),
- new OGLSurfaceToSwBlit(SurfaceType.IntArgbPre,
- OGLSurfaceData.PF_INT_ARGB_PRE),
+ blitSurfaceToIntArgbPre,
// sw->surface ops
blitIntArgbPreToSurface,
@@ -102,7 +105,14 @@
CompositeType.AnyAlpha,
blitIntArgbPreToSurface),
- new OGLAnyCompositeBlit(),
+ new OGLAnyCompositeBlit(OGLSurfaceData.OpenGLSurface,
+ blitSurfaceToIntArgbPre,
+ blitSurfaceToIntArgbPre,
+ blitIntArgbPreToSurface),
+ new OGLAnyCompositeBlit(SurfaceType.Any,
+ null,
+ blitSurfaceToIntArgbPre,
+ blitIntArgbPreToSurface),
new OGLSwToSurfaceScale(SurfaceType.IntRgb,
OGLSurfaceData.PF_INT_RGB),
@@ -869,11 +879,26 @@
}
}
+/**
+ * This general OGLAnyCompositeBlit implementation can convert any source/target
+ * surface to an intermediate surface using convertsrc/convertdst loops, applies
+ * necessary composite operation, and then uses convertresult loop to get the
+ * intermediate surface down to OpenGL.
+ */
final class OGLAnyCompositeBlit extends Blit {
- private WeakReference<SurfaceData> dstTmp;
- OGLAnyCompositeBlit() {
- super(SurfaceType.Any, CompositeType.Any, OGLSurfaceData.OpenGLSurface);
+ private WeakReference<SurfaceData> dstTmp;
+ private WeakReference<SurfaceData> srcTmp;
+ private final Blit convertsrc;
+ private final Blit convertdst;
+ private final Blit convertresult;
+
+ OGLAnyCompositeBlit(SurfaceType srctype, Blit convertsrc, Blit convertdst,
+ Blit convertresult) {
+ super(srctype, CompositeType.Any, OGLSurfaceData.OpenGLSurface);
+ this.convertsrc = convertsrc;
+ this.convertdst = convertdst;
+ this.convertresult = convertresult;
}
public synchronized void Blit(SurfaceData src, SurfaceData dst,
@@ -881,9 +906,20 @@
int sx, int sy, int dx, int dy,
int w, int h)
{
- Blit convertdst = Blit.getFromCache(dst.getSurfaceType(),
- CompositeType.SrcNoEa,
- SurfaceType.IntArgbPre);
+ if (convertsrc != null) {
+ SurfaceData cachedSrc = null;
+ if (srcTmp != null) {
+ // use cached intermediate surface, if available
+ cachedSrc = srcTmp.get();
+ }
+ // convert source to IntArgbPre
+ src = convertFrom(convertsrc, src, sx, sy, w, h, cachedSrc,
+ BufferedImage.TYPE_INT_ARGB_PRE);
+ if (src != cachedSrc) {
+ // cache the intermediate surface
+ srcTmp = new WeakReference<>(src);
+ }
+ }
SurfaceData cachedDst = null;
@@ -906,12 +942,8 @@
// cache the intermediate surface
dstTmp = new WeakReference<>(dstBuffer);
}
-
// now blit the buffer back to the destination
- convertdst = Blit.getFromCache(dstBuffer.getSurfaceType(),
- CompositeType.SrcNoEa,
- dst.getSurfaceType());
- convertdst.Blit(dstBuffer, dst, AlphaComposite.Src,
- clip, 0, 0, dx, dy, w, h);
+ convertresult.Blit(dstBuffer, dst, AlphaComposite.Src, clip, 0, 0, dx,
+ dy, w, h);
}
}
--- a/jdk/src/java.desktop/share/classes/sun/java2d/opengl/OGLSurfaceData.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/java2d/opengl/OGLSurfaceData.java Thu Jun 25 07:13:27 2015 +0000
@@ -26,6 +26,7 @@
package sun.java2d.opengl;
import java.awt.AlphaComposite;
+import java.awt.Composite;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Transparency;
@@ -400,8 +401,8 @@
/**
* For now, we can only render LCD text if:
* - the fragment shader extension is available, and
- * - blending is disabled, and
- * - the source color is opaque
+ * - the source color is opaque, and
+ * - blending is SrcOverNoEa or disabled
* - and the destination is opaque
*
* Eventually, we could enhance the native OGL text rendering code
@@ -411,9 +412,19 @@
public boolean canRenderLCDText(SunGraphics2D sg2d) {
return
graphicsConfig.isCapPresent(CAPS_EXT_LCD_SHADER) &&
- sg2d.compositeState <= SunGraphics2D.COMP_ISCOPY &&
+ sg2d.surfaceData.getTransparency() == Transparency.OPAQUE &&
sg2d.paintState <= SunGraphics2D.PAINT_OPAQUECOLOR &&
- sg2d.surfaceData.getTransparency() == Transparency.OPAQUE;
+ (sg2d.compositeState <= SunGraphics2D.COMP_ISCOPY ||
+ (sg2d.compositeState <= SunGraphics2D.COMP_ALPHA && canHandleComposite(sg2d.composite)));
+ }
+
+ private boolean canHandleComposite(Composite c) {
+ if (c instanceof AlphaComposite) {
+ AlphaComposite ac = (AlphaComposite)c;
+
+ return ac.getRule() == AlphaComposite.SRC_OVER && ac.getAlpha() >= 1f;
+ }
+ return false;
}
public void validatePipe(SunGraphics2D sg2d) {
--- a/jdk/src/java.desktop/share/classes/sun/swing/AccumulativeRunnable.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/swing/AccumulativeRunnable.java Thu Jun 25 07:13:27 2015 +0000
@@ -49,10 +49,10 @@
* <p>
* Here is how one can do this using {@code AccumulativeRunnable}:
* <pre>
- * AccumulativeRunnable<String> doSetTextImpl =
- * new AccumulativeRunnable<String>() {
- * @Override
- * protected void run(List<String> args) {
+ * {@code AccumulativeRunnable<String> doSetTextImpl =
+ * new AccumulativeRunnable<String>()} {
+ * {@literal @Override}
+ * {@code protected void run(List<String> args)} {
* //set to the last string being passed
* setTextImpl(args.get(args.size() - 1));
* }
@@ -66,16 +66,16 @@
* <p>
* Say we want to implement addDirtyRegion(Rectangle rect)
* which sends this region to the
- * handleDirtyRegions(List<Rect> regiouns) on the EDT.
+ * {@code handleDirtyRegions(List<Rect> regiouns)} on the EDT.
* addDirtyRegions better be accumulated before handling on the EDT.
*
* <p>
* Here is how it can be implemented using AccumulativeRunnable:
* <pre>
- * AccumulativeRunnable<Rectangle> doHandleDirtyRegions =
- * new AccumulativeRunnable<Rectangle>() {
- * @Override
- * protected void run(List<Rectangle> args) {
+ * {@code AccumulativeRunnable<Rectangle> doHandleDirtyRegions =}
+ * {@code new AccumulativeRunnable<Rectangle>()} {
+ * {@literal @Override}
+ * {@code protected void run(List<Rectangle> args)} {
* handleDirtyRegions(args);
* }
* };
@@ -113,7 +113,7 @@
}
/**
- * appends arguments and sends this {@cod Runnable} for the
+ * appends arguments and sends this {@code Runnable} for the
* execution if needed.
* <p>
* This implementation uses {@see #submit} to send this
--- a/jdk/src/java.desktop/share/classes/sun/swing/PrintColorUIResource.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/swing/PrintColorUIResource.java Thu Jun 25 07:13:27 2015 +0000
@@ -72,7 +72,7 @@
* manager. When access is disallowed, deserialization of any object
* with reference to a {@code PrintColorUIResource} fails.
* <p>
- * Since {@code PrintColorUIResource) is used only by Swing's look
+ * Since {@code PrintColorUIResource} is used only by Swing's look
* and feels, and we know that UI supplied colors are replaced after
* deserialization when the UI is re-installed, the only important
* aspect of the {@code PrintColorUIResource} that needs to be
--- a/jdk/src/java.desktop/share/classes/sun/swing/PrintingStatus.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/swing/PrintingStatus.java Thu Jun 25 07:13:27 2015 +0000
@@ -40,7 +40,7 @@
/**
* The {@code PrintingStatus} provides a dialog that displays progress
* of the printing job and provides a way to abort it
- * <p/>
+ * <p>
* Methods of these class are thread safe, although most Swing methods
* are not. Please see
* <A HREF="http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html">Concurrency
--- a/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/swing/SwingUtilities2.java Thu Jun 25 07:13:27 2015 +0000
@@ -662,7 +662,8 @@
* Point is within the actual bounds of a list item (not just in the cell)
* and if the JList has the "List.isFileList" client property set.
* Otherwise, this method returns -1.
- * This is used to make WindowsL&F JFileChooser act like native dialogs.
+ * This is used to make Windows {@literal L&F} JFileChooser act
+ * like native dialogs.
*/
public static int loc2IndexFileList(JList<?> list, Point point) {
int index = list.locationToIndex(point);
@@ -703,7 +704,8 @@
* item at the given row of the table. (Column must be 0).
* Does not check the "Table.isFileList" property. That should be checked
* before calling this method.
- * This is used to make WindowsL&F JFileChooser act like native dialogs.
+ * This is used to make Windows {@literal L&F} JFileChooser act
+ * like native dialogs.
*/
public static boolean pointOutsidePrefSize(JTable table, int row, int column, Point p) {
if (table.convertColumnIndexToModel(column) != 0 || row == -1) {
--- a/jdk/src/java.desktop/share/classes/sun/swing/UIClientPropertyKey.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/swing/UIClientPropertyKey.java Thu Jun 25 07:13:27 2015 +0000
@@ -27,7 +27,7 @@
/**
* This interface is used only for tagging keys for client properties
- * for {@code JComponent} set by UI which needs to be cleared on L&F
+ * for {@code JComponent} set by UI which needs to be cleared on {@literal L&F}
* change and serialization.
*
* All such keys are removed from client properties in {@code
--- a/jdk/src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java Thu Jun 25 07:13:27 2015 +0000
@@ -43,7 +43,6 @@
* <b>WARNING:</b> This class is an implementation detail and is only
* public so that it can be used by two packages. You should NOT consider
* this public API.
- * <p>
*
* @author Leif Samuelsson
*/
--- a/jdk/src/java.desktop/share/native/common/java2d/opengl/OGLContext.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/native/common/java2d/opengl/OGLContext.c Thu Jun 25 07:13:27 2015 +0000
@@ -750,7 +750,7 @@
// finally, check to see if the hardware supports the required number
// of texture units
j2d_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &maxTexUnits);
- if (maxTexUnits < 4) {
+ if (maxTexUnits < 2) {
J2dRlsTraceLn1(J2D_TRACE_INFO,
"OGLContext_IsLCDShaderSupportAvailable: not enough tex units (%d)",
maxTexUnits);
--- a/jdk/src/java.desktop/share/native/common/java2d/opengl/OGLTextRenderer.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/native/common/java2d/opengl/OGLTextRenderer.c Thu Jun 25 07:13:27 2015 +0000
@@ -95,22 +95,9 @@
static GLhandleARB lcdTextProgram = 0;
/**
- * The size of one of the gamma LUT textures in any one dimension along
- * the edge, in texels.
- */
-#define LUT_EDGE 16
-
-/**
- * These are the texture object handles for the gamma and inverse gamma
- * lookup tables.
- */
-static GLuint gammaLutTextureID = 0;
-static GLuint invGammaLutTextureID = 0;
-
-/**
* This value tracks the previous LCD contrast setting, so if the contrast
- * value hasn't changed since the last time the lookup tables were
- * generated (not very common), then we can skip updating the tables.
+ * value hasn't changed since the last time the gamma uniforms were
+ * updated (not very common), then we can skip updating the unforms.
*/
static jint lastLCDContrast = -1;
@@ -275,12 +262,9 @@
* changes, we will modify the "src_adj" value in OGLTR_UpdateLCDTextColor()).
*
* The "main" function is executed for each "fragment" (or pixel) in the
- * glyph image. We have determined that the pow() function can be quite
- * slow and it only operates on scalar values, not vectors as we require.
- * So instead we build two 3D textures containing gamma (and inverse gamma)
- * lookup tables that allow us to approximate a component-wise pow() function
- * with a single 3D texture lookup. This approach is at least 2x faster
- * than the equivalent pow() calls.
+ * glyph image. The pow() routine operates on vectors, gives precise results,
+ * and provides acceptable level of performance, so we use it to perform
+ * the gamma adjustment.
*
* The variables involved in the equation can be expressed as follows:
*
@@ -299,8 +283,8 @@
"uniform vec3 src_adj;"
"uniform sampler2D glyph_tex;"
"uniform sampler2D dst_tex;"
- "uniform sampler3D invgamma_tex;"
- "uniform sampler3D gamma_tex;"
+ "uniform vec3 gamma;"
+ "uniform vec3 invgamma;"
""
"void main(void)"
"{"
@@ -312,12 +296,12 @@
" }"
// load the RGB value from the corresponding destination pixel
" vec3 dst_clr = vec3(texture2D(dst_tex, gl_TexCoord[1].st));"
- // gamma adjust the dest color using the invgamma LUT
- " vec3 dst_adj = vec3(texture3D(invgamma_tex, dst_clr.stp));"
+ // gamma adjust the dest color
+ " vec3 dst_adj = pow(dst_clr.rgb, gamma);"
// linearly interpolate the three color values
" vec3 result = mix(dst_adj, src_adj, glyph_clr);"
// gamma re-adjust the resulting color (alpha is always set to 1.0)
- " gl_FragColor = vec4(vec3(texture3D(gamma_tex, result.stp)), 1.0);"
+ " gl_FragColor = vec4(pow(result.rgb, invgamma), 1.0);"
"}";
/**
@@ -348,10 +332,6 @@
j2d_glUniform1iARB(loc, 0); // texture unit 0
loc = j2d_glGetUniformLocationARB(lcdTextProgram, "dst_tex");
j2d_glUniform1iARB(loc, 1); // texture unit 1
- loc = j2d_glGetUniformLocationARB(lcdTextProgram, "invgamma_tex");
- j2d_glUniform1iARB(loc, 2); // texture unit 2
- loc = j2d_glGetUniformLocationARB(lcdTextProgram, "gamma_tex");
- j2d_glUniform1iARB(loc, 3); // texture unit 3
// "unuse" the program object; it will be re-bound later as needed
j2d_glUseProgramObjectARB(0);
@@ -360,108 +340,26 @@
}
/**
- * Initializes a 3D texture object for use as a three-dimensional gamma
- * lookup table. Note that the wrap mode is initialized to GL_LINEAR so
- * that the table will interpolate adjacent values when the index falls
- * somewhere in between.
- */
-static GLuint
-OGLTR_InitGammaLutTexture()
-{
- GLuint lutTextureID;
-
- j2d_glGenTextures(1, &lutTextureID);
- j2d_glBindTexture(GL_TEXTURE_3D, lutTextureID);
- j2d_glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- j2d_glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- j2d_glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- j2d_glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- j2d_glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
-
- return lutTextureID;
-}
-
-/**
- * Updates the lookup table in the given texture object with the float
- * values in the given system memory buffer. Note that we could use
- * glTexSubImage3D() when updating the texture after its first
- * initialization, but since we're updating the entire table (with
- * power-of-two dimensions) and this is a relatively rare event, we'll
- * just stick with glTexImage3D().
- */
-static void
-OGLTR_UpdateGammaLutTexture(GLuint texID, GLfloat *lut, jint size)
-{
- j2d_glBindTexture(GL_TEXTURE_3D, texID);
- j2d_glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8,
- size, size, size, 0, GL_RGB, GL_FLOAT, lut);
-}
-
-/**
- * (Re)Initializes the gamma lookup table textures.
+ * (Re)Initializes the gamma related uniforms.
*
* The given contrast value is an int in the range [100, 250] which we will
- * then scale to fit in the range [1.0, 2.5]. We create two LUTs, one
- * that essentially calculates pow(x, gamma) and the other calculates
- * pow(x, 1/gamma). These values are replicated in all three dimensions, so
- * given a single 3D texture coordinate (typically this will be a triplet
- * in the form (r,g,b)), the 3D texture lookup will return an RGB triplet:
- *
- * (pow(r,g), pow(y,g), pow(z,g)
- *
- * where g is either gamma or 1/gamma, depending on the table.
+ * then scale to fit in the range [1.0, 2.5].
*/
static jboolean
OGLTR_UpdateLCDTextContrast(jint contrast)
{
- double gamma = ((double)contrast) / 100.0;
- double ig = gamma;
- double g = 1.0 / ig;
- GLfloat lut[LUT_EDGE][LUT_EDGE][LUT_EDGE][3];
- GLfloat invlut[LUT_EDGE][LUT_EDGE][LUT_EDGE][3];
- int min = 0;
- int max = LUT_EDGE - 1;
- int x, y, z;
+ double g = ((double)contrast) / 100.0;
+ double ig = 1.0 / g;
+ GLint loc;
J2dTraceLn1(J2D_TRACE_INFO,
"OGLTR_UpdateLCDTextContrast: contrast=%d", contrast);
- for (z = min; z <= max; z++) {
- double zval = ((double)z) / max;
- GLfloat gz = (GLfloat)pow(zval, g);
- GLfloat igz = (GLfloat)pow(zval, ig);
-
- for (y = min; y <= max; y++) {
- double yval = ((double)y) / max;
- GLfloat gy = (GLfloat)pow(yval, g);
- GLfloat igy = (GLfloat)pow(yval, ig);
-
- for (x = min; x <= max; x++) {
- double xval = ((double)x) / max;
- GLfloat gx = (GLfloat)pow(xval, g);
- GLfloat igx = (GLfloat)pow(xval, ig);
+ loc = j2d_glGetUniformLocationARB(lcdTextProgram, "gamma");
+ j2d_glUniform3fARB(loc, g, g, g);
- lut[z][y][x][0] = gx;
- lut[z][y][x][1] = gy;
- lut[z][y][x][2] = gz;
-
- invlut[z][y][x][0] = igx;
- invlut[z][y][x][1] = igy;
- invlut[z][y][x][2] = igz;
- }
- }
- }
-
- if (gammaLutTextureID == 0) {
- gammaLutTextureID = OGLTR_InitGammaLutTexture();
- }
- OGLTR_UpdateGammaLutTexture(gammaLutTextureID, (GLfloat *)lut, LUT_EDGE);
-
- if (invGammaLutTextureID == 0) {
- invGammaLutTextureID = OGLTR_InitGammaLutTexture();
- }
- OGLTR_UpdateGammaLutTexture(invGammaLutTextureID,
- (GLfloat *)invlut, LUT_EDGE);
+ loc = j2d_glGetUniformLocationARB(lcdTextProgram, "invgamma");
+ j2d_glUniform3fARB(loc, ig, ig, ig);
return JNI_TRUE;
}
@@ -562,14 +460,6 @@
return JNI_FALSE;
}
- // bind the gamma LUT textures
- j2d_glActiveTextureARB(GL_TEXTURE2_ARB);
- j2d_glBindTexture(GL_TEXTURE_3D, invGammaLutTextureID);
- j2d_glEnable(GL_TEXTURE_3D);
- j2d_glActiveTextureARB(GL_TEXTURE3_ARB);
- j2d_glBindTexture(GL_TEXTURE_3D, gammaLutTextureID);
- j2d_glEnable(GL_TEXTURE_3D);
-
return JNI_TRUE;
}
@@ -629,10 +519,6 @@
j2d_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
j2d_glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
j2d_glUseProgramObjectARB(0);
- j2d_glActiveTextureARB(GL_TEXTURE3_ARB);
- j2d_glDisable(GL_TEXTURE_3D);
- j2d_glActiveTextureARB(GL_TEXTURE2_ARB);
- j2d_glDisable(GL_TEXTURE_3D);
j2d_glActiveTextureARB(GL_TEXTURE1_ARB);
j2d_glDisable(GL_TEXTURE_2D);
j2d_glActiveTextureARB(GL_TEXTURE0_ARB);
--- a/jdk/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c Thu Jun 25 07:13:27 2015 +0000
@@ -82,8 +82,8 @@
int i, j;
int imageIndex;
int cx, cy, cw, ch; /* clamped coordinates */
- int numLines;
- int numPassLines;
+ const int interlacedOffset[] = { 0, 4, 2, 1, 0 }; /* The way Interlaced image should. */
+ const int interlacedJumps[] = { 8, 8, 4, 2, 1 }; /* be read - offsets and jumps... */
if (DGifSlurp(gif) == GIF_ERROR) {
return 0;
@@ -213,6 +213,16 @@
byte_t *pSrc = image->RasterBits;
ImageFormat srcFormat;
ImageRect srcRect, dstRect;
+ int pass = 4, npass = 5;
+
+#if GIFLIB_MAJOR < 5
+ /* Interlaced gif support is broken in giflib < 5
+ so we need to work around this */
+ if (desc->Interlace) {
+ pass = 0;
+ npass = 4;
+ }
+#endif
srcFormat.colorMap = colorMapBuf;
srcFormat.depthBytes = 1;
@@ -221,22 +231,26 @@
srcFormat.fixedBits = QUAD_ALPHA_MASK; // fixed 100% alpha
srcFormat.premultiplied = 0;
- /* Number of source lines for current pass */
- numPassLines = desc->Height;
- /* Number of lines that fits to dest buffer */
- numLines = ch;
-
- initRect(&srcRect, 0, 0, desc->Width, numLines, 1,
- desc->Width, pSrc, &srcFormat);
+ for (; pass < npass; ++pass) {
+ int jump = interlacedJumps[pass];
+ int ofs = interlacedOffset[pass];
+ /* Number of source lines for current pass */
+ int numPassLines = (desc->Height + jump - ofs - 1) / jump;
+ /* Number of lines that fits to dest buffer */
+ int numLines = (ch + jump - ofs - 1) / jump;
- if (numLines > 0) {
- initRect(&dstRect, cx, cy, cw,
- numLines , 1, stride, pBitmapBits, &splash->imageFormat);
+ initRect(&srcRect, 0, 0, desc->Width, numLines, 1,
+ desc->Width, pSrc, &srcFormat);
- pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST);
+ if (numLines > 0) {
+ initRect(&dstRect, cx, cy + ofs, cw,
+ numLines , jump, stride, pBitmapBits, &splash->imageFormat);
+
+ pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST);
+ }
+ // skip extra source data
+ pSrc += (numPassLines - numLines) * srcRect.stride;
}
- // skip extra source data
- pSrc += (numPassLines - numLines) * srcRect.stride;
}
// now dispose of the previous frame correctly
@@ -296,7 +310,13 @@
free(pBitmapBits);
free(pOldBitmapBits);
- DGifCloseFile(gif, NULL);
+#if GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1)
+ if (DGifCloseFile(gif, NULL) == GIF_ERROR) {
+ return 0;
+ }
+#else
+ DGifCloseFile(gif);
+#endif
return 1;
}
@@ -304,7 +324,11 @@
int
SplashDecodeGifStream(Splash * splash, SplashStream * stream)
{
+#if GIFLIB_MAJOR >= 5
GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc, NULL);
+#else
+ GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc);
+#endif
if (!gif)
return 0;
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XClipboard.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XClipboard.java Thu Jun 25 07:13:27 2015 +0000
@@ -156,19 +156,24 @@
isSelectionNotifyProcessed = true;
boolean mustSchedule = false;
- synchronized (XClipboard.classLock) {
- if (targetsAtom2Clipboard == null) {
- targetsAtom2Clipboard = new HashMap<Long, XClipboard>(2);
+ XToolkit.awtLock();
+ try {
+ synchronized (XClipboard.classLock) {
+ if (targetsAtom2Clipboard == null) {
+ targetsAtom2Clipboard = new HashMap<Long, XClipboard>(2);
+ }
+ mustSchedule = targetsAtom2Clipboard.isEmpty();
+ targetsAtom2Clipboard.put(getTargetsPropertyAtom().getAtom(), this);
+ if (mustSchedule) {
+ XToolkit.addEventDispatcher(XWindow.getXAWTRootWindow().getWindow(),
+ new SelectionNotifyHandler());
+ }
}
- mustSchedule = targetsAtom2Clipboard.isEmpty();
- targetsAtom2Clipboard.put(getTargetsPropertyAtom().getAtom(), this);
if (mustSchedule) {
- XToolkit.addEventDispatcher(XWindow.getXAWTRootWindow().getWindow(),
- new SelectionNotifyHandler());
+ XToolkit.schedule(new CheckChangeTimerTask(), XClipboard.getPollInterval());
}
- }
- if (mustSchedule) {
- XToolkit.schedule(new CheckChangeTimerTask(), XClipboard.getPollInterval());
+ } finally {
+ XToolkit.awtUnlock();
}
}
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XRootWindow.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XRootWindow.java Thu Jun 25 07:13:27 2015 +0000
@@ -31,18 +31,22 @@
* common logical ancestor
*/
class XRootWindow extends XBaseWindow {
- private static XRootWindow xawtRootWindow = null;
- static XRootWindow getInstance() {
- XToolkit.awtLock();
- try {
- if (xawtRootWindow == null) {
+ private static class LazyHolder {
+ private static final XRootWindow xawtRootWindow;
+
+ static {
+ XToolkit.awtLock();
+ try {
xawtRootWindow = new XRootWindow();
xawtRootWindow.init(xawtRootWindow.getDelayedParams().delete(DELAYED));
+ } finally {
+ XToolkit.awtUnlock();
}
- return xawtRootWindow;
- } finally {
- XToolkit.awtUnlock();
}
+
+ }
+ static XRootWindow getInstance() {
+ return LazyHolder.xawtRootWindow;
}
private XRootWindow() {
--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWindow.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWindow.java Thu Jun 25 07:13:27 2015 +0000
@@ -572,10 +572,6 @@
}
static int getModifiers(int state, int button, int keyCode) {
- return getModifiers(state, button, keyCode, 0, false);
- }
-
- static int getModifiers(int state, int button, int keyCode, int type, boolean wheel_mouse) {
int modifiers = 0;
if (((state & XConstants.ShiftMask) != 0) ^ (keyCode == KeyEvent.VK_SHIFT)) {
@@ -606,7 +602,7 @@
// ONLY one of these conditions should be TRUE to add that modifier.
if (((state & XlibUtil.getButtonMask(i + 1)) != 0) != (button == XConstants.buttons[i])){
//exclude wheel buttons from adding their numbers as modifiers
- if (!wheel_mouse) {
+ if (!isWheel(XConstants.buttons[i])) {
modifiers |= InputEvent.getMaskForButton(i+1);
}
}
@@ -614,6 +610,11 @@
return modifiers;
}
+ static boolean isWheel(int button) {
+ // 4 and 5 buttons are usually considered assigned to a first wheel
+ return button == XConstants.buttons[3] || button == XConstants.buttons[4];
+ }
+
static int getXModifiers(AWTKeyStroke stroke) {
int mods = stroke.getModifiers();
int res = 0;
@@ -653,7 +654,6 @@
int modifiers;
boolean popupTrigger = false;
int button=0;
- boolean wheel_mouse = false;
int lbutton = xbe.get_button();
/*
* Ignore the buttons above 20 due to the bit limit for
@@ -706,11 +706,6 @@
}
button = XConstants.buttons[lbutton - 1];
- // 4 and 5 buttons are usually considered assigned to a first wheel
- if (lbutton == XConstants.buttons[3] ||
- lbutton == XConstants.buttons[4]) {
- wheel_mouse = true;
- }
// mapping extra buttons to numbers starting from 4.
if ((button > XConstants.buttons[4]) && (!Toolkit.getDefaultToolkit().areExtraMouseButtonsEnabled())){
@@ -720,9 +715,9 @@
if (button > XConstants.buttons[4]){
button -= 2;
}
- modifiers = getModifiers(xbe.get_state(),button,0, type, wheel_mouse);
+ modifiers = getModifiers(xbe.get_state(),button,0);
- if (!wheel_mouse) {
+ if (!isWheel(lbutton)) {
MouseEvent me = new MouseEvent(getEventSource(),
type == XConstants.ButtonPress ? MouseEvent.MOUSE_PRESSED : MouseEvent.MOUSE_RELEASED,
jWhen,modifiers, x, y,
--- a/jdk/src/java.desktop/windows/native/libawt/java2d/d3d/D3DPipelineManager.cpp Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.desktop/windows/native/libawt/java2d/d3d/D3DPipelineManager.cpp Thu Jun 25 07:13:27 2015 +0000
@@ -828,7 +828,7 @@
return 0;
}
- HWND hWnd = CreateWindow(L"D3DFocusWindow", L"D3DFocusWindow", 0,
+ HWND hWnd = CreateWindow(L"D3DFocusWindow", L"D3DFocusWindow", WS_POPUP,
mi.rcMonitor.left, mi.rcMonitor.top, 1, 1,
NULL, NULL, GetModuleHandle(NULL), NULL);
if (hWnd == 0) {
--- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu Jun 25 07:13:27 2015 +0000
@@ -540,9 +540,10 @@
return result;
}
- Logger demandSystemLogger(String name, String resourceBundleName) {
+ Logger demandSystemLogger(String name, String resourceBundleName, Class<?> caller) {
// Add a system logger in the system context's namespace
- final Logger sysLogger = getSystemContext().demandLogger(name, resourceBundleName);
+ final Logger sysLogger = getSystemContext()
+ .demandLogger(name, resourceBundleName, caller);
// Add the system logger to the LogManager's namespace if not exist
// so that there is only one single logger of the given name.
@@ -627,11 +628,11 @@
return global;
}
- Logger demandLogger(String name, String resourceBundleName) {
+ Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
// a LogManager subclass may have its own implementation to add and
// get a Logger. So delegate to the LogManager to do the work.
final LogManager owner = getOwner();
- return owner.demandLogger(name, resourceBundleName, null);
+ return owner.demandLogger(name, resourceBundleName, caller);
}
@@ -869,7 +870,7 @@
owner.getProperty(pname + ".handlers") != null) {
// This pname has a level/handlers definition.
// Make sure it exists.
- demandLogger(pname, null);
+ demandLogger(pname, null, null);
}
ix = ix2+1;
}
@@ -912,11 +913,11 @@
// one single logger of the given name. System loggers are visible
// to applications unless a logger of the same name has been added.
@Override
- Logger demandLogger(String name, String resourceBundleName) {
+ Logger demandLogger(String name, String resourceBundleName, Class<?> caller) {
Logger result = findLogger(name);
if (result == null) {
// only allocate the new system logger once
- Logger newLogger = new Logger(name, resourceBundleName, null, getOwner(), true);
+ Logger newLogger = new Logger(name, resourceBundleName, caller, getOwner(), true);
do {
if (addLocalLogger(newLogger)) {
// We successfully added the new Logger that we
--- a/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Thu Jun 25 07:13:27 2015 +0000
@@ -450,7 +450,7 @@
SecurityManager sm = System.getSecurityManager();
if (sm != null && !SystemLoggerHelper.disableCallerCheck) {
if (caller.getClassLoader() == null) {
- return manager.demandSystemLogger(name, resourceBundleName);
+ return manager.demandSystemLogger(name, resourceBundleName, caller);
}
}
return manager.demandLogger(name, resourceBundleName, caller);
@@ -500,7 +500,23 @@
// would throw an IllegalArgumentException in the second call
// because the wrapper would result in an attempt to replace
// the existing "resourceBundleForFoo" with null.
- return demandLogger(name, null, Reflection.getCallerClass());
+ return Logger.getLogger(name, Reflection.getCallerClass());
+ }
+
+ /**
+ * Find or create a logger for a named subsystem on behalf
+ * of the given caller.
+ *
+ * This method is called by {@link #getLogger(java.lang.String)} after
+ * it has obtained a reference to its caller's class.
+ *
+ * @param name A name for the logger.
+ * @param callerClass The class that called {@link
+ * #getLogger(java.lang.String)}.
+ * @return a suitable Logger for {@code callerClass}.
+ */
+ private static Logger getLogger(String name, Class<?> callerClass) {
+ return demandLogger(name, null, callerClass);
}
/**
@@ -550,7 +566,30 @@
// adding a new Logger object is handled by LogManager.addLogger().
@CallerSensitive
public static Logger getLogger(String name, String resourceBundleName) {
- Class<?> callerClass = Reflection.getCallerClass();
+ return Logger.getLogger(name, resourceBundleName, Reflection.getCallerClass());
+ }
+
+ /**
+ * Find or create a logger for a named subsystem on behalf
+ * of the given caller.
+ *
+ * This method is called by {@link
+ * #getLogger(java.lang.String, java.lang.String)} after
+ * it has obtained a reference to its caller's class.
+ *
+ * @param name A name for the logger.
+ * @param resourceBundleName name of ResourceBundle to be used for localizing
+ * messages for this logger. May be {@code null}
+ * if none of the messages require localization.
+ * @param callerClass The class that called {@link
+ * #getLogger(java.lang.String, java.lang.String)}.
+ * This class will also be used for locating the
+ * resource bundle if {@code resourceBundleName} is
+ * not {@code null}.
+ * @return a suitable Logger for {@code callerClass}.
+ */
+ private static Logger getLogger(String name, String resourceBundleName,
+ Class<?> callerClass) {
Logger result = demandLogger(name, resourceBundleName, callerClass);
// MissingResourceException or IllegalArgumentException can be
@@ -573,8 +612,9 @@
LogManager manager = LogManager.getLogManager();
// all loggers in the system context will default to
- // the system logger's resource bundle
- Logger result = manager.demandSystemLogger(name, SYSTEM_LOGGER_RB_NAME);
+ // the system logger's resource bundle - therefore the caller won't
+ // be needed and can be null.
+ Logger result = manager.demandSystemLogger(name, SYSTEM_LOGGER_RB_NAME, null);
return result;
}
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Thu Jun 25 07:13:27 2015 +0000
@@ -358,7 +358,7 @@
* Serializes only the unparsed DN, for compactness and to avoid
* any implementation dependency.
*
- * @serialdata The DN string and a boolean indicating whether
+ * @serialData The DN string and a boolean indicating whether
* the values are case sensitive.
*/
private void writeObject(java.io.ObjectOutputStream s)
--- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -25,14 +25,15 @@
package javax.security.auth.kerberos;
-import java.util.*;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
+import java.security.BasicPermission;
import java.security.Permission;
-import java.security.BasicPermission;
import java.security.PermissionCollection;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
/**
* This class is used to restrict the usage of the Kerberos
@@ -137,6 +138,7 @@
* @return true if the specified permission is implied by this object,
* false if not.
*/
+ @Override
public boolean implies(Permission p) {
if (!(p instanceof DelegationPermission))
return false;
@@ -159,6 +161,7 @@
* has the same subordinate and service principal as this.
* DelegationPermission object.
*/
+ @Override
public boolean equals(Object obj) {
if (obj == this)
return true;
@@ -175,11 +178,11 @@
*
* @return a hash code value for this object.
*/
+ @Override
public int hashCode() {
return getName().hashCode();
}
-
/**
* Returns a PermissionCollection object for storing
* DelegationPermission objects.
@@ -192,7 +195,7 @@
* @return a new PermissionCollection object suitable for storing
* DelegationPermissions.
*/
-
+ @Override
public PermissionCollection newPermissionCollection() {
return new KrbDelegationPermissionCollection();
}
@@ -263,13 +266,12 @@
implements java.io.Serializable {
// Not serialized; see serialization section at end of class.
- private transient List<Permission> perms;
+ private transient ConcurrentHashMap<Permission, Boolean> perms;
public KrbDelegationPermissionCollection() {
- perms = new ArrayList<Permission>();
+ perms = new ConcurrentHashMap<>();
}
-
/**
* Check and see if this collection of permissions implies the permissions
* expressed in "permission".
@@ -279,18 +281,13 @@
* @return true if "permission" is a proper subset of a permission in
* the collection, false if not.
*/
+ @Override
public boolean implies(Permission permission) {
if (! (permission instanceof DelegationPermission))
- return false;
+ return false;
- synchronized (this) {
- for (Permission x : perms) {
- if (x.implies(permission))
- return true;
- }
- }
- return false;
-
+ // if map contains key, then it automatically implies it
+ return perms.containsKey(permission);
}
/**
@@ -305,6 +302,7 @@
* @exception SecurityException - if this PermissionCollection object
* has been marked readonly
*/
+ @Override
public void add(Permission permission) {
if (! (permission instanceof DelegationPermission))
throw new IllegalArgumentException("invalid permission: "+
@@ -312,9 +310,7 @@
if (isReadOnly())
throw new SecurityException("attempt to add a Permission to a readonly PermissionCollection");
- synchronized (this) {
- perms.add(0, permission);
- }
+ perms.put(permission, Boolean.TRUE);
}
/**
@@ -323,11 +319,9 @@
*
* @return an enumeration of all the DelegationPermission objects.
*/
+ @Override
public Enumeration<Permission> elements() {
- // Convert Iterator into Enumeration
- synchronized (this) {
- return Collections.enumeration(perms);
- }
+ return perms.keys();
}
private static final long serialVersionUID = -3383936936589966948L;
@@ -354,11 +348,7 @@
// Don't call out.defaultWriteObject()
// Write out Vector
- Vector<Permission> permissions = new Vector<>(perms.size());
-
- synchronized (this) {
- permissions.addAll(perms);
- }
+ Vector<Permission> permissions = new Vector<>(perms.keySet());
ObjectOutputStream.PutField pfields = out.putFields();
pfields.put("permissions", permissions);
@@ -379,8 +369,10 @@
// Get the one we want
Vector<Permission> permissions =
- (Vector<Permission>)gfields.get("permissions", null);
- perms = new ArrayList<Permission>(permissions.size());
- perms.addAll(permissions);
+ (Vector<Permission>)gfields.get("permissions", null);
+ perms = new ConcurrentHashMap<>(permissions.size());
+ for (Permission perm : permissions) {
+ perms.put(perm, Boolean.TRUE);
+ }
}
}
--- a/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java Thu Jun 25 07:13:27 2015 +0000
@@ -25,13 +25,14 @@
package javax.security.auth.kerberos;
-import java.util.*;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamField;
import java.security.Permission;
import java.security.PermissionCollection;
-import java.io.ObjectStreamField;
-import java.io.ObjectOutputStream;
-import java.io.ObjectInputStream;
-import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
/**
* This class is used to protect Kerberos services and the
@@ -149,6 +150,15 @@
init(servicePrincipal, getMask(action));
}
+ /**
+ * Creates a ServicePermission object with the specified servicePrincipal
+ * and a pre-calculated mask. Avoids the overhead of re-computing the mask.
+ * Called by ServicePermissionCollection.
+ */
+ ServicePermission(String servicePrincipal, int mask) {
+ super(servicePrincipal);
+ init(servicePrincipal, mask);
+ }
/**
* Initialize the ServicePermission object.
@@ -175,6 +185,7 @@
* @return true if the specified permission is implied by this object,
* false if not.
*/
+ @Override
public boolean implies(Permission p) {
if (!(p instanceof ServicePermission))
return false;
@@ -200,6 +211,7 @@
* same service principal, and actions as this
* ServicePermission object.
*/
+ @Override
public boolean equals(Object obj) {
if (obj == this)
return true;
@@ -219,7 +231,7 @@
*
* @return a hash code value for this object.
*/
-
+ @Override
public int hashCode() {
return (getName().hashCode() ^ mask);
}
@@ -234,7 +246,7 @@
* @param mask a specific integer action mask to translate into a string
* @return the canonical string representation of the actions
*/
- private static String getActions(int mask)
+ static String getActions(int mask)
{
StringBuilder sb = new StringBuilder();
boolean comma = false;
@@ -259,6 +271,7 @@
* Always returns present actions in the following order:
* initiate, accept.
*/
+ @Override
public String getActions() {
if (actions == null)
actions = getActions(this.mask);
@@ -279,6 +292,7 @@
* @return a new PermissionCollection object suitable for storing
* ServicePermissions.
*/
+ @Override
public PermissionCollection newPermissionCollection() {
return new KrbServicePermissionCollection();
}
@@ -453,11 +467,12 @@
final class KrbServicePermissionCollection extends PermissionCollection
implements java.io.Serializable {
+ // Key is the service principal, value is the ServicePermission.
// Not serialized; see serialization section at end of class
- private transient List<Permission> perms;
+ private transient ConcurrentHashMap<String, Permission> perms;
public KrbServicePermissionCollection() {
- perms = new ArrayList<Permission>();
+ perms = new ConcurrentHashMap<>();
}
/**
@@ -469,32 +484,28 @@
* @return true if "permission" is a proper subset of a permission in
* the collection, false if not.
*/
+ @Override
public boolean implies(Permission permission) {
if (! (permission instanceof ServicePermission))
- return false;
+ return false;
ServicePermission np = (ServicePermission) permission;
int desired = np.getMask();
- int effective = 0;
- int needed = desired;
-
- synchronized (this) {
- int len = perms.size();
-
- // need to deal with the case where the needed permission has
- // more than one action and the collection has individual permissions
- // that sum up to the needed.
- for (int i = 0; i < len; i++) {
- ServicePermission x = (ServicePermission) perms.get(i);
+ // first, check for wildcard principal
+ ServicePermission x = (ServicePermission)perms.get("*");
+ if (x != null) {
+ if ((x.getMask() & desired) == desired) {
+ return true;
+ }
+ }
- //System.out.println(" trying "+x);
- if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) {
- effective |= x.getMask();
- if ((effective & desired) == desired)
- return true;
- needed = (desired ^ effective);
- }
+ // otherwise, check for match on principal
+ x = (ServicePermission)perms.get(np.getName());
+ if (x != null) {
+ //System.out.println(" trying "+x);
+ if ((x.getMask() & desired) == desired) {
+ return true;
}
}
return false;
@@ -512,6 +523,7 @@
* @exception SecurityException - if this PermissionCollection object
* has been marked readonly
*/
+ @Override
public void add(Permission permission) {
if (! (permission instanceof ServicePermission))
throw new IllegalArgumentException("invalid permission: "+
@@ -519,9 +531,32 @@
if (isReadOnly())
throw new SecurityException("attempt to add a Permission to a readonly PermissionCollection");
- synchronized (this) {
- perms.add(0, permission);
- }
+ ServicePermission sp = (ServicePermission)permission;
+ String princName = sp.getName();
+
+ // Add permission to map if it is absent, or replace with new
+ // permission if applicable. NOTE: cannot use lambda for
+ // remappingFunction parameter until JDK-8076596 is fixed.
+ perms.merge(princName, sp,
+ new java.util.function.BiFunction<>() {
+ @Override
+ public Permission apply(Permission existingVal,
+ Permission newVal) {
+ int oldMask = ((ServicePermission)existingVal).getMask();
+ int newMask = ((ServicePermission)newVal).getMask();
+ if (oldMask != newMask) {
+ int effective = oldMask | newMask;
+ if (effective == newMask) {
+ return newVal;
+ }
+ if (effective != oldMask) {
+ return new ServicePermission(princName, effective);
+ }
+ }
+ return existingVal;
+ }
+ }
+ );
}
/**
@@ -530,12 +565,9 @@
*
* @return an enumeration of all the ServicePermission objects.
*/
-
+ @Override
public Enumeration<Permission> elements() {
- // Convert Iterator into Enumeration
- synchronized (this) {
- return Collections.enumeration(perms);
- }
+ return perms.elements();
}
private static final long serialVersionUID = -4118834211490102011L;
@@ -563,11 +595,7 @@
// Don't call out.defaultWriteObject()
// Write out Vector
- Vector<Permission> permissions = new Vector<>(perms.size());
-
- synchronized (this) {
- permissions.addAll(perms);
- }
+ Vector<Permission> permissions = new Vector<>(perms.values());
ObjectOutputStream.PutField pfields = out.putFields();
pfields.put("permissions", permissions);
@@ -589,7 +617,9 @@
// Get the one we want
Vector<Permission> permissions =
(Vector<Permission>)gfields.get("permissions", null);
- perms = new ArrayList<Permission>(permissions.size());
- perms.addAll(permissions);
+ perms = new ConcurrentHashMap<>(permissions.size());
+ for (Permission perm : permissions) {
+ perms.put(perm.getName(), perm);
+ }
}
}
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -35,7 +35,7 @@
import javax.sql.rowset.*;
/**
- * The standard implementation of the <code>JdbcRowSet</code> interface. See the interface
+ * The standard implementation of the {@code JdbcRowSet} interface. See the interface
* definition for full behavior and implementation requirements.
*
* @author Jonathan Bruce, Amit Handa
@@ -44,40 +44,40 @@
public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
/**
- * The <code>Connection</code> object that is this rowset's
+ * The {@code Connection} object that is this rowset's
* current connection to the database. This field is set
* internally when the connection is established.
*/
private Connection conn;
/**
- * The <code>PreparedStatement</code> object that is this rowset's
+ * The {@code PreparedStatement} object that is this rowset's
* current command. This field is set internally when the method
- * <code>execute</code> creates the <code>PreparedStatement</code>
+ * {@code execute} creates the {@code PreparedStatement}
* object.
*/
private PreparedStatement ps;
/**
- * The <code>ResultSet</code> object that is this rowset's
+ * The {@code ResultSet} object that is this rowset's
* current result set. This field is set internally when the method
- * <code>execute</code> executes the rowset's command and thereby
- * creates the rowset's <code>ResultSet</code> object.
+ * {@code execute} executes the rowset's command and thereby
+ * creates the rowset's {@code ResultSet} object.
*/
private ResultSet rs;
/**
- * The <code>RowSetMetaDataImpl</code> object that is constructed when
- * a <code>ResultSet</code> object is passed to the <code>JdbcRowSet</code>
+ * The {@code RowSetMetaDataImpl} object that is constructed when
+ * a {@code ResultSet} object is passed to the {@code JdbcRowSet}
* constructor. This helps in constructing all metadata associated
- * with the <code>ResultSet</code> object using the setter methods of
- * <code>RowSetMetaDataImpl</code>.
+ * with the {@code ResultSet} object using the setter methods of
+ * {@code RowSetMetaDataImpl}.
*/
private RowSetMetaDataImpl rowsMD;
/**
- * The <code>ResultSetMetaData</code> object from which this
- * <code>RowSetMetaDataImpl</code> is formed and which helps in getting
+ * The {@code ResultSetMetaData} object from which this
+ * {@code RowSetMetaDataImpl} is formed and which helps in getting
* the metadata information.
*/
private ResultSetMetaData resMD;
@@ -97,13 +97,13 @@
protected transient JdbcRowSetResourceBundle resBundle;
/**
- * Constructs a default <code>JdbcRowSet</code> object.
- * The new instance of <code>JdbcRowSet</code> will serve as a proxy
- * for the <code>ResultSet</code> object it creates, and by so doing,
+ * Constructs a default {@code JdbcRowSet} object.
+ * The new instance of {@code JdbcRowSet} will serve as a proxy
+ * for the {@code ResultSet} object it creates, and by so doing,
* it will make it possible to use the result set as a JavaBeans
* component.
* <P>
- * The following is true of a default <code>JdbcRowSet</code> instance:
+ * The following is true of a default {@code JdbcRowSet} instance:
* <UL>
* <LI>Does not show deleted rows
* <LI>Has no time limit for how long a driver may take to
@@ -114,17 +114,17 @@
* made by others
* <LI>Will not see uncommitted data (make "dirty" reads)
* <LI>Has escape processing turned on
- * <LI>Has its connection's type map set to <code>null</code>
- * <LI>Has an empty <code>Hashtable</code> object for storing any
+ * <LI>Has its connection's type map set to {@code null}
+ * <LI>Has an empty {@code Hashtable} object for storing any
* parameters that are set
* </UL>
- * A newly created <code>JdbcRowSet</code> object must have its
- * <code>execute</code> method invoked before other public methods
+ * A newly created {@code JdbcRowSet} object must have its
+ * {@code execute} method invoked before other public methods
* are called on it; otherwise, such method calls will cause an
* exception to be thrown.
*
* @throws SQLException [1] if any of its public methods are called prior
- * to calling the <code>execute</code> method; [2] if invalid JDBC driver
+ * to calling the {@code execute} method; [2] if invalid JDBC driver
* properties are set or [3] if no connection to a data source exists.
*/
public JdbcRowSetImpl() {
@@ -217,14 +217,14 @@
}
/**
- * Constructs a default <code>JdbcRowSet</code> object given a
- * valid <code>Connection</code> object. The new
- * instance of <code>JdbcRowSet</code> will serve as a proxy for
- * the <code>ResultSet</code> object it creates, and by so doing,
+ * Constructs a default {@code JdbcRowSet} object given a
+ * valid {@code Connection} object. The new
+ * instance of {@code JdbcRowSet} will serve as a proxy for
+ * the {@code ResultSet} object it creates, and by so doing,
* it will make it possible to use the result set as a JavaBeans
* component.
* <P>
- * The following is true of a default <code>JdbcRowSet</code> instance:
+ * The following is true of a default {@code JdbcRowSet} instance:
* <UL>
* <LI>Does not show deleted rows
* <LI>Has no time limit for how long a driver may take to
@@ -235,17 +235,17 @@
* made by others
* <LI>Will not see uncommitted data (make "dirty" reads)
* <LI>Has escape processing turned on
- * <LI>Has its connection's type map set to <code>null</code>
- * <LI>Has an empty <code>Hashtable</code> object for storing any
+ * <LI>Has its connection's type map set to {@code null}
+ * <LI>Has an empty {@code Hashtable} object for storing any
* parameters that are set
* </UL>
- * A newly created <code>JdbcRowSet</code> object must have its
- * <code>execute</code> method invoked before other public methods
+ * A newly created {@code JdbcRowSet} object must have its
+ * {@code execute} method invoked before other public methods
* are called on it; otherwise, such method calls will cause an
* exception to be thrown.
*
* @throws SQLException [1] if any of its public methods are called prior
- * to calling the <code>execute</code> method, [2] if invalid JDBC driver
+ * to calling the {@code execute} method, [2] if invalid JDBC driver
* properties are set, or [3] if no connection to a data source exists.
*/
public JdbcRowSetImpl(Connection con) throws SQLException {
@@ -289,15 +289,15 @@
}
/**
- * Constructs a default <code>JdbcRowSet</code> object using the
+ * Constructs a default {@code JdbcRowSet} object using the
* URL, username, and password arguments supplied. The new
- * instance of <code>JdbcRowSet</code> will serve as a proxy for
- * the <code>ResultSet</code> object it creates, and by so doing,
+ * instance of {@code JdbcRowSet} will serve as a proxy for
+ * the {@code ResultSet} object it creates, and by so doing,
* it will make it possible to use the result set as a JavaBeans
* component.
*
* <P>
- * The following is true of a default <code>JdbcRowSet</code> instance:
+ * The following is true of a default {@code JdbcRowSet} instance:
* <UL>
* <LI>Does not show deleted rows
* <LI>Has no time limit for how long a driver may take to
@@ -308,17 +308,17 @@
* made by others
* <LI>Will not see uncommitted data (make "dirty" reads)
* <LI>Has escape processing turned on
- * <LI>Has its connection's type map set to <code>null</code>
- * <LI>Has an empty <code>Hashtable</code> object for storing any
+ * <LI>Has its connection's type map set to {@code null}
+ * <LI>Has an empty {@code Hashtable} object for storing any
* parameters that are set
* </UL>
*
- * @param url - a JDBC URL for the database to which this <code>JdbcRowSet</code>
+ * @param url a JDBC URL for the database to which this {@code JdbcRowSet}
* object will be connected. The form for a JDBC URL is
- * <code>jdbc:subprotocol:subname</code>.
- * @param user - the database user on whose behalf the connection
+ * {@code jdbc:subprotocol:subname}.
+ * @param user the database user on whose behalf the connection
* is being made
- * @param password - the user's password
+ * @param password the user's password
*
* @throws SQLException if a database access error occurs
*
@@ -372,15 +372,15 @@
/**
- * Constructs a <code>JdbcRowSet</code> object using the given valid
- * <code>ResultSet</code> object. The new
- * instance of <code>JdbcRowSet</code> will serve as a proxy for
- * the <code>ResultSet</code> object, and by so doing,
+ * Constructs a {@code JdbcRowSet} object using the given valid
+ * {@code ResultSet} object. The new
+ * instance of {@code JdbcRowSet} will serve as a proxy for
+ * the {@code ResultSet} object, and by so doing,
* it will make it possible to use the result set as a JavaBeans
* component.
*
* <P>
- * The following is true of a default <code>JdbcRowSet</code> instance:
+ * The following is true of a default {@code JdbcRowSet} instance:
* <UL>
* <LI>Does not show deleted rows
* <LI>Has no time limit for how long a driver may take to
@@ -391,12 +391,12 @@
* made by others
* <LI>Will not see uncommitted data (make "dirty" reads)
* <LI>Has escape processing turned on
- * <LI>Has its connection's type map set to <code>null</code>
- * <LI>Has an empty <code>Hashtable</code> object for storing any
+ * <LI>Has its connection's type map set to {@code null}
+ * <LI>Has an empty {@code Hashtable} object for storing any
* parameters that are set
* </UL>
*
- * @param res a valid <code>ResultSet</code> object
+ * @param res a valid {@code ResultSet} object
*
* @throws SQLException if a database access occurs due to a non
* valid ResultSet handle.
@@ -460,13 +460,13 @@
}
/**
- * Initializes the given <code>RowSetMetaData</code> object with the values
- * in the given <code>ResultSetMetaData</code> object.
- *
- * @param md the <code>RowSetMetaData</code> object for this
- * <code>JdbcRowSetImpl</code> object, which will be set with
+ * Initializes the given {@code RowSetMetaData} object with the values
+ * in the given {@code ResultSetMetaData} object.
+ *
+ * @param md the {@code RowSetMetaData} object for this
+ * {@code JdbcRowSetImpl} object, which will be set with
* values from rsmd
- * @param rsmd the <code>ResultSetMetaData</code> object from which new
+ * @param rsmd the {@code ResultSetMetaData} object from which new
* values for md will be read
* @throws SQLException if an error occurs
*/
@@ -511,24 +511,24 @@
//---------------------------------------------------------------------
/**
- * Creates the internal <code>ResultSet</code> object for which this
- * <code>JdbcRowSet</code> object is a wrapper, effectively
+ * Creates the internal {@code ResultSet} object for which this
+ * {@code JdbcRowSet} object is a wrapper, effectively
* making the result set a JavaBeans component.
* <P>
* Certain properties must have been set before this method is called
* so that it can establish a connection to a database and execute the
- * query that will create the result set. If a <code>DataSource</code>
+ * query that will create the result set. If a {@code DataSource}
* object will be used to create the connection, properties for the
* data source name, user name, and password must be set. If the
- * <code>DriverManager</code> will be used, the properties for the
+ * {@code DriverManager} will be used, the properties for the
* URL, user name, and password must be set. In either case, the
* property for the command must be set. If the command has placeholder
* parameters, those must also be set. This method throws
* an exception if the required properties are not set.
* <P>
* Other properties have default values that may optionally be set
- * to new values. The <code>execute</code> method will use the value
- * for the command property to create a <code>PreparedStatement</code>
+ * to new values. The {@code execute} method will use the value
+ * for the command property to create a {@code PreparedStatement}
* object and set its properties (escape processing, maximum field
* size, maximum number of rows, and query timeout limit) to be those
* of this rowset.
@@ -784,20 +784,20 @@
}
/**
- * Moves the cursor for this rowset's <code>ResultSet</code>
+ * Moves the cursor for this rowset's {@code ResultSet}
* object down one row from its current position.
- * A <code>ResultSet</code> cursor is initially positioned
+ * A {@code ResultSet} cursor is initially positioned
* before the first row; the first call to the method
- * <code>next</code> makes the first row the current row; the
+ * {@code next} makes the first row the current row; the
* second call makes the second row the current row, and so on.
*
* <P>If an input stream is open for the current row, a call
- * to the method <code>next</code> will
- * implicitly close it. A <code>ResultSet</code> object's
+ * to the method {@code next} will
+ * implicitly close it. A {@code ResultSet} object's
* warning chain is cleared when a new row is read.
*
- * @return <code>true</code> if the new current row is valid;
- * <code>false</code> if there are no more rows
+ * @return {@code true} if the new current row is valid;
+ * {@code false} if there are no more rows
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -811,16 +811,16 @@
}
/**
- * Releases this rowset's <code>ResultSet</code> object's database and
+ * Releases this rowset's {@code ResultSet} object's database and
* JDBC resources immediately instead of waiting for
* this to happen when it is automatically closed.
*
- * <P><B>Note:</B> A <code>ResultSet</code> object
+ * <P><B>Note:</B> A {@code ResultSet} object
* is automatically closed by the
- * <code>Statement</code> object that generated it when
- * that <code>Statement</code> object is closed,
+ * {@code Statement} object that generated it when
+ * that {@code Statement} object is closed,
* re-executed, or is used to retrieve the next result from a
- * sequence of multiple results. A <code>ResultSet</code> object
+ * sequence of multiple results. A {@code ResultSet} object
* is also automatically closed when it is garbage collected.
*
* @throws SQLException if a database access error occurs
@@ -836,14 +836,14 @@
/**
* Reports whether the last column read from this rowset's
- * <code>ResultSet</code> object had a value of SQL <code>NULL</code>.
- * Note that you must first call one of the <code>getXXX</code> methods
+ * {@code ResultSet} object had a value of SQL {@code NULL}.
+ * Note that you must first call one of the {@code getXXX} methods
* on a column to try to read its value and then call
- * the method <code>wasNull</code> to see if the value read was
- * SQL <code>NULL</code>.
- *
- * @return <code>true</code> if the last column value read was SQL
- * <code>NULL</code> and <code>false</code> otherwise
+ * the method {@code wasNull} to see if the value read was
+ * SQL {@code NULL}.
+ *
+ * @return {@code true} if the last column value read was SQL
+ * {@code NULL} and {@code false} otherwise
* @throws SQLException if a database access error occurs
* or this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -860,12 +860,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>String</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code String}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -878,12 +878,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>boolean</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code boolean}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>false</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code false}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -896,12 +896,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>byte</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code byte}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -914,12 +914,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>short</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code short}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -932,12 +932,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * an <code>int</code>.
+ * of this rowset's {@code ResultSet} object as
+ * an {@code int}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -950,12 +950,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>long</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code long}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -968,12 +968,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>float</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code float}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -986,12 +986,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>double</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code double}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1004,13 +1004,13 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.sql.BigDecimal</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.sql.BigDecimal}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param scale the number of digits to the right of the decimal point
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1025,13 +1025,13 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>byte</code> array in the Java programming language.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code byte} array in the Java programming language.
* The bytes represent the raw values returned by the driver.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1044,12 +1044,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.sql.Date</code> object in the Java programming language.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.sql.Date} object in the Java programming language.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1062,12 +1062,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.sql.Time</code> object in the Java programming language.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.sql.Time} object in the Java programming language.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1080,12 +1080,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.sql.Timestamp</code> object in the Java programming language.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.sql.Timestamp} object in the Java programming language.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1098,25 +1098,25 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
+ * of this rowset's {@code ResultSet} object as
* a stream of ASCII characters. The value can then be read in chunks from the
* stream. This method is particularly
- * suitable for retrieving large <code>LONGVARCHAR</code> values.
+ * suitable for retrieving large {@code LONGVARCHAR} values.
* The JDBC driver will
* do any necessary conversion from the database format into ASCII.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
- * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
- * stream may return <code>0</code> when the method
- * <code>InputStream.available</code>
+ * call to a {@code getXXX} method implicitly closes the stream. Also, a
+ * stream may return {@code 0} when the method
+ * {@code InputStream.available}
* is called whether there is data available or not.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @return a Java input stream that delivers the database column value
- * as a stream of one-byte ASCII characters;
- * if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * as a stream of one-byte ASCII characters;
+ * if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) database access error occurs
* (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1129,31 +1129,31 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
+ * of this rowset's {@code ResultSet} object as
* as a stream of Unicode characters.
* The value can then be read in chunks from the
* stream. This method is particularly
- * suitable for retrieving large<code>LONGVARCHAR</code>values. The JDBC driver will
+ * suitable for retrieving large{@code LONGVARCHAR}values. The JDBC driver will
* do any necessary conversion from the database format into Unicode.
* The byte format of the Unicode stream must be Java UTF-8,
* as specified in the Java virtual machine specification.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
- * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
- * stream may return <code>0</code> when the method
- * <code>InputStream.available</code>
+ * call to a {@code getXXX} method implicitly closes the stream. Also, a
+ * stream may return {@code 0} when the method
+ * {@code InputStream.available}
* is called whether there is data available or not.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @return a Java input stream that delivers the database column value
- * as a stream in Java UTF-8 byte format;
- * if the value is SQL <code>NULL</code>, the value returned is <code>null</code>
+ * as a stream in Java UTF-8 byte format;
+ * if the value is SQL {@code NULL}, the value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
- * @deprecated use <code>getCharacterStream</code> in place of
- * <code>getUnicodeStream</code>
+ * @deprecated use {@code getCharacterStream} in place of
+ * {@code getUnicodeStream}
*/
@Deprecated
public java.io.InputStream getUnicodeStream(int columnIndex) throws SQLException {
@@ -1165,22 +1165,22 @@
/**
* Gets the value of a column in the current row as a stream of
* the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a binary stream of
+ * of this rowset's {@code ResultSet} object as a binary stream of
* uninterpreted bytes. The value can then be read in chunks from the
* stream. This method is particularly
- * suitable for retrieving large <code>LONGVARBINARY</code> values.
+ * suitable for retrieving large {@code LONGVARBINARY} values.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
- * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
- * stream may return <code>0</code> when the method
- * <code>InputStream.available</code>
+ * call to a {@code getXXX} method implicitly closes the stream. Also, a
+ * stream may return {@code 0} when the method
+ * {@code InputStream.available}
* is called whether there is data available or not.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @return a Java input stream that delivers the database column value
- * as a stream of uninterpreted bytes;
- * if the value is SQL <code>NULL</code>, the value returned is <code>null</code>
+ * as a stream of uninterpreted bytes;
+ * if the value is SQL {@code NULL}, the value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1198,12 +1198,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>String</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code String}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1214,12 +1214,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>boolean</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code boolean}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>false</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code false}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1230,12 +1230,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>byte</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code byte}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1246,12 +1246,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>short</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code short}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1262,12 +1262,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * an <code>int</code>.
+ * of this rowset's {@code ResultSet} object as
+ * an {@code int}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1278,12 +1278,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>long</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code long}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if a database access error occurs
* or this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1294,12 +1294,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>float</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code float}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1310,12 +1310,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>double</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code double}.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code 0}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1326,13 +1326,13 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.math.BigDecimal</code>.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.math.BigDecimal}.
*
* @param columnName the SQL name of the column
* @param scale the number of digits to the right of the decimal point
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) adatabase access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1345,13 +1345,13 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>byte</code> array in the Java programming language.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code byte} array in the Java programming language.
* The bytes represent the raw values returned by the driver.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1362,12 +1362,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.sql.Date</code> object in the Java programming language.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.sql.Date} object in the Java programming language.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1378,13 +1378,13 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.sql.Time</code> object in the Java programming language.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.sql.Time} object in the Java programming language.
*
* @param columnName the SQL name of the column
* @return the column value;
- * if the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code>
+ * if the value is SQL {@code NULL},
+ * the value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1395,12 +1395,12 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * a <code>java.sql.Timestamp</code> object.
+ * of this rowset's {@code ResultSet} object as
+ * a {@code java.sql.Timestamp} object.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1411,24 +1411,24 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a stream of
+ * of this rowset's {@code ResultSet} object as a stream of
* ASCII characters. The value can then be read in chunks from the
* stream. This method is particularly
- * suitable for retrieving large <code>LONGVARCHAR</code> values.
+ * suitable for retrieving large {@code LONGVARCHAR} values.
* The JDBC driver will
* do any necessary conversion from the database format into ASCII.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
- * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
- * stream may return <code>0</code> when the method <code>available</code>
+ * call to a {@code getXXX} method implicitly closes the stream. Also, a
+ * stream may return {@code 0} when the method {@code available}
* is called whether there is data available or not.
*
* @param columnName the SQL name of the column
* @return a Java input stream that delivers the database column value
- * as a stream of one-byte ASCII characters.
- * If the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code>.
+ * as a stream of one-byte ASCII characters.
+ * If the value is SQL {@code NULL},
+ * the value returned is {@code null}.
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1439,10 +1439,10 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a stream of
+ * of this rowset's {@code ResultSet} object as a stream of
* Unicode characters. The value can then be read in chunks from the
* stream. This method is particularly
- * suitable for retrieving large <code>LONGVARCHAR</code> values.
+ * suitable for retrieving large {@code LONGVARCHAR} values.
* The JDBC driver will
* do any necessary conversion from the database format into Unicode.
* The byte format of the Unicode stream must be Java UTF-8,
@@ -1450,15 +1450,15 @@
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
- * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
- * stream may return <code>0</code> when the method <code>available</code>
+ * call to a {@code getXXX} method implicitly closes the stream. Also, a
+ * stream may return {@code 0} when the method {@code available}
* is called whether there is data available or not.
*
* @param columnName the SQL name of the column
* @return a Java input stream that delivers the database column value
- * as a stream of two-byte Unicode characters.
- * If the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code>.
+ * as a stream of two-byte Unicode characters.
+ * If the value is SQL {@code NULL},
+ * the value returned is {@code null}.
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1471,23 +1471,23 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a stream of uninterpreted
- * <code>byte</code>s.
+ * of this rowset's {@code ResultSet} object as a stream of uninterpreted
+ * {@code byte}s.
* The value can then be read in chunks from the
* stream. This method is particularly
- * suitable for retrieving large <code>LONGVARBINARY</code>
+ * suitable for retrieving large {@code LONGVARBINARY}
* values.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
- * call to a <code>getXXX</code> method implicitly closes the stream. Also, a
- * stream may return <code>0</code> when the method <code>available</code>
+ * call to a {@code getXXX} method implicitly closes the stream. Also, a
+ * stream may return {@code 0} when the method {@code available}
* is called whether there is data available or not.
*
* @param columnName the SQL name of the column
* @return a Java input stream that delivers the database column value
- * as a stream of uninterpreted bytes;
- * if the value is SQL <code>NULL</code>, the result is <code>null</code>
+ * as a stream of uninterpreted bytes;
+ * if the value is SQL {@code NULL}, the result is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1503,21 +1503,21 @@
/**
* Returns the first warning reported by calls on this rowset's
- * <code>ResultSet</code> object.
- * Subsequent warnings on this rowset's <code>ResultSet</code> object
- * will be chained to the <code>SQLWarning</code> object that
+ * {@code ResultSet} object.
+ * Subsequent warnings on this rowset's {@code ResultSet} object
+ * will be chained to the {@code SQLWarning} object that
* this method returns.
*
* <P>The warning chain is automatically cleared each time a new
* row is read.
*
* <P><B>Note:</B> This warning chain only covers warnings caused
- * by <code>ResultSet</code> methods. Any warning caused by
- * <code>Statement</code> methods
+ * by {@code ResultSet} methods. Any warning caused by
+ * {@code Statement} methods
* (such as reading OUT parameters) will be chained on the
- * <code>Statement</code> object.
- *
- * @return the first <code>SQLWarning</code> object reported or <code>null</code>
+ * {@code Statement} object.
+ *
+ * @return the first {@code SQLWarning} object reported or {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1529,10 +1529,10 @@
}
/**
- * Clears all warnings reported on this rowset's <code>ResultSet</code> object.
- * After this method is called, the method <code>getWarnings</code>
- * returns <code>null</code> until a new warning is
- * reported for this rowset's <code>ResultSet</code> object.
+ * Clears all warnings reported on this rowset's {@code ResultSet} object.
+ * After this method is called, the method {@code getWarnings}
+ * returns {@code null} until a new warning is
+ * reported for this rowset's {@code ResultSet} object.
*
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
@@ -1545,26 +1545,26 @@
}
/**
- * Gets the name of the SQL cursor used by this rowset's <code>ResultSet</code>
+ * Gets the name of the SQL cursor used by this rowset's {@code ResultSet}
* object.
*
* <P>In SQL, a result table is retrieved through a cursor that is
* named. The current row of a result set can be updated or deleted
* using a positioned update/delete statement that references the
* cursor name. To insure that the cursor has the proper isolation
- * level to support update, the cursor's <code>select</code> statement should be
+ * level to support update, the cursor's {@code select} statement should be
* of the form 'select for update'. If the 'for update' clause is
* omitted, the positioned updates may fail.
*
* <P>The JDBC API supports this SQL feature by providing the name of the
- * SQL cursor used by a <code>ResultSet</code> object.
- * The current row of a <code>ResultSet</code> object
+ * SQL cursor used by a {@code ResultSet} object.
+ * The current row of a {@code ResultSet} object
* is also the current row of this SQL cursor.
*
* <P><B>Note:</B> If positioned update is not supported, a
- * <code>SQLException</code> is thrown.
- *
- * @return the SQL name for this rowset's <code>ResultSet</code> object's cursor
+ * {@code SQLException} is thrown.
+ *
+ * @return the SQL name for this rowset's {@code ResultSet} object's cursor
* @throws SQLException if (1) a database access error occurs
* or (2) xthis rowset does not have a currently valid connection,
* prepared statement, and result set
@@ -1577,9 +1577,9 @@
/**
* Retrieves the number, types and properties of
- * this rowset's <code>ResultSet</code> object's columns.
- *
- * @return the description of this rowset's <code>ResultSet</code>
+ * this rowset's {@code ResultSet} object's columns.
+ *
+ * @return the description of this rowset's {@code ResultSet}
* object's columns
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not have a currently valid connection,
@@ -1607,8 +1607,8 @@
/**
* <p>Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * an <code>Object</code>.
+ * of this rowset's {@code ResultSet} object as
+ * an {@code Object}.
*
* <p>This method will return the value of the given column as a
* Java object. The type of the Java object will be the default
@@ -1620,14 +1620,14 @@
* abstract data types.
*
* In the JDBC 3.0 API, the behavior of method
- * <code>getObject</code> is extended to materialize
+ * {@code getObject} is extended to materialize
* data of SQL user-defined types. When a column contains
* a structured or distinct value, the behavior of this method is as
- * if it were a call to: <code>getObject(columnIndex,
- * this.getStatement().getConnection().getTypeMap())</code>.
+ * if it were a call to: {@code getObject(columnIndex,
+ * this.getStatement().getConnection().getTypeMap())}.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @return a <code>java.lang.Object</code> holding the column value
+ * @return a {@code java.lang.Object} holding the column value
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -1640,8 +1640,8 @@
/**
* <p>Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as
- * an <code>Object</code>.
+ * of this rowset's {@code ResultSet} object as
+ * an {@code Object}.
*
* <p>This method will return the value of the given column as a
* Java object. The type of the Java object will be the default
@@ -1653,14 +1653,14 @@
* abstract data types.
*
* In the JDBC 3.0 API, the behavior of the method
- * <code>getObject</code> is extended to materialize
+ * {@code getObject} is extended to materialize
* data of SQL user-defined types. When a column contains
* a structured or distinct value, the behavior of this method is as
- * if it were a call to: <code>getObject(columnIndex,
- * this.getStatement().getConnection().getTypeMap())</code>.
+ * if it were a call to: {@code getObject(columnIndex,
+ * this.getStatement().getConnection().getTypeMap())}.
*
* @param columnName the SQL name of the column
- * @return a <code>java.lang.Object</code> holding the column value
+ * @return a {@code java.lang.Object} holding the column value
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -1672,9 +1672,9 @@
//----------------------------------------------------------------
/**
- * Maps the given <code>JdbcRowSetImpl</code> column name to its
- * <code>JdbcRowSetImpl</code> column index and reflects this on
- * the internal <code>ResultSet</code> object.
+ * Maps the given {@code JdbcRowSetImpl} column name to its
+ * {@code JdbcRowSetImpl} column index and reflects this on
+ * the internal {@code ResultSet} object.
*
* @param columnName the name of the column
* @return the column index of the given column name
@@ -1697,11 +1697,11 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a
- * <code>java.io.Reader</code> object.
- * @return a <code>java.io.Reader</code> object that contains the column
- * value; if the value is SQL <code>NULL</code>, the value returned is
- * <code>null</code>.
+ * of this rowset's {@code ResultSet} object as a
+ * {@code java.io.Reader} object.
+ * @return a {@code java.io.Reader} object that contains the column
+ * value; if the value is SQL {@code NULL}, the value returned is
+ * {@code null}.
* @param columnIndex the first column is 1, the second is 2, and so on
*
*/
@@ -1713,14 +1713,14 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a
- * <code>java.io.Reader</code> object.
- *
- * @return a <code>java.io.Reader</code> object that contains the column
- * value; if the value is SQL <code>NULL</code>, the value returned is
- * <code>null</code>.
+ * of this rowset's {@code ResultSet} object as a
+ * {@code java.io.Reader} object.
+ *
+ * @return a {@code java.io.Reader} object that contains the column
+ * value; if the value is SQL {@code NULL}, the value returned is
+ * {@code null}.
* @param columnName the name of the column
- * @return the value in the specified column as a <code>java.io.Reader</code>
+ * @return the value in the specified column as a {@code java.io.Reader}
*
*/
public java.io.Reader getCharacterStream(String columnName) throws SQLException {
@@ -1729,13 +1729,13 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a
- * <code>java.math.BigDecimal</code> with full precision.
+ * of this rowset's {@code ResultSet} object as a
+ * {@code java.math.BigDecimal} with full precision.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @return the column value (full precision);
- * if the value is SQL <code>NULL</code>, the value returned is
- * <code>null</code>.
+ * if the value is SQL {@code NULL}, the value returned is
+ * {@code null}.
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid
* connection, prepared statement, and result set
@@ -1748,13 +1748,13 @@
/**
* Gets the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a
- * <code>java.math.BigDecimal</code> with full precision.
+ * of this rowset's {@code ResultSet} object as a
+ * {@code java.math.BigDecimal} with full precision.
*
* @param columnName the column name
* @return the column value (full precision);
- * if the value is SQL <code>NULL</code>, the value returned is
- * <code>null</code>.
+ * if the value is SQL {@code NULL}, the value returned is
+ * {@code null}.
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid
* connection, prepared statement, and result set
@@ -1769,11 +1769,11 @@
/**
* Indicates whether the cursor is before the first row in
- * this rowset's <code>ResultSet</code> object.
- *
- * @return <code>true</code> if the cursor is before the first row;
- * <code>false</code> if the cursor is at any other position or the
- * result set contains no rows
+ * this rowset's {@code ResultSet} object.
+ *
+ * @return {@code true} if the cursor is before the first row;
+ * {@code false} if the cursor is at any other position or the
+ * result set contains no rows
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid
* connection, prepared statement, and result set
@@ -1786,11 +1786,11 @@
/**
* Indicates whether the cursor is after the last row in
- * this rowset's <code>ResultSet</code> object.
- *
- * @return <code>true</code> if the cursor is after the last row;
- * <code>false</code> if the cursor is at any other position or the
- * result set contains no rows
+ * this rowset's {@code ResultSet} object.
+ *
+ * @return {@code true} if the cursor is after the last row;
+ * {@code false} if the cursor is at any other position or the
+ * result set contains no rows
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid
* connection, prepared statement, and result set
@@ -1803,10 +1803,10 @@
/**
* Indicates whether the cursor is on the first row of
- * this rowset's <code>ResultSet</code> object.
- *
- * @return <code>true</code> if the cursor is on the first row;
- * <code>false</code> otherwise
+ * this rowset's {@code ResultSet} object.
+ *
+ * @return {@code true} if the cursor is on the first row;
+ * {@code false} otherwise
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid
* connection, prepared statement, and result set
@@ -1819,14 +1819,14 @@
/**
* Indicates whether the cursor is on the last row of
- * this rowset's <code>ResultSet</code> object.
- * Note: Calling the method <code>isLast</code> may be expensive
+ * this rowset's {@code ResultSet} object.
+ * Note: Calling the method {@code isLast} may be expensive
* because the JDBC driver
* might need to fetch ahead one row in order to determine
* whether the current row is the last row in the result set.
*
- * @return <code>true</code> if the cursor is on the last row;
- * <code>false</code> otherwise
+ * @return {@code true} if the cursor is on the last row;
+ * {@code false} otherwise
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid
* connection, prepared statement, and result set
@@ -1840,11 +1840,11 @@
/**
* Moves the cursor to the front of
- * this rowset's <code>ResultSet</code> object, just before the
+ * this rowset's {@code ResultSet} object, just before the
* first row. This method has no effect if the result set contains no rows.
*
* @throws SQLException if (1) a database access error occurs,
- * (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+ * (2) the result set type is {@code TYPE_FORWARD_ONLY},
* or (3) this rowset does not currently have a valid
* connection, prepared statement, and result set
*/
@@ -1857,10 +1857,10 @@
/**
* Moves the cursor to the end of
- * this rowset's <code>ResultSet</code> object, just after the
+ * this rowset's {@code ResultSet} object, just after the
* last row. This method has no effect if the result set contains no rows.
* @throws SQLException if (1) a database access error occurs,
- * (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+ * (2) the result set type is {@code TYPE_FORWARD_ONLY},
* or (3) this rowset does not currently have a valid
* connection, prepared statement, and result set
*/
@@ -1873,12 +1873,12 @@
/**
* Moves the cursor to the first row in
- * this rowset's <code>ResultSet</code> object.
- *
- * @return <code>true</code> if the cursor is on a valid row;
- * <code>false</code> if there are no rows in the result set
+ * this rowset's {@code ResultSet} object.
+ *
+ * @return {@code true} if the cursor is on a valid row;
+ * {@code false} if there are no rows in the result set
* @throws SQLException if (1) a database access error occurs,
- * (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+ * (2) the result set type is {@code TYPE_FORWARD_ONLY},
* or (3) this rowset does not currently have a valid
* connection, prepared statement, and result set
*/
@@ -1893,12 +1893,12 @@
/**
* Moves the cursor to the last row in
- * this rowset's <code>ResultSet</code> object.
- *
- * @return <code>true</code> if the cursor is on a valid row;
- * <code>false</code> if there are no rows in the result set
+ * this rowset's {@code ResultSet} object.
+ *
+ * @return {@code true} if the cursor is on a valid row;
+ * {@code false} if there are no rows in the result set
* @throws SQLException if (1) a database access error occurs,
- * (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+ * (2) the result set type is {@code TYPE_FORWARD_ONLY},
* or (3) this rowset does not currently have a valid
* connection, prepared statement, and result set
*/
@@ -1914,7 +1914,7 @@
* Retrieves the current row number. The first row is number 1, the
* second is number 2, and so on.
*
- * @return the current row number; <code>0</code> if there is no current row
+ * @return the current row number; {@code 0} if there is no current row
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -1927,7 +1927,7 @@
/**
* Moves the cursor to the given row number in
- * this rowset's internal <code>ResultSet</code> object.
+ * this rowset's internal {@code ResultSet} object.
*
* <p>If the row number is positive, the cursor moves to
* the given row number with respect to the
@@ -1937,23 +1937,23 @@
* <p>If the given row number is negative, the cursor moves to
* an absolute row position with respect to
* the end of the result set. For example, calling the method
- * <code>absolute(-1)</code> positions the
- * cursor on the last row, calling the method <code>absolute(-2)</code>
+ * {@code absolute(-1)} positions the
+ * cursor on the last row, calling the method {@code absolute(-2)}
* moves the cursor to the next-to-last row, and so on.
*
* <p>An attempt to position the cursor beyond the first/last row in
* the result set leaves the cursor before the first row or after
* the last row.
*
- * <p><B>Note:</B> Calling <code>absolute(1)</code> is the same
- * as calling <code>first()</code>. Calling <code>absolute(-1)</code>
- * is the same as calling <code>last()</code>.
- *
- * @return <code>true</code> if the cursor is on the result set;
- * <code>false</code> otherwise
+ * <p><B>Note:</B> Calling {@code absolute(1)} is the same
+ * as calling {@code first()}. Calling {@code absolute(-1)}
+ * is the same as calling {@code last()}.
+ *
+ * @return {@code true} if the cursor is on the result set;
+ * {@code false} otherwise
* @throws SQLException if (1) a database access error occurs,
- * (2) the row is <code>0</code>, (3) the result set
- * type is <code>TYPE_FORWARD_ONLY</code>, or (4) this
+ * (2) the row is {@code 0}, (3) the result set
+ * type is {@code TYPE_FORWARD_ONLY}, or (4) this
* rowset does not currently have a valid connection,
* prepared statement, and result set
*/
@@ -1969,21 +1969,21 @@
* Moves the cursor a relative number of rows, either positive or negative.
* Attempting to move beyond the first/last row in the
* result set positions the cursor before/after the
- * the first/last row. Calling <code>relative(0)</code> is valid, but does
+ * the first/last row. Calling {@code relative(0)} is valid, but does
* not change the cursor position.
*
- * <p>Note: Calling the method <code>relative(1)</code>
- * is different from calling the method <code>next()</code>
- * because is makes sense to call <code>next()</code> when there
+ * <p>Note: Calling the method {@code relative(1)}
+ * is different from calling the method {@code next()}
+ * because is makes sense to call {@code next()} when there
* is no current row,
* for example, when the cursor is positioned before the first row
* or after the last row of the result set.
*
- * @return <code>true</code> if the cursor is on a row;
- * <code>false</code> otherwise
+ * @return {@code true} if the cursor is on a row;
+ * {@code false} otherwise
* @throws SQLException if (1) a database access error occurs,
* (2) there is no current row, (3) the result set
- * type is <code>TYPE_FORWARD_ONLY</code>, or (4) this
+ * type is {@code TYPE_FORWARD_ONLY}, or (4) this
* rowset does not currently have a valid connection,
* prepared statement, and result set
*/
@@ -1997,16 +1997,16 @@
/**
* Moves the cursor to the previous row in this
- * <code>ResultSet</code> object.
- *
- * <p><B>Note:</B> Calling the method <code>previous()</code> is not the same as
- * calling the method <code>relative(-1)</code> because it
- * makes sense to call <code>previous()</code> when there is no current row.
- *
- * @return <code>true</code> if the cursor is on a valid row;
- * <code>false</code> if it is off the result set
+ * {@code ResultSet} object.
+ *
+ * <p><B>Note:</B> Calling the method {@code previous()} is not the same as
+ * calling the method {@code relative(-1)} because it
+ * makes sense to call {@code previous()} when there is no current row.
+ *
+ * @return {@code true} if the cursor is on a valid row;
+ * {@code false} if it is off the result set
* @throws SQLException if (1) a database access error occurs,
- * (2) the result set type is <code>TYPE_FORWARD_ONLY</code>,
+ * (2) the result set type is {@code TYPE_FORWARD_ONLY},
* or (3) this rowset does not currently have a valid
* connection, prepared statement, and result set
*/
@@ -2020,15 +2020,15 @@
/**
* Gives a hint as to the direction in which the rows in this
- * <code>ResultSet</code> object will be processed.
+ * {@code ResultSet} object will be processed.
* The initial value is determined by the
- * <code>Statement</code> object
- * that produced this rowset's <code>ResultSet</code> object.
+ * {@code Statement} object
+ * that produced this rowset's {@code ResultSet} object.
* The fetch direction may be changed at any time.
*
* @throws SQLException if (1) a database access error occurs,
- * (2) the result set type is <code>TYPE_FORWARD_ONLY</code>
- * and the fetch direction is not <code>FETCH_FORWARD</code>,
+ * (2) the result set type is {@code TYPE_FORWARD_ONLY}
+ * and the fetch direction is not {@code FETCH_FORWARD},
* or (3) this rowset does not currently have a valid
* connection, prepared statement, and result set
* @see java.sql.Statement#setFetchDirection
@@ -2041,10 +2041,10 @@
/**
* Returns the fetch direction for this
- * <code>ResultSet</code> object.
+ * {@code ResultSet} object.
*
* @return the current fetch direction for this rowset's
- * <code>ResultSet</code> object
+ * {@code ResultSet} object
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -2061,16 +2061,16 @@
/**
* Gives the JDBC driver a hint as to the number of rows that should
* be fetched from the database when more rows are needed for this
- * <code>ResultSet</code> object.
+ * {@code ResultSet} object.
* If the fetch size specified is zero, the JDBC driver
* ignores the value and is free to make its own best guess as to what
* the fetch size should be. The default value is set by the
- * <code>Statement</code> object
+ * {@code Statement} object
* that created the result set. The fetch size may be changed at any time.
*
* @param rows the number of rows to fetch
* @throws SQLException if (1) a database access error occurs, (2) the
- * condition <code>0 <= rows <= this.getMaxRows()</code> is not
+ * condition {@code 0 <= rows <= this.getMaxRows()} is not
* satisfied, or (3) this rowset does not currently have a valid
* connection, prepared statement, and result set
*
@@ -2084,9 +2084,9 @@
/**
*
* Returns the fetch size for this
- * <code>ResultSet</code> object.
- *
- * @return the current fetch size for this rowset's <code>ResultSet</code> object
+ * {@code ResultSet} object.
+ *
+ * @return the current fetch size for this rowset's {@code ResultSet} object
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -2111,12 +2111,12 @@
}
/**
- * Returns the concurrency mode of this rowset's <code>ResultSet</code> object.
+ * Returns the concurrency mode of this rowset's {@code ResultSet} object.
* The concurrency used is determined by the
- * <code>Statement</code> object that created the result set.
- *
- * @return the concurrency type, either <code>CONCUR_READ_ONLY</code>
- * or <code>CONCUR_UPDATABLE</code>
+ * {@code Statement} object that created the result set.
+ *
+ * @return the concurrency type, either {@code CONCUR_READ_ONLY}
+ * or {@code CONCUR_UPDATABLE}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -2138,7 +2138,7 @@
* Indicates whether the current row has been updated. The value returned
* depends on whether or not the result set can detect updates.
*
- * @return <code>true</code> if the row has been visibly updated
+ * @return {@code true} if the row has been visibly updated
* by the owner or another, and updates are detected
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
@@ -2154,10 +2154,10 @@
/**
* Indicates whether the current row has had an insertion.
* The value returned depends on whether or not this
- * <code>ResultSet</code> object can detect visible inserts.
- *
- * @return <code>true</code> if a row has had an insertion
- * and insertions are detected; <code>false</code> otherwise
+ * {@code ResultSet} object can detect visible inserts.
+ *
+ * @return {@code true} if a row has had an insertion
+ * and insertions are detected; {@code false} otherwise
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -2174,10 +2174,10 @@
* Indicates whether a row has been deleted. A deleted row may leave
* a visible "hole" in a result set. This method can be used to
* detect holes in a result set. The value returned depends on whether
- * or not this rowset's <code>ResultSet</code> object can detect deletions.
- *
- * @return <code>true</code> if a row was deleted and deletions are detected;
- * <code>false</code> otherwise
+ * or not this rowset's {@code ResultSet} object can detect deletions.
+ *
+ * @return {@code true} if a row was deleted and deletions are detected;
+ * {@code false} otherwise
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -2192,10 +2192,10 @@
/**
* Gives a nullable column a null value.
*
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code>
- * or <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow}
+ * or {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @throws SQLException if a database access error occurs
@@ -2213,11 +2213,11 @@
}
/**
- * Updates the designated column with a <code>boolean</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code boolean} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2237,11 +2237,11 @@
}
/**
- * Updates the designated column with a <code>byte</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code byte} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
*
* @param columnIndex the first column is 1, the second is 2, and so on
@@ -2262,11 +2262,11 @@
}
/**
- * Updates the designated column with a <code>short</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code short} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2286,11 +2286,11 @@
}
/**
- * Updates the designated column with an <code>int</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with an {@code int} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2309,11 +2309,11 @@
}
/**
- * Updates the designated column with a <code>long</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code long} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2333,11 +2333,11 @@
}
/**
- * Updates the designated column with a <code>float</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code float} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2357,11 +2357,11 @@
}
/**
- * Updates the designated column with a <code>double</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code double} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2381,12 +2381,12 @@
}
/**
- * Updates the designated column with a <code>java.math.BigDecimal</code>
+ * Updates the designated column with a {@code java.math.BigDecimal}
* value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2406,11 +2406,11 @@
}
/**
- * Updates the designated column with a <code>String</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code String} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2430,11 +2430,11 @@
}
/**
- * Updates the designated column with a <code>byte</code> array value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code byte} array value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2454,11 +2454,11 @@
}
/**
- * Updates the designated column with a <code>java.sql.Date</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code java.sql.Date} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2479,11 +2479,11 @@
/**
- * Updates the designated column with a <code>java.sql.Time</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code java.sql.Time} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2503,12 +2503,12 @@
}
/**
- * Updates the designated column with a <code>java.sql.Timestamp</code>
+ * Updates the designated column with a {@code java.sql.Timestamp}
* value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2529,10 +2529,10 @@
/**
* Updates the designated column with an ascii stream value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2554,10 +2554,10 @@
/**
* Updates the designated column with a binary stream value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2579,10 +2579,10 @@
/**
* Updates the designated column with a character stream value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2603,18 +2603,18 @@
}
/**
- * Updates the designated column with an <code>Object</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with an {@code Object} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
- * @param scale for <code>java.sql.Types.DECIMAl</code>
- * or <code>java.sql.Types.NUMERIC</code> types,
- * this is the number of digits after the decimal point. For all other
- * types this value will be ignored.
+ * @param scale for {@code java.sql.Types.DECIMAl}
+ * or {@code java.sql.Types.NUMERIC} types,
+ * this is the number of digits after the decimal point. For all other
+ * types this value will be ignored.
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -2631,11 +2631,11 @@
}
/**
- * Updates the designated column with an <code>Object</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with an {@code Object} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, and so on
* @param x the new column value
@@ -2655,11 +2655,11 @@
}
/**
- * Updates the designated column with a <code>null</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code null} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @throws SQLException if a database access error occurs
@@ -2672,11 +2672,11 @@
}
/**
- * Updates the designated column with a <code>boolean</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code boolean} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2688,11 +2688,11 @@
}
/**
- * Updates the designated column with a <code>byte</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code byte} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2704,11 +2704,11 @@
}
/**
- * Updates the designated column with a <code>short</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code short} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2720,11 +2720,11 @@
}
/**
- * Updates the designated column with an <code>int</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with an {@code int} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2736,11 +2736,11 @@
}
/**
- * Updates the designated column with a <code>long</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code long} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2752,11 +2752,11 @@
}
/**
- * Updates the designated column with a <code>float </code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code float } value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2768,11 +2768,11 @@
}
/**
- * Updates the designated column with a <code>double</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code double} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2784,12 +2784,12 @@
}
/**
- * Updates the designated column with a <code>java.sql.BigDecimal</code>
+ * Updates the designated column with a {@code java.sql.BigDecimal}
* value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2801,11 +2801,11 @@
}
/**
- * Updates the designated column with a <code>String</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code String} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2817,19 +2817,19 @@
}
/**
- * Updates the designated column with a <code>boolean</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code boolean} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* JDBC 2.0
*
* Updates a column with a byte array value.
*
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row, or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or <code>insertRow</code>
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row, or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or {@code insertRow}
* methods are called to update the database.
*
* @param columnName the name of the column
@@ -2842,11 +2842,11 @@
}
/**
- * Updates the designated column with a <code>java.sql.Date</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code java.sql.Date} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2858,11 +2858,11 @@
}
/**
- * Updates the designated column with a <code>java.sql.Time</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with a {@code java.sql.Time} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2874,12 +2874,12 @@
}
/**
- * Updates the designated column with a <code>java.sql.Timestamp</code>
+ * Updates the designated column with a {@code java.sql.Timestamp}
* value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2892,10 +2892,10 @@
/**
* Updates the designated column with an ascii stream value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2909,10 +2909,10 @@
/**
* Updates the designated column with a binary stream value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2926,14 +2926,14 @@
/**
* Updates the designated column with a character stream value.
- * The <code>updateXXX</code> methods are used to update column values
- * in the current row or the insert row. The <code>updateXXX</code>
+ * The {@code updateXXX} methods are used to update column values
+ * in the current row or the insert row. The {@code updateXXX}
* methods do not update the underlying database; instead the
- * <code>updateRow</code> or <code>insertRow</code> methods are called
+ * {@code updateRow} or {@code insertRow} methods are called
* to update the database.
*
* @param columnName the name of the column
- * @param reader the new column <code>Reader</code> stream value
+ * @param reader the new column {@code Reader} stream value
* @param length the length of the stream
* @throws SQLException if a database access error occurs
*
@@ -2943,16 +2943,16 @@
}
/**
- * Updates the designated column with an <code>Object</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with an {@code Object} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
- * @param scale for <code>java.sql.Types.DECIMAL</code>
- * or <code>java.sql.Types.NUMERIC</code> types,
+ * @param scale for {@code java.sql.Types.DECIMAL}
+ * or {@code java.sql.Types.NUMERIC} types,
* this is the number of digits after the decimal point. For all other
* types this value will be ignored.
* @throws SQLException if a database access error occurs
@@ -2963,11 +2963,11 @@
}
/**
- * Updates the designated column with an <code>Object</code> value.
- * The <code>updateXXX</code> methods are used to update column values in the
- * current row or the insert row. The <code>updateXXX</code> methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * Updates the designated column with an {@code Object} value.
+ * The {@code updateXXX} methods are used to update column values in the
+ * current row or the insert row. The {@code updateXXX} methods do not
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnName the name of the column
* @param x the new column value
@@ -2980,7 +2980,7 @@
/**
* Inserts the contents of the insert row into this
- * <code>ResultSet</code> object and into the database
+ * {@code ResultSet} object and into the database
* and also notifies listeners that a row has changed.
* The cursor must be on the insert row when this method is called.
*
@@ -3000,14 +3000,14 @@
/**
* Updates the underlying database with the new contents of the
- * current row of this rowset's <code>ResultSet</code> object
+ * current row of this rowset's {@code ResultSet} object
* and notifies listeners that a row has changed.
* This method cannot be called when the cursor is on the insert row.
*
* @throws SQLException if (1) a database access error occurs,
* (2) this method is called when the cursor is
* on the insert row, (3) the concurrency of the result
- * set is <code>ResultSet.CONCUR_READ_ONLY</code>, or
+ * set is {@code ResultSet.CONCUR_READ_ONLY}, or
* (4) this rowset does not currently have a valid connection,
* prepared statement, and result set
*/
@@ -3019,18 +3019,18 @@
}
/**
- * Deletes the current row from this rowset's <code>ResultSet</code> object
+ * Deletes the current row from this rowset's {@code ResultSet} object
* and from the underlying database and also notifies listeners that a row
* has changed. This method cannot be called when the cursor is on the insert
* row.
*
* @throws SQLException if a database access error occurs
- * or if this method is called when the cursor is on the insert row
+ * or if this method is called when the cursor is on the insert row
* @throws SQLException if (1) a database access error occurs,
* (2) this method is called when the cursor is before the
* first row, after the last row, or on the insert row,
* (3) the concurrency of this rowset's result
- * set is <code>ResultSet.CONCUR_READ_ONLY</code>, or
+ * set is {@code ResultSet.CONCUR_READ_ONLY}, or
* (4) this rowset does not currently have a valid connection,
* prepared statement, and result set
*/
@@ -3042,24 +3042,24 @@
}
/**
- * Refreshes the current row of this rowset's <code>ResultSet</code>
+ * Refreshes the current row of this rowset's {@code ResultSet}
* object with its most recent value in the database. This method
* cannot be called when the cursor is on the insert row.
*
- * <P>The <code>refreshRow</code> method provides a way for an
+ * <P>The {@code refreshRow} method provides a way for an
* application to explicitly tell the JDBC driver to refetch
* a row(s) from the database. An application may want to call
- * <code>refreshRow</code> when caching or prefetching is being
+ * {@code refreshRow} when caching or prefetching is being
* done by the JDBC driver to fetch the latest value of a row
* from the database. The JDBC driver may actually refresh multiple
* rows at once if the fetch size is greater than one.
*
* <P> All values are refetched subject to the transaction isolation
- * level and cursor sensitivity. If <code>refreshRow</code> is called after
- * calling an <code>updateXXX</code> method, but before calling
- * the method <code>updateRow</code>, then the
+ * level and cursor sensitivity. If {@code refreshRow} is called after
+ * calling an {@code updateXXX} method, but before calling
+ * the method {@code updateRow}, then the
* updates made to the row are lost. Calling the method
- * <code>refreshRow</code> frequently will likely slow performance.
+ * {@code refreshRow} frequently will likely slow performance.
*
* @throws SQLException if (1) a database access error occurs,
* (2) this method is called when the cursor is
@@ -3076,12 +3076,12 @@
/**
* Cancels the updates made to the current row in this
- * <code>ResultSet</code> object and notifies listeners that a row
+ * {@code ResultSet} object and notifies listeners that a row
* has changed. This method may be called after calling an
- * <code>updateXXX</code> method(s) and before calling
- * the method <code>updateRow</code> to roll back
+ * {@code updateXXX} method(s) and before calling
+ * the method {@code updateRow} to roll back
* the updates made to a row. If no updates have been made or
- * <code>updateRow</code> has already been called, this method has no
+ * {@code updateRow} has already been called, this method has no
* effect.
*
* @throws SQLException if (1) a database access error occurs,
@@ -3104,19 +3104,19 @@
*
* The insert row is a special row associated with an updatable
* result set. It is essentially a buffer where a new row may
- * be constructed by calling the <code>updateXXX</code> methods prior to
+ * be constructed by calling the {@code updateXXX} methods prior to
* inserting the row into the result set.
*
- * Only the <code>updateXXX</code>, <code>getXXX</code>,
- * and <code>insertRow</code> methods may be
+ * Only the {@code updateXXX}, {@code getXXX},
+ * and {@code insertRow} methods may be
* called when the cursor is on the insert row. All of the columns in
* a result set must be given a value each time this method is
- * called before calling <code>insertRow</code>.
- * An <code>updateXXX</code> method must be called before a
- * <code>getXXX</code> method can be called on a column value.
+ * called before calling {@code insertRow}.
+ * An {@code updateXXX} method must be called before a
+ * {@code getXXX} method can be called on a column value.
*
* @throws SQLException if (1) a database access error occurs,
- * (2) this rowset's <code>ResultSet</code> object is
+ * (2) this rowset's {@code ResultSet} object is
* not updatable, or (3) this rowset does not
* currently have a valid connection, prepared statement,
* and result set
@@ -3134,7 +3134,7 @@
* the insert row.
*
* @throws SQLException if (1) a database access error occurs,
- * (2) this rowset's <code>ResultSet</code> object is
+ * (2) this rowset's {@code ResultSet} object is
* not updatable, or (3) this rowset does not
* currently have a valid connection, prepared statement,
* and result set
@@ -3146,14 +3146,14 @@
}
/**
- * Returns the <code>Statement</code> object that produced this
- * <code>ResultSet</code> object.
+ * Returns the {@code Statement} object that produced this
+ * {@code ResultSet} object.
* If the result set was generated some other way, such as by a
- * <code>DatabaseMetaData</code> method, this method returns
- * <code>null</code>.
- *
- * @return the <code>Statement</code> object that produced
- * this rowset's <code>ResultSet</code> object or <code>null</code>
+ * {@code DatabaseMetaData} method, this method returns
+ * {@code null}.
+ *
+ * @return the {@code Statement} object that produced
+ * this rowset's {@code ResultSet} object or {@code null}
* if the result set was produced some other way
* @throws SQLException if a database access error occurs
*/
@@ -3169,16 +3169,16 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as an <code>Object</code>.
- * This method uses the given <code>Map</code> object
+ * of this rowset's {@code ResultSet} object as an {@code Object}.
+ * This method uses the given {@code Map} object
* for the custom mapping of the
* SQL structured or distinct type that is being retrieved.
*
* @param i the first column is 1, the second is 2, and so on
- * @param map a <code>java.util.Map</code> object that contains the mapping
- * from SQL type names to classes in the Java programming language
- * @return an <code>Object</code> in the Java programming language
- * representing the SQL value
+ * @param map a {@code java.util.Map} object that contains the mapping
+ * from SQL type names to classes in the Java programming language
+ * @return an {@code Object} in the Java programming language
+ * representing the SQL value
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3193,10 +3193,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>Ref</code> object.
+ * of this rowset's {@code ResultSet} object as a {@code Ref} object.
*
* @param i the first column is 1, the second is 2, and so on
- * @return a <code>Ref</code> object representing an SQL <code>REF</code> value
+ * @return a {@code Ref} object representing an SQL {@code REF} value
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3210,10 +3210,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>Blob</code> object.
+ * of this rowset's {@code ResultSet} object as a {@code Blob} object.
*
* @param i the first column is 1, the second is 2, and so on
- * @return a <code>Blob</code> object representing the SQL <code>BLOB</code>
+ * @return a {@code Blob} object representing the SQL {@code BLOB}
* value in the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3227,10 +3227,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>Clob</code> object.
+ * of this rowset's {@code ResultSet} object as a {@code Clob} object.
*
* @param i the first column is 1, the second is 2, and so on
- * @return a <code>Clob</code> object representing the SQL <code>CLOB</code>
+ * @return a {@code Clob} object representing the SQL {@code CLOB}
* value in the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3244,10 +3244,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as an <code>Array</code> object.
+ * of this rowset's {@code ResultSet} object as an {@code Array} object.
*
* @param i the first column is 1, the second is 2, and so on.
- * @return an <code>Array</code> object representing the SQL <code>ARRAY</code>
+ * @return an {@code Array} object representing the SQL {@code ARRAY}
* value in the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3261,14 +3261,14 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as an <code>Object</code>.
- * This method uses the specified <code>Map</code> object for
+ * of this rowset's {@code ResultSet} object as an {@code Object}.
+ * This method uses the specified {@code Map} object for
* custom mapping if appropriate.
*
* @param colName the name of the column from which to retrieve the value
- * @param map a <code>java.util.Map</code> object that contains the mapping
+ * @param map a {@code java.util.Map} object that contains the mapping
* from SQL type names to classes in the Java programming language
- * @return an <code>Object</code> representing the SQL
+ * @return an {@code Object} representing the SQL
* value in the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3282,10 +3282,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>Ref</code> object.
+ * of this rowset's {@code ResultSet} object as a {@code Ref} object.
*
* @param colName the column name
- * @return a <code>Ref</code> object representing the SQL <code>REF</code> value in
+ * @return a {@code Ref} object representing the SQL {@code REF} value in
* the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3297,10 +3297,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>Blob</code> object.
+ * of this rowset's {@code ResultSet} object as a {@code Blob} object.
*
* @param colName the name of the column from which to retrieve the value
- * @return a <code>Blob</code> object representing the SQL <code>BLOB</code>
+ * @return a {@code Blob} object representing the SQL {@code BLOB}
* value in the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3312,10 +3312,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>Clob</code> object.
+ * of this rowset's {@code ResultSet} object as a {@code Clob} object.
*
* @param colName the name of the column from which to retrieve the value
- * @return a <code>Clob</code> object representing the SQL <code>CLOB</code>
+ * @return a {@code Clob} object representing the SQL {@code CLOB}
* value in the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3327,10 +3327,10 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as an <code>Array</code> object.
+ * of this rowset's {@code ResultSet} object as an {@code Array} object.
*
* @param colName the name of the column from which to retrieve the value
- * @return an <code>Array</code> object representing the SQL <code>ARRAY</code>
+ * @return an {@code Array} object representing the SQL {@code ARRAY}
* value in the specified column
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
@@ -3342,17 +3342,17 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Date</code>
+ * of this rowset's {@code ResultSet} object as a {@code java.sql.Date}
* object. This method uses the given calendar to construct an appropriate
* millisecond value for the date if the underlying database does not store
* timezone information.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @param cal the <code>java.util.Calendar</code> object
+ * @param cal the {@code java.util.Calendar} object
* to use in constructing the date
- * @return the column value as a <code>java.sql.Date</code> object;
- * if the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code>
+ * @return the column value as a {@code java.sql.Date} object;
+ * if the value is SQL {@code NULL},
+ * the value returned is {@code null}
* @throws SQLException if (1) a database access error occurs
* or (2) this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3365,17 +3365,17 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Date</code>
+ * of this rowset's {@code ResultSet} object as a {@code java.sql.Date}
* object. This method uses the given calendar to construct an appropriate
* millisecond value for the date if the underlying database does not store
* timezone information.
*
* @param columnName the SQL name of the column from which to retrieve the value
- * @param cal the <code>java.util.Calendar</code> object
+ * @param cal the {@code java.util.Calendar} object
* to use in constructing the date
- * @return the column value as a <code>java.sql.Date</code> object;
- * if the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code>
+ * @return the column value as a {@code java.sql.Date} object;
+ * if the value is SQL {@code NULL},
+ * the value returned is {@code null}
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3387,17 +3387,17 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Time</code>
+ * of this rowset's {@code ResultSet} object as a {@code java.sql.Time}
* object. This method uses the given calendar to construct an appropriate
* millisecond value for the date if the underlying database does not store
* timezone information.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @param cal the <code>java.util.Calendar</code> object
+ * @param cal the {@code java.util.Calendar} object
* to use in constructing the time
- * @return the column value as a <code>java.sql.Time</code> object;
- * if the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code> in the Java programming language
+ * @return the column value as a {@code java.sql.Time} object;
+ * if the value is SQL {@code NULL},
+ * the value returned is {@code null} in the Java programming language
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3410,17 +3410,17 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a <code>java.sql.Time</code>
+ * of this rowset's {@code ResultSet} object as a {@code java.sql.Time}
* object. This method uses the given calendar to construct an appropriate
* millisecond value for the date if the underlying database does not store
* timezone information.
*
* @param columnName the SQL name of the column
- * @param cal the <code>java.util.Calendar</code> object
+ * @param cal the {@code java.util.Calendar} object
* to use in constructing the time
- * @return the column value as a <code>java.sql.Time</code> object;
- * if the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code> in the Java programming language
+ * @return the column value as a {@code java.sql.Time} object;
+ * if the value is SQL {@code NULL},
+ * the value returned is {@code null} in the Java programming language
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3431,18 +3431,18 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a
- * <code>java.sql.Timestamp</code> object.
+ * of this rowset's {@code ResultSet} object as a
+ * {@code java.sql.Timestamp} object.
* This method uses the given calendar to construct an appropriate millisecond
* value for the timestamp if the underlying database does not store
* timezone information.
*
* @param columnIndex the first column is 1, the second is 2, and so on
- * @param cal the <code>java.util.Calendar</code> object
+ * @param cal the {@code java.util.Calendar} object
* to use in constructing the timestamp
- * @return the column value as a <code>java.sql.Timestamp</code> object;
- * if the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code>
+ * @return the column value as a {@code java.sql.Timestamp} object;
+ * if the value is SQL {@code NULL},
+ * the value returned is {@code null}
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3455,18 +3455,18 @@
/**
* Returns the value of the designated column in the current row
- * of this rowset's <code>ResultSet</code> object as a
- * <code>java.sql.Timestamp</code> object.
+ * of this rowset's {@code ResultSet} object as a
+ * {@code java.sql.Timestamp} object.
* This method uses the given calendar to construct an appropriate millisecond
* value for the timestamp if the underlying database does not store
* timezone information.
*
* @param columnName the SQL name of the column
- * @param cal the <code>java.util.Calendar</code> object
+ * @param cal the {@code java.util.Calendar} object
* to use in constructing the timestamp
- * @return the column value as a <code>java.sql.Timestamp</code> object;
- * if the value is SQL <code>NULL</code>,
- * the value returned is <code>null</code>
+ * @return the column value as a {@code java.sql.Timestamp} object;
+ * if the value is SQL {@code NULL},
+ * the value returned is {@code null}
* @throws SQLException if a database access error occurs
* or this rowset does not currently have a valid connection,
* prepared statement, and result set
@@ -3478,8 +3478,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3490,14 +3490,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param ref the new <code>Ref</code> column value
+ * @param ref the new {@code Ref} column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateRef(int columnIndex, java.sql.Ref ref)
throws SQLException {
@@ -3507,8 +3507,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3519,13 +3519,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param ref the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateRef(String columnName, java.sql.Ref ref)
throws SQLException {
@@ -3534,8 +3534,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3546,14 +3546,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param c the new column <code>Clob</code> value
+ * @param c the new column {@code Clob} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateClob(int columnIndex, Clob c) throws SQLException {
checkState();
@@ -3563,8 +3563,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3575,13 +3575,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param c the new column <code>Clob</code> value
+ * @param c the new column {@code Clob} value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateClob(String columnName, Clob c) throws SQLException {
updateClob(findColumn(columnName), c);
@@ -3589,8 +3589,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>java.sql.Blob</code> value.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code java.sql.Blob} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3601,14 +3601,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param b the new column <code>Blob</code> value
+ * @param b the new column {@code Blob} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBlob(int columnIndex, Blob b) throws SQLException {
checkState();
@@ -3617,8 +3617,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>java.sql.Blob </code> value.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code java.sql.Blob } value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3629,13 +3629,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param b the new column <code>Blob</code> value
+ * @param b the new column {@code Blob} value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBlob(String columnName, Blob b) throws SQLException {
updateBlob(findColumn(columnName), b);
@@ -3643,8 +3643,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>java.sql.Array</code> values.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code java.sql.Array} values.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3655,14 +3655,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param a the new column <code>Array</code> value
+ * @param a the new column {@code Array} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateArray(int columnIndex, Array a) throws SQLException {
checkState();
@@ -3671,8 +3671,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>JdbcRowSetImpl</code> object with the given
- * <code>java.sql.Array</code> value.
+ * row of this {@code JdbcRowSetImpl} object with the given
+ * {@code java.sql.Array} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3683,20 +3683,20 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param a the new column <code>Array</code> value
+ * @param a the new column {@code Array} value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateArray(String columnName, Array a) throws SQLException {
updateArray(findColumn(columnName), a);
}
/**
- * Provide interface coverage for getURL(int) in ResultSet->RowSet
+ * Provide interface coverage for getURL(int) in {@code ResultSet->RowSet}
*/
public java.net.URL getURL(int columnIndex) throws SQLException {
checkState();
@@ -3704,7 +3704,7 @@
}
/**
- * Provide interface coverage for getURL(String) in ResultSet->RowSet
+ * Provide interface coverage for getURL(String) in {@code ResultSet->RowSet}
*/
public java.net.URL getURL(String columnName) throws SQLException {
return getURL(findColumn(columnName));
@@ -3712,14 +3712,14 @@
/**
* Return the RowSetWarning object for the current row of a
- * <code>JdbcRowSetImpl</code>
+ * {@code JdbcRowSetImpl}
*/
public RowSetWarning getRowSetWarnings() throws SQLException {
return null;
}
/**
* Unsets the designated parameter to the given int array.
- * This was set using <code>setMatchColumn</code>
+ * This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -3728,8 +3728,8 @@
* @param columnIdxes the index into this rowset
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds or if the columnIdx is
- * not the same as set using <code>setMatchColumn(int [])</code>
+ * parameter index is out of bounds or if the columnIdx is
+ * not the same as set using {@code setMatchColumn(int [])}
*/
public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
@@ -3748,7 +3748,7 @@
/**
* Unsets the designated parameter to the given String array.
- * This was set using <code>setMatchColumn</code>
+ * This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -3757,8 +3757,8 @@
* @param columnIdxes the index into this rowset
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds or if the columnName is
- * not the same as set using <code>setMatchColumn(String [])</code>
+ * parameter index is out of bounds or if the columnName is
+ * not the same as set using {@code setMatchColumn(String [])}
*/
public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
@@ -3774,11 +3774,11 @@
}
/**
- * Retrieves the column name as <code>String</code> array
- * that was set using <code>setMatchColumn(String [])</code>
+ * Retrieves the column name as {@code String} array
+ * that was set using {@code setMatchColumn(String [])}
* for this rowset.
*
- * @return a <code>String</code> array object that contains the column names
+ * @return a {@code String} array object that contains the column names
* for the rowset which has this the match columns
*
* @throws SQLException if an error occurs or column name is not set
@@ -3796,10 +3796,10 @@
}
/**
- * Retrieves the column id as <code>int</code> array that was set using
- * <code>setMatchColumn(int [])</code> for this rowset.
- *
- * @return a <code>int</code> array object that contains the column ids
+ * Retrieves the column id as {@code int} array that was set using
+ * {@code setMatchColumn(int [])} for this rowset.
+ *
+ * @return a {@code int} array object that contains the column ids
* for the rowset which has this as the match columns.
*
* @throws SQLException if an error occurs or column index is not set
@@ -3829,19 +3829,19 @@
/**
* Sets the designated parameter to the given int array.
* This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumnIndexes</code> is called.
+ * command when the method {@code getMatchColumnIndexes} is called.
*
* @param columnIdxes the indexes into this rowset
* object's internal representation of parameter values; the
* first parameter is 0, the second is 1, and so on; must be
- * <code>0</code> or greater
+ * {@code 0} or greater
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds
+ * parameter index is out of bounds
*/
public void setMatchColumn(int[] columnIdxes) throws SQLException {
@@ -3858,17 +3858,17 @@
/**
* Sets the designated parameter to the given String array.
* This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumn</code> is called.
+ * command when the method {@code getMatchColumn} is called.
*
* @param columnNames the name of the column into this rowset
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds
+ * parameter index is out of bounds
*/
public void setMatchColumn(String[] columnNames) throws SQLException {
@@ -3883,22 +3883,22 @@
}
- /**
- * Sets the designated parameter to the given <code>int</code>
+ /**
+ * Sets the designated parameter to the given {@code int}
* object. This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumn</code> is called.
+ * command when the method {@code getMatchColumn} is called.
*
* @param columnIdx the index into this rowset
* object's internal representation of parameter values; the
* first parameter is 0, the second is 1, and so on; must be
- * <code>0</code> or greater
+ * {@code 0} or greater
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds
+ * parameter index is out of bounds
*/
public void setMatchColumn(int columnIdx) throws SQLException {
// validate, if col is ok to be set
@@ -3912,19 +3912,19 @@
}
/**
- * Sets the designated parameter to the given <code>String</code>
+ * Sets the designated parameter to the given {@code String}
* object. This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumn</code> is called.
+ * command when the method {@code getMatchColumn} is called.
*
* @param columnName the name of the column into this rowset
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds
+ * parameter index is out of bounds
*/
public void setMatchColumn(String columnName) throws SQLException {
// validate, if col is ok to be set
@@ -3938,8 +3938,8 @@
}
/**
- * Unsets the designated parameter to the given <code>int</code>
- * object. This was set using <code>setMatchColumn</code>
+ * Unsets the designated parameter to the given {@code int}
+ * object. This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -3948,8 +3948,8 @@
* @param columnIdx the index into this rowset
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds or if the columnIdx is
- * not the same as set using <code>setMatchColumn(int)</code>
+ * parameter index is out of bounds or if the columnIdx is
+ * not the same as set using {@code setMatchColumn(int)}
*/
public void unsetMatchColumn(int columnIdx) throws SQLException {
// check if we are unsetting the SAME column
@@ -3964,8 +3964,8 @@
}
/**
- * Unsets the designated parameter to the given <code>String</code>
- * object. This was set using <code>setMatchColumn</code>
+ * Unsets the designated parameter to the given {@code String}
+ * object. This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -3974,8 +3974,8 @@
* @param columnName the index into this rowset
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
- * parameter index is out of bounds or if the columnName is
- * not the same as set using <code>setMatchColumn(String)</code>
+ * parameter index is out of bounds or if the columnName is
+ * not the same as set using {@code setMatchColumn(String)}
*
*/
public void unsetMatchColumn(String columnName) throws SQLException {
@@ -3992,12 +3992,12 @@
}
/**
- * Retrieves the <code>DatabaseMetaData</code> associated with
+ * Retrieves the {@code DatabaseMetaData} associated with
* the connection handle associated with this
- * <code>JdbcRowSet</code> object.
- *
- * @return the <code>DatabaseMetadata</code> associated
- * with the rowset's connection.
+ * {@code JdbcRowSet} object.
+ *
+ * @return the {@code DatabaseMetadata} associated
+ * with the rowset's connection.
* @throws SQLException if a database access error occurs
*/
public DatabaseMetaData getDatabaseMetaData() throws SQLException {
@@ -4006,12 +4006,12 @@
}
/**
- * Retrieves the <code>ParameterMetaData</code> associated with
+ * Retrieves the {@code ParameterMetaData} associated with
* the connection handle associated with this
- * <code>JdbcRowSet</code> object.
- *
- * @return the <code>ParameterMetadata</code> associated
- * with the rowset's connection.
+ * {@code JdbcRowSet} object.
+ *
+ * @return the {@code ParameterMetadata} associated
+ * with the rowset's connection.
* @throws SQLException if a database access error occurs
*/
public ParameterMetaData getParameterMetaData() throws SQLException {
@@ -4020,18 +4020,18 @@
}
/**
- * Commits all updates in this <code>JdbcRowSet</code> object by
- * wrapping the internal <code>Connection</code> object and calling
- * its <code>commit</code> method.
- * This method sets this <code>JdbcRowSet</code> object's private field
- * <code>rs</code> to <code>null</code> after saving its value to another
- * object, but only if the <code>ResultSet</code>
- * constant <code>HOLD_CURSORS_OVER_COMMIT</code> has not been set.
- * (The field <code>rs</code> is this <code>JdbcRowSet</code> object's
- * <code>ResultSet</code> object.)
+ * Commits all updates in this {@code JdbcRowSet} object by
+ * wrapping the internal {@code Connection} object and calling
+ * its {@code commit} method.
+ * This method sets this {@code JdbcRowSet} object's private field
+ * {@code rs} to {@code null} after saving its value to another
+ * object, but only if the {@code ResultSet}
+ * constant {@code HOLD_CURSORS_OVER_COMMIT} has not been set.
+ * (The field {@code rs} is this {@code JdbcRowSet} object's
+ * {@code ResultSet} object.)
*
* @throws SQLException if autoCommit is set to true or if a database
- * access error occurs
+ * access error occurs
*/
public void commit() throws SQLException {
conn.commit();
@@ -4045,8 +4045,8 @@
}
/**
- * Sets auto-commit on the internal <code>Connection</code> object with this
- * <code>JdbcRowSet</code>
+ * Sets auto-commit on the internal {@code Connection} object with this
+ * {@code JdbcRowSet}
*
* @throws SQLException if a database access error occurs
*/
@@ -4074,7 +4074,7 @@
}
/**
- * Returns the auto-commit status with this <code>JdbcRowSet</code>.
+ * Returns the auto-commit status with this {@code JdbcRowSet}.
*
* @return true if auto commit is true; false otherwise
* @throws SQLException if a database access error occurs
@@ -4084,16 +4084,16 @@
}
/**
- * Rolls back all the updates in this <code>JdbcRowSet</code> object by
- * wrapping the internal <code>Connection</code> object and calling its
- * <code>rollback</code> method.
- * This method sets this <code>JdbcRowSet</code> object's private field
- * <code>rs</code> to <code>null</code> after saving its value to another object.
- * (The field <code>rs</code> is this <code>JdbcRowSet</code> object's
- * internal <code>ResultSet</code> object.)
+ * Rolls back all the updates in this {@code JdbcRowSet} object by
+ * wrapping the internal {@code Connection} object and calling its
+ * {@code rollback} method.
+ * This method sets this {@code JdbcRowSet} object's private field
+ * {@code rs} to {@code null} after saving its value to another object.
+ * (The field {@code rs} is this {@code JdbcRowSet} object's
+ * internal {@code ResultSet} object.)
*
* @throws SQLException if autoCommit is set to true or a database
- * access error occurs
+ * access error occurs
*/
public void rollback() throws SQLException {
conn.rollback();
@@ -4106,14 +4106,14 @@
/**
- * Rollbacks all the updates in the <code>JdbcRowSet</code> back to the
- * last <code>Savepoint</code> transaction marker. Wraps the internal
- * <code>Connection</code> object and call it's rollback method
- *
- * @param s the <code>Savepoint</code> transaction marker to roll the
- * transaction to.
+ * Rollbacks all the updates in the {@code JdbcRowSet} back to the
+ * last {@code Savepoint} transaction marker. Wraps the internal
+ * {@code Connection} object and call it's rollback method
+ *
+ * @param s the {@code Savepoint} transaction marker to roll the
+ * transaction to.
* @throws SQLException if autoCommit is set to true; or ia a database
- * access error occurs
+ * access error occurs
*/
public void rollback(Savepoint s) throws SQLException {
conn.rollback(s);
@@ -4144,10 +4144,10 @@
// Added as per Rave requirements
/**
- * Gets this <code>JdbcRowSet</code> object's Connection property
- *
- *
- * @return the <code>Connection</code> object associated with this rowset;
+ * Gets this {@code JdbcRowSet} object's Connection property
+ *
+ *
+ * @return the {@code Connection} object associated with this rowset;
*/
protected Connection getConnection() {
@@ -4158,10 +4158,10 @@
// Added as per rave requirements
/**
- * Sets this <code>JdbcRowSet</code> object's connection property
- * to the given <code>Connection</code> object.
- *
- * @param connection the <code>Connection</code> object.
+ * Sets this {@code JdbcRowSet} object's connection property
+ * to the given {@code Connection} object.
+ *
+ * @param connection the {@code Connection} object.
*/
protected void setConnection(Connection connection) {
@@ -4172,10 +4172,10 @@
// Added as per Rave requirements
/**
- * Gets this <code>JdbcRowSet</code> object's PreparedStatement property
- *
- *
- * @return the <code>PreparedStatement</code> object associated with this rowset;
+ * Gets this {@code JdbcRowSet} object's PreparedStatement property
+ *
+ *
+ * @return the {@code PreparedStatement} object associated with this rowset;
*/
protected PreparedStatement getPreparedStatement() {
@@ -4186,10 +4186,10 @@
// Added as per Rave requirements
/**
- * Sets this <code>JdbcRowSet</code> object's preparedtsatement property
- * to the given <code>PreparedStatemennt</code> object.
- *
- * @param preparedStatement the <code>PreparedStatement</code> object
+ * Sets this {@code JdbcRowSet} object's preparedtsatement property
+ * to the given {@code PreparedStatemennt} object.
+ *
+ * @param preparedStatement the {@code PreparedStatement} object
*
*/
protected void setPreparedStatement(PreparedStatement preparedStatement) {
@@ -4200,10 +4200,10 @@
// Added as per Rave requirements
/**
- * Gets this <code>JdbcRowSet</code> object's ResultSet property
- *
- *
- * @return the <code>ResultSet</code> object associated with this rowset;
+ * Gets this {@code JdbcRowSet} object's ResultSet property
+ *
+ *
+ * @return the {@code ResultSet} object associated with this rowset;
*/
protected ResultSet getResultSet() throws SQLException {
@@ -4217,10 +4217,10 @@
// Added as per Rave requirements
/**
- * Sets this <code>JdbcRowSet</code> object's resultset property
- * to the given <code>ResultSet</code> object.
- *
- * @param resultSet the <code>ResultSet</code> object
+ * Sets this {@code JdbcRowSet} object's resultset property
+ * to the given {@code ResultSet} object.
+ *
+ * @param resultSet the {@code ResultSet} object
*
*/
protected void setResultSet(ResultSet resultSet) {
@@ -4228,25 +4228,25 @@
}
/**
- * Sets this <code>JdbcRowSet</code> object's <code>command</code> property to
- * the given <code>String</code> object and clears the parameters, if any,
+ * Sets this {@code JdbcRowSet} object's {@code command} property to
+ * the given {@code String} object and clears the parameters, if any,
* that were set for the previous command. In addition,
- * if the <code>command</code> property has previously been set to a
+ * if the {@code command} property has previously been set to a
* non-null value and it is
- * different from the <code>String</code> object supplied,
- * this method sets this <code>JdbcRowSet</code> object's private fields
- * <code>ps</code> and <code>rs</code> to <code>null</code>.
- * (The field <code>ps</code> is its <code>PreparedStatement</code> object, and
- * the field <code>rs</code> is its <code>ResultSet</code> object.)
+ * different from the {@code String} object supplied,
+ * this method sets this {@code JdbcRowSet} object's private fields
+ * {@code ps} and {@code rs} to {@code null}.
+ * (The field {@code ps} is its {@code PreparedStatement} object, and
+ * the field {@code rs} is its {@code ResultSet} object.)
* <P>
- * The <code>command</code> property may not be needed if the <code>RowSet</code>
+ * The {@code command} property may not be needed if the {@code RowSet}
* object gets its data from a source that does not support commands,
* such as a spreadsheet or other tabular file.
- * Thus, this property is optional and may be <code>null</code>.
- *
- * @param command a <code>String</code> object containing an SQL query
- * that will be set as this <code>RowSet</code> object's command
- * property; may be <code>null</code> but may not be an empty string
+ * Thus, this property is optional and may be {@code null}.
+ *
+ * @param command a {@code String} object containing an SQL query
+ * that will be set as this {@code RowSet} object's command
+ * property; may be {@code null} but may not be an empty string
* @throws SQLException if an empty string is provided as the command value
* @see #getCommand
*/
@@ -4265,32 +4265,32 @@
}
/**
- * Sets the <code>dataSourceName</code> property for this <code>JdbcRowSet</code>
- * object to the given logical name and sets this <code>JdbcRowSet</code> object's
- * Url property to <code>null</code>. In addition, if the <code>dataSourceName</code>
+ * Sets the {@code dataSourceName} property for this {@code JdbcRowSet}
+ * object to the given logical name and sets this {@code JdbcRowSet} object's
+ * Url property to {@code null}. In addition, if the {@code dataSourceName}
* property has previously been set and is different from the one supplied,
- * this method sets this <code>JdbcRowSet</code> object's private fields
- * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
- * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
- * the field <code>rs</code> is its <code>ResultSet</code> object, and
- * the field <code>conn</code> is its <code>Connection</code> object.)
+ * this method sets this {@code JdbcRowSet} object's private fields
+ * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+ * (The field {@code ps} is its {@code PreparedStatement} object,
+ * the field {@code rs} is its {@code ResultSet} object, and
+ * the field {@code conn} is its {@code Connection} object.)
* <P>
* The name supplied to this method must have been bound to a
- * <code>DataSource</code> object in a JNDI naming service so that an
+ * {@code DataSource} object in a JNDI naming service so that an
* application can do a lookup using that name to retrieve the
- * <code>DataSource</code> object bound to it. The <code>DataSource</code>
+ * {@code DataSource} object bound to it. The {@code DataSource}
* object can then be used to establish a connection to the data source it
* represents.
* <P>
* Users should set either the Url property or the dataSourceName property.
* If both properties are set, the driver will use the property set most recently.
*
- * @param dsName a <code>String</code> object with the name that can be supplied
+ * @param dsName a {@code String} object with the name that can be supplied
* to a naming service based on JNDI technology to retrieve the
- * <code>DataSource</code> object that can be used to get a connection;
- * may be <code>null</code>
+ * {@code DataSource} object that can be used to get a connection;
+ * may be {@code null}
* @throws SQLException if there is a problem setting the
- * <code>dataSourceName</code> property
+ * {@code dataSourceName} property
* @see #getDataSourceName
*/
public void setDataSourceName(String dsName) throws SQLException{
@@ -4310,42 +4310,42 @@
/**
- * Sets the Url property for this <code>JdbcRowSet</code> object
- * to the given <code>String</code> object and sets the dataSource name
- * property to <code>null</code>. In addition, if the Url property has
- * previously been set to a non <code>null</code> value and its value
+ * Sets the Url property for this {@code JdbcRowSet} object
+ * to the given {@code String} object and sets the dataSource name
+ * property to {@code null}. In addition, if the Url property has
+ * previously been set to a non {@code null} value and its value
* is different from the value to be set,
- * this method sets this <code>JdbcRowSet</code> object's private fields
- * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
- * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
- * the field <code>rs</code> is its <code>ResultSet</code> object, and
- * the field <code>conn</code> is its <code>Connection</code> object.)
+ * this method sets this {@code JdbcRowSet} object's private fields
+ * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+ * (The field {@code ps} is its {@code PreparedStatement} object,
+ * the field {@code rs} is its {@code ResultSet} object, and
+ * the field {@code conn} is its {@code Connection} object.)
* <P>
* The Url property is a JDBC URL that is used when
* the connection is created using a JDBC technology-enabled driver
- * ("JDBC driver") and the <code>DriverManager</code>.
+ * ("JDBC driver") and the {@code DriverManager}.
* The correct JDBC URL for the specific driver to be used can be found
* in the driver documentation. Although there are guidelines for how
* a JDBC URL is formed,
- * a driver vendor can specify any <code>String</code> object except
- * one with a length of <code>0</code> (an empty string).
+ * a driver vendor can specify any {@code String} object except
+ * one with a length of {@code 0} (an empty string).
* <P>
* Setting the Url property is optional if connections are established using
- * a <code>DataSource</code> object instead of the <code>DriverManager</code>.
+ * a {@code DataSource} object instead of the {@code DriverManager}.
* The driver will use either the URL property or the
* dataSourceName property to create a connection, whichever was
* specified most recently. If an application uses a JDBC URL, it
* must load a JDBC driver that accepts the JDBC URL before it uses the
- * <code>RowSet</code> object to connect to a database. The <code>RowSet</code>
+ * {@code RowSet} object to connect to a database. The {@code RowSet}
* object will use the URL internally to create a database connection in order
* to read or write data.
*
- * @param url a <code>String</code> object that contains the JDBC URL
+ * @param url a {@code String} object that contains the JDBC URL
* that will be used to establish the connection to a database for this
- * <code>RowSet</code> object; may be <code>null</code> but must not
+ * {@code RowSet} object; may be {@code null} but must not
* be an empty string
* @throws SQLException if an error occurs setting the Url property or the
- * parameter supplied is a string with a length of <code>0</code> (an
+ * parameter supplied is a string with a length of {@code 0} (an
* empty string)
* @see #getUrl
*/
@@ -4365,24 +4365,24 @@
}
}
- /**
- * Sets the username property for this <code>JdbcRowSet</code> object
+ /**
+ * Sets the username property for this {@code JdbcRowSet} object
* to the given user name. Because it
* is not serialized, the username property is set at run time before
- * calling the method <code>execute</code>. In addition,
- * if the <code>username</code> property is already set with a
- * non-null value and that value is different from the <code>String</code>
+ * calling the method {@code execute}. In addition,
+ * if the {@code username} property is already set with a
+ * non-null value and that value is different from the {@code String}
* object to be set,
- * this method sets this <code>JdbcRowSet</code> object's private fields
- * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
- * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
- * <code>rs</code> is its <code>ResultSet</code> object, and
- * <code>conn</code> is its <code>Connection</code> object.)
- * Setting these fields to <code>null</code> ensures that only current
+ * this method sets this {@code JdbcRowSet} object's private fields
+ * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+ * (The field {@code ps} is its {@code PreparedStatement} object,
+ * {@code rs} is its {@code ResultSet} object, and
+ * {@code conn} is its {@code Connection} object.)
+ * Setting these fields to {@code null} ensures that only current
* values will be used.
*
- * @param uname the <code>String</code> object containing the user name that
- * is supplied to the data source to create a connection. It may be null.
+ * @param uname the {@code String} object containing the user name that
+ * is supplied to the data source to create a connection. It may be null.
* @see #getUsername
*/
public void setUsername(String uname) {
@@ -4401,23 +4401,23 @@
}
/**
- * Sets the password property for this <code>JdbcRowSet</code> object
- * to the given <code>String</code> object. Because it
+ * Sets the password property for this {@code JdbcRowSet} object
+ * to the given {@code String} object. Because it
* is not serialized, the password property is set at run time before
- * calling the method <code>execute</code>. Its default valus is
- * <code>null</code>. In addition,
- * if the <code>password</code> property is already set with a
+ * calling the method {@code execute}. Its default valus is
+ * {@code null}. In addition,
+ * if the {@code password} property is already set with a
* non-null value and that value is different from the one being set,
- * this method sets this <code>JdbcRowSet</code> object's private fields
- * <code>ps</code>, <code>rs</code>, and <code>conn</code> to <code>null</code>.
- * (The field <code>ps</code> is its <code>PreparedStatement</code> object,
- * <code>rs</code> is its <code>ResultSet</code> object, and
- * <code>conn</code> is its <code>Connection</code> object.)
- * Setting these fields to <code>null</code> ensures that only current
+ * this method sets this {@code JdbcRowSet} object's private fields
+ * {@code ps}, {@code rs}, and {@code conn} to {@code null}.
+ * (The field {@code ps} is its {@code PreparedStatement} object,
+ * {@code rs} is its {@code ResultSet} object, and
+ * {@code conn} is its {@code Connection} object.)
+ * Setting these fields to {@code null} ensures that only current
* values will be used.
*
- * @param password the <code>String</code> object that represents the password
- * that must be supplied to the database to create a connection
+ * @param password the {@code String} object that represents the password
+ * that must be supplied to the database to create a connection
*/
public void setPassword(String password) {
@@ -4435,18 +4435,18 @@
}
/**
- * Sets the type for this <code>RowSet</code> object to the specified type.
- * The default type is <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>.
+ * Sets the type for this {@code RowSet} object to the specified type.
+ * The default type is {@code ResultSet.TYPE_SCROLL_INSENSITIVE}.
*
* @param type one of the following constants:
- * <code>ResultSet.TYPE_FORWARD_ONLY</code>,
- * <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, or
- * <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
+ * {@code ResultSet.TYPE_FORWARD_ONLY},
+ * {@code ResultSet.TYPE_SCROLL_INSENSITIVE}, or
+ * {@code ResultSet.TYPE_SCROLL_SENSITIVE}
* @throws SQLException if the parameter supplied is not one of the
* following constants:
- * <code>ResultSet.TYPE_FORWARD_ONLY</code> or
- * <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>
- * <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
+ * {@code ResultSet.TYPE_FORWARD_ONLY} or
+ * {@code ResultSet.TYPE_SCROLL_INSENSITIVE}
+ * {@code ResultSet.TYPE_SCROLL_SENSITIVE}
* @see #getConcurrency
* @see #getType
*/
@@ -4468,18 +4468,18 @@
}
/**
- * Sets the concurrency for this <code>RowSet</code> object to
- * the specified concurrency. The default concurrency for any <code>RowSet</code>
- * object (connected or disconnected) is <code>ResultSet.CONCUR_UPDATABLE</code>,
+ * Sets the concurrency for this {@code RowSet} object to
+ * the specified concurrency. The default concurrency for any {@code RowSet}
+ * object (connected or disconnected) is {@code ResultSet.CONCUR_UPDATABLE},
* but this method may be called at any time to change the concurrency.
*
* @param concur one of the following constants:
- * <code>ResultSet.CONCUR_READ_ONLY</code> or
- * <code>ResultSet.CONCUR_UPDATABLE</code>
+ * {@code ResultSet.CONCUR_READ_ONLY} or
+ * {@code ResultSet.CONCUR_UPDATABLE}
* @throws SQLException if the parameter supplied is not one of the
* following constants:
- * <code>ResultSet.CONCUR_UPDATABLE</code> or
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_UPDATABLE} or
+ * {@code ResultSet.CONCUR_READ_ONLY}
* @see #getConcurrency
* @see #isReadOnly
*/
@@ -4500,8 +4500,8 @@
}
/**
- * Retrieves the value of the designated <code>SQL XML</code> parameter as a
- * <code>SQLXML</code> object in the Java programming language.
+ * Retrieves the value of the designated {@code SQL XML} parameter as a
+ * {@code SQLXML} object in the Java programming language.
* @param columnIndex the first column is 1, the second is 2, ...
* @return a SQLXML object that maps an SQL XML value
* @throws SQLException if a database access error occurs
@@ -4512,8 +4512,8 @@
}
/**
- * Retrieves the value of the designated <code>SQL XML</code> parameter as a
- * <code>SQLXML</code> object in the Java programming language.
+ * Retrieves the value of the designated {@code SQL XML} parameter as a
+ * {@code SQLXML} object in the Java programming language.
* @param colName the name of the column from which to retrieve the value
* @return a SQLXML object that maps an SQL XML value
* @throws SQLException if a database access error occurs
@@ -4524,12 +4524,12 @@
/**
* Retrieves the value of the designated column in the current row of this
- * <code>ResultSet</code> object as a java.sql.RowId object in the Java
+ * {@code ResultSet} object as a java.sql.RowId object in the Java
* programming language.
*
* @param columnIndex the first column is 1, the second 2, ...
- * @return the column value if the value is a SQL <code>NULL</code> the
- * value returned is <code>null</code>
+ * @return the column value if the value is a SQL {@code NULL} the
+ * value returned is {@code null}
* @throws SQLException if a database access error occurs
* @since 1.6
*/
@@ -4539,12 +4539,12 @@
/**
* Retrieves the value of the designated column in the current row of this
- * <code>ResultSet</code> object as a java.sql.RowId object in the Java
+ * {@code ResultSet} object as a java.sql.RowId object in the Java
* programming language.
*
* @param columnName the name of the column
- * @return the column value if the value is a SQL <code>NULL</code> the
- * value returned is <code>null</code>
+ * @return the column value if the value is a SQL {@code NULL} the
+ * value returned is {@code null}
* @throws SQLException if a database access error occurs
* @since 1.6
*/
@@ -4553,10 +4553,10 @@
}
/**
- * Updates the designated column with a <code>RowId</code> value. The updater
+ * Updates the designated column with a {@code RowId} value. The updater
* methods are used to update column values in the current row or the insert
* row. The updater methods do not update the underlying database; instead
- * the <code>updateRow<code> or <code>insertRow</code> methods are called
+ * the {@code updateRow} or {@code insertRow} methods are called
* to update the database.
*
* @param columnIndex the first column is 1, the second 2, ...
@@ -4569,10 +4569,10 @@
}
/**
- * Updates the designated column with a <code>RowId</code> value. The updater
+ * Updates the designated column with a {@code RowId} value. The updater
* methods are used to update column values in the current row or the insert
* row. The updater methods do not update the underlying database; instead
- * the <code>updateRow<code> or <code>insertRow</code> methods are called
+ * the {@code updateRow} or {@code insertRow} methods are called
* to update the database.
*
* @param columnName the name of the column
@@ -4631,8 +4631,8 @@
/*o
- * This method is used for updating SQL <code>NCLOB</code> type that maps
- * to <code>java.sql.Types.NCLOB</code>
+ * This method is used for updating SQL {@code NCLOB} type that maps
+ * to {@code java.sql.Types.NCLOB}
* @param columnIndex the first column is 1, the second 2, ...
* @param nClob the value for the column to be updated
* @throws SQLException if a database access error occurs
@@ -4643,8 +4643,8 @@
}
/**
- * This method is used for updating SQL <code>NCLOB</code> type that maps
- * to <code>java.sql.Types.NCLOB</code>
+ * This method is used for updating SQL {@code NCLOB} type that maps
+ * to {@code java.sql.Types.NCLOB}
* @param columnName name of the column
* @param nClob the value for the column to be updated
* @throws SQLException if a database access error occurs
@@ -4656,12 +4656,12 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>ResultSet</code> object as a <code>NClob</code> object
+ * of this {@code ResultSet} object as a {@code NClob} object
* in the Java programming language.
*
* @param i the first column is 1, the second is 2, ...
- * @return a <code>NClob</code> object representing the SQL
- * <code>NCLOB</code> value in the specified column
+ * @return a {@code NClob} object representing the SQL
+ * {@code NCLOB} value in the specified column
* @exception SQLException if a database access error occurs
* @since 1.6
*/
@@ -4672,11 +4672,11 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>ResultSet</code> object as a <code>NClob</code> object
+ * of this {@code ResultSet} object as a {@code NClob} object
* in the Java programming language.
*
* @param colName the name of the column from which to retrieve the value
- * @return a <code>NClob</code> object representing the SQL <code>NCLOB</code>
+ * @return a {@code NClob} object representing the SQL {@code NCLOB}
* value in the specified column
* @exception SQLException if a database access error occurs
* @since 1.6
@@ -4694,10 +4694,10 @@
}
/**
- * Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
- * SQL <code>XML</code> value when it sends it to the database.
+ * Sets the designated parameter to the given {@code java.sql.SQLXML} object. The driver converts this to an
+ * SQL {@code XML} value when it sends it to the database.
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
- * @param xmlObject a <code>SQLXML</code> object that maps an SQL <code>XML</code> value
+ * @param xmlObject a {@code SQLXML} object that maps an SQL {@code XML} value
* @throws SQLException if a database access error occurs
* @since 1.6
*/
@@ -4706,10 +4706,10 @@
}
/**
- * Sets the designated parameter to the given <code>java.sql.SQLXML</code> object. The driver converts this to an
- * <code>SQL XML</code> value when it sends it to the database.
+ * Sets the designated parameter to the given {@code java.sql.SQLXML} object. The driver converts this to an
+ * {@code SQL XML} value when it sends it to the database.
* @param parameterName the name of the parameter
- * @param xmlObject a <code>SQLXML</code> object that maps an <code>SQL XML</code> value
+ * @param xmlObject a {@code SQLXML} object that maps an {@code SQL XML} value
* @throws SQLException if a database access error occurs
* @since 1.6
*/
@@ -4718,8 +4718,8 @@
}
/**
- * Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
- * driver converts this to a SQL <code>ROWID</code> value when it sends it
+ * Sets the designated parameter to the given {@code java.sql.RowId} object. The
+ * driver converts this to a SQL {@code ROWID} value when it sends it
* to the database
*
* @param parameterIndex the first parameter is 1, the second is 2, ...
@@ -4732,9 +4732,9 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to the given <code>java.sql.RowId</code> object. The
- * driver converts this to a SQL <code>ROWID</code> when it sends it to the
+ /**
+ * Sets the designated parameter to the given {@code java.sql.RowId} object. The
+ * driver converts this to a SQL {@code ROWID} when it sends it to the
* database.
*
* @param parameterName the name of the parameter
@@ -4748,18 +4748,18 @@
/**
- * Sets the designated parameter to the given <code>String</code> object.
- * The driver converts this to a SQL <code>NCHAR</code> or
- * <code>NVARCHAR</code> or <code>LONGNVARCHAR</code> value
+ * Sets the designated parameter to the given {@code String} object.
+ * The driver converts this to a SQL {@code NCHAR} or
+ * {@code NVARCHAR} or {@code LONGNVARCHAR} value
* (depending on the argument's
- * size relative to the driver's limits on <code>NVARCHAR</code> values)
+ * size relative to the driver's limits on {@code NVARCHAR} values)
* when it sends it to the database.
*
* @param parameterIndex of the first parameter is 1, the second is 2, ...
* @param value the parameter value
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur ; or if a database access error occurs
+ * error could occur ; or if a database access error occurs
* @since 1.6
*/
public void setNString(int parameterIndex, String value) throws SQLException {
@@ -4768,9 +4768,9 @@
/**
- * Sets the designated parameter in this <code>RowSet</code> object's command
- * to a <code>Reader</code> object. The
- * <code>Reader</code> reads the data till end-of-file is reached. The
+ * Sets the designated parameter in this {@code RowSet} object's command
+ * to a {@code Reader} object. The
+ * {@code Reader} reads the data till end-of-file is reached. The
* driver does the necessary conversion from Java character format to
* the national character set in the database.
@@ -4779,14 +4779,14 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setNCharacterStream</code> which takes a length parameter.
+ * {@code setNCharacterStream} which takes a length parameter.
*
* @param parameterIndex of the first parameter is 1, the second is 2, ...
* @param value the parameter value
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur ; if a database access error occurs; or
- * this method is called on a closed <code>PreparedStatement</code>
+ * error could occur ; if a database access error occurs; or
+ * this method is called on a closed {@code PreparedStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@@ -4795,14 +4795,14 @@
}
/**
- * Sets the designated parameter to a <code>java.sql.NClob</code> object. The object
- * implements the <code>java.sql.NClob</code> interface. This <code>NClob</code>
- * object maps to a SQL <code>NCLOB</code>.
+ * Sets the designated parameter to a {@code java.sql.NClob} object. The object
+ * implements the {@code java.sql.NClob} interface. This {@code NClob}
+ * object maps to a SQL {@code NCLOB}.
* @param parameterName the name of the column to be set
* @param value the parameter value
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur; or if a database access error occurs
+ * error could occur; or if a database access error occurs
* @since 1.6
*/
public void setNClob(String parameterName, NClob value) throws SQLException {
@@ -4810,17 +4810,17 @@
}
- /**
+ /**
* Retrieves the value of the designated column in the current row
- * of this <code>ResultSet</code> object as a
- * <code>java.io.Reader</code> object.
+ * of this {@code ResultSet} object as a
+ * {@code java.io.Reader} object.
* It is intended for use when
- * accessing <code>NCHAR</code>,<code>NVARCHAR</code>
- * and <code>LONGNVARCHAR</code> columns.
- *
- * @return a <code>java.io.Reader</code> object that contains the column
- * value; if the value is SQL <code>NULL</code>, the value returned is
- * <code>null</code> in the Java programming language.
+ * accessing {@code NCHAR},{@code NVARCHAR}
+ * and {@code LONGNVARCHAR} columns.
+ *
+ * @return a {@code java.io.Reader} object that contains the column
+ * value; if the value is SQL {@code NULL}, the value returned is
+ * {@code null} in the Java programming language.
* @param columnIndex the first column is 1, the second is 2, ...
* @exception SQLException if a database access error occurs
* @since 1.6
@@ -4832,16 +4832,16 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>ResultSet</code> object as a
- * <code>java.io.Reader</code> object.
+ * of this {@code ResultSet} object as a
+ * {@code java.io.Reader} object.
* It is intended for use when
- * accessing <code>NCHAR</code>,<code>NVARCHAR</code>
- * and <code>LONGNVARCHAR</code> columns.
+ * accessing {@code NCHAR},{@code NVARCHAR}
+ * and {@code LONGNVARCHAR} columns.
*
* @param columnName the name of the column
- * @return a <code>java.io.Reader</code> object that contains the column
- * value; if the value is SQL <code>NULL</code>, the value returned is
- * <code>null</code> in the Java programming language
+ * @return a {@code java.io.Reader} object that contains the column
+ * value; if the value is SQL {@code NULL}, the value returned is
+ * {@code null} in the Java programming language
* @exception SQLException if a database access error occurs
* @since 1.6
*/
@@ -4850,11 +4850,11 @@
}
/**
- * Updates the designated column with a <code>java.sql.SQLXML</code> value.
+ * Updates the designated column with a {@code java.sql.SQLXML} value.
* The updater
* methods are used to update column values in the current row or the insert
* row. The updater methods do not update the underlying database; instead
- * the <code>updateRow</code> or <code>insertRow</code> methods are called
+ * the {@code updateRow} or {@code insertRow} methods are called
* to update the database.
* @param columnIndex the first column is 1, the second 2, ...
* @param xmlObject the value for the column to be updated
@@ -4866,11 +4866,11 @@
}
/**
- * Updates the designated column with a <code>java.sql.SQLXML</code> value.
+ * Updates the designated column with a {@code java.sql.SQLXML} value.
* The updater
* methods are used to update column values in the current row or the insert
* row. The updater methods do not update the underlying database; instead
- * the <code>updateRow</code> or <code>insertRow</code> methods are called
+ * the {@code updateRow} or {@code insertRow} methods are called
* to update the database.
*
* @param columnName the name of the column
@@ -4884,15 +4884,15 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>ResultSet</code> object as
- * a <code>String</code> in the Java programming language.
+ * of this {@code ResultSet} object as
+ * a {@code String} in the Java programming language.
* It is intended for use when
- * accessing <code>NCHAR</code>,<code>NVARCHAR</code>
- * and <code>LONGNVARCHAR</code> columns.
+ * accessing {@code NCHAR},{@code NVARCHAR}
+ * and {@code LONGNVARCHAR} columns.
*
* @param columnIndex the first column is 1, the second is 2, ...
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @exception SQLException if a database access error occurs
* @since 1.6
*/
@@ -4902,15 +4902,15 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>ResultSet</code> object as
- * a <code>String</code> in the Java programming language.
+ * of this {@code ResultSet} object as
+ * a {@code String} in the Java programming language.
* It is intended for use when
- * accessing <code>NCHAR</code>,<code>NVARCHAR</code>
- * and <code>LONGNVARCHAR</code> columns.
+ * accessing {@code NCHAR},{@code NVARCHAR}
+ * and {@code LONGNVARCHAR} columns.
*
* @param columnName the SQL name of the column
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * value returned is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * value returned is {@code null}
* @exception SQLException if a database access error occurs
* @since 1.6
*/
@@ -4927,9 +4927,9 @@
* the insert row. The updater methods do not update the underlying database;
* instead the updateRow or insertRow methods are called to update the database.
*
- * @param columnIndex - the first column is 1, the second is 2, ...
- * @param x - the new column value
- * @param length - the length of the stream
+ * @param columnIndex the first column is 1, the second is 2, ...
+ * @param x the new column value
+ * @param length the length of the stream
* @exception SQLException if a database access error occurs
* @since 1.6
*/
@@ -4949,9 +4949,9 @@
* the insert row. The updater methods do not update the underlying database;
* instead the updateRow or insertRow methods are called to update the database.
*
- * @param columnName - name of the Column
- * @param x - the new column value
- * @param length - the length of the stream
+ * @param columnName name of the Column
+ * @param x the new column value
+ * @param length the length of the stream
* @exception SQLException if a database access error occurs
* @since 1.6
*/
@@ -4963,26 +4963,27 @@
}
/**
- * Updates the designated column with a character stream value. The
+ * Updates the designated column with a character stream value. The
* driver does the necessary conversion from Java character format to
* the national character set in the database.
* It is intended for use when
- * updating <code>NCHAR</code>,<code>NVARCHAR</code>
- * and <code>LONGNVARCHAR</code> columns.
+ * updating {@code NCHAR},{@code NVARCHAR}
+ * and {@code LONGNVARCHAR} columns.
*
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateNCharacterStream</code> which takes a length parameter.
+ * {@code updateNCharacterStream} which takes a length parameter.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param x the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY} or this
+ * method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @since 1.6
@@ -4997,26 +4998,27 @@
* driver does the necessary conversion from Java character format to
* the national character set in the database.
* It is intended for use when
- * updating <code>NCHAR</code>,<code>NVARCHAR</code>
- * and <code>LONGNVARCHAR</code> columns.
+ * updating {@code NCHAR},{@code NVARCHAR}
+ * and {@code LONGNVARCHAR} columns.
*
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateNCharacterStream</code> which takes a length parameter.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
-bel is the name of the column
- * @param reader the <code>java.io.Reader</code> object containing
+ * {@code updateNCharacterStream} which takes a length parameter.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then the label is the name of the column
+ * @param reader the {@code java.io.Reader} object containing
* the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code> or this method is called on a closed result set
- * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * the result set concurrency is {@code CONCUR_READ_ONLY} or
+ * this method is called on a closed result set
+ * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+ * this method
* @since 1.6
*/
public void updateNCharacterStream(String columnLabel,
@@ -5027,9 +5029,9 @@
/**
* Updates the designated column using the given input stream, which
* will have the specified number of bytes.
- * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+ * When a very large ASCII value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code>. Data will be read from the stream
+ * {@code java.io.InputStream}. Data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from ASCII to the database char format.
*
@@ -5039,16 +5041,16 @@
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param inputStream An object that contains the data to set the parameter
- * value to.
+ * value to.
* @param length the number of bytes in the parameter data.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @since 1.6
@@ -5060,9 +5062,9 @@
/**
* Updates the designated column using the given input stream, which
* will have the specified number of bytes.
- * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+ * When a very large ASCII value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code>. Data will be read from the stream
+ * {@code java.io.InputStream}. Data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from ASCII to the database char format.
*
@@ -5072,18 +5074,20 @@
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified,
+ * then the label is the name of the column.
* @param inputStream An object that contains the data to set the parameter
- * value to.
+ * value to.
* @param length the number of bytes in the parameter data.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateBlob(String columnLabel, InputStream inputStream, long length) throws SQLException {
@@ -5092,9 +5096,9 @@
/**
* Updates the designated column using the given input stream.
- * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+ * When a very large ASCII value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code>. Data will be read from the stream
+ * {@code java.io.InputStream}. Data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from ASCII to the database char format.
*
@@ -5102,23 +5106,23 @@
* Java stream object or your own subclass that implements the
* standard interface.
*
- * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+ * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateBlob</code> which takes a length parameter.
+ * {@code updateBlob} which takes a length parameter.
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param inputStream An object that contains the data to set the parameter
- * value to.
+ * value to.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateBlob(int columnIndex, InputStream inputStream) throws SQLException {
@@ -5127,9 +5131,9 @@
/**
* Updates the designated column using the given input stream.
- * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+ * When a very large ASCII value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code>. Data will be read from the stream
+ * {@code java.io.InputStream}. Data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from ASCII to the database char format.
*
@@ -5138,22 +5142,23 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateBlob</code> which takes a length parameter.
+ * {@code updateBlob} which takes a length parameter.
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
-bel is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then the label
+ * is the name of the column
* @param inputStream An object that contains the data to set the parameter
- * value to.
+ * value to.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateBlob(String columnLabel, InputStream inputStream) throws SQLException {
@@ -5161,11 +5166,11 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object, which is the given number of characters long.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -5175,17 +5180,17 @@
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateClob(int columnIndex, Reader reader, long length) throws SQLException {
@@ -5193,11 +5198,11 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object, which is the given number of characters long.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -5207,17 +5212,18 @@
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then the label is the name of the column
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateClob(String columnLabel, Reader reader, long length) throws SQLException {
@@ -5225,33 +5231,33 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
* <P><B>Note:</B> This stream object can either be a standard
* Java stream object or your own subclass that implements the
* standard interface.
- * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+ * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateClob</code> which takes a length parameter.
+ * {@code updateClob} which takes a length parameter.
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param reader An object that contains the data to set the parameter value to.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateClob(int columnIndex, Reader reader) throws SQLException {
@@ -5259,34 +5265,35 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
* <P><B>Note:</B> This stream object can either be a standard
* Java stream object or your own subclass that implements the
* standard interface.
- * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+ * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateClob</code> which takes a length parameter.
+ * {@code updateClob} which takes a length parameter.
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
-bel is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then the label
+ * is the name of the column
* @param reader An object that contains the data to set the parameter value to.
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateClob(String columnLabel, Reader reader) throws SQLException {
@@ -5294,11 +5301,11 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object, which is the given number of characters long.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -5308,19 +5315,19 @@
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second 2, ...
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur; this method is called on a closed result set,
- * if a database access error occurs or
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+ * error could occur; this method is called on a closed result set,
+ * if a database access error occurs or
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateNClob(int columnIndex, Reader reader, long length) throws SQLException {
@@ -5328,11 +5335,11 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object, which is the given number of characters long.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -5342,19 +5349,20 @@
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then the label is the name of the column
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur; this method is called on a closed result set;
- * if a database access error occurs or
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+ * error could occur; this method is called on a closed result set;
+ * if a database access error occurs or
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateNClob(String columnLabel, Reader reader, long length) throws SQLException {
@@ -5362,11 +5370,11 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -5375,22 +5383,22 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateNClob</code> which takes a length parameter.
+ * {@code updateNClob} which takes a length parameter.
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second 2, ...
* @param reader An object that contains the data to set the parameter value to.
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur; this method is called on a closed result set,
- * if a database access error occurs or
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+ * error could occur; this method is called on a closed result set,
+ * if a database access error occurs or
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateNClob(int columnIndex, Reader reader) throws SQLException {
@@ -5398,11 +5406,11 @@
}
/**
- * Updates the designated column using the given <code>Reader</code>
+ * Updates the designated column using the given {@code Reader}
* object.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -5411,23 +5419,24 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateNClob</code> which takes a length parameter.
+ * {@code updateNClob} which takes a length parameter.
* <p>
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
-bel is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then
+ * the label is the name of the column
* @param reader An object that contains the data to set the parameter value to.
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur; this method is called on a closed result set;
- * if a database access error occurs or
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+ * error could occur; this method is called on a closed result set;
+ * if a database access error occurs or
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateNClob(String columnLabel, Reader reader) throws SQLException {
@@ -5435,22 +5444,22 @@
}
- /**
+ /**
* Updates the designated column with an ascii stream value, which will have
* the specified number of bytes.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param x the new column value
* @param length the length of the stream
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateAsciiStream(int columnIndex,
@@ -5464,17 +5473,17 @@
* the specified number of bytes.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param x the new column value
* @param length the length of the stream
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateBinaryStream(int columnIndex,
@@ -5488,17 +5497,17 @@
* the specified number of bytes.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param x the new column value
* @param length the length of the stream
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateCharacterStream(int columnIndex,
@@ -5512,17 +5521,19 @@
* the specified number of bytes..
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then
+ * the label is the name of the column
* @param x the new column value
* @param length the length of the stream
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateAsciiStream(String columnLabel,
@@ -5535,20 +5546,20 @@
* Updates the designated column with an ascii stream value.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateAsciiStream</code> which takes a length parameter.
+ * {@code updateAsciiStream} which takes a length parameter.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param x the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateAsciiStream(int columnIndex,
@@ -5560,21 +5571,22 @@
* Updates the designated column with an ascii stream value.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateAsciiStream</code> which takes a length parameter.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
-bel is the name of the column
+ * {@code updateAsciiStream} which takes a length parameter.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then the label
+ * is the name of the column
* @param x the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateAsciiStream(String columnLabel,
@@ -5588,15 +5600,17 @@
* the specified number of bytes.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then
+ * the label is the name of the column
* @param x the new column value
* @param length the length of the stream
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @since 1.6
@@ -5611,18 +5625,18 @@
* Updates the designated column with a binary stream value.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateBinaryStream</code> which takes a length parameter.
+ * {@code updateBinaryStream} which takes a length parameter.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param x the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @since 1.6
@@ -5637,19 +5651,20 @@
* Updates the designated column with a binary stream value.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateBinaryStream</code> which takes a length parameter.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
-bel is the name of the column
+ * {@code updateBinaryStream} which takes a length parameter.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then
+ * the label is the name of the column
* @param x the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
* this method
* @since 1.6
@@ -5665,18 +5680,20 @@
* the specified number of bytes.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the label is the name of the column
- * @param reader the <code>java.io.Reader</code> object containing
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then
+ * the label is the name of the column
+ * @param reader the {@code java.io.Reader} object containing
* the new column value
* @param length the length of the stream
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateCharacterStream(String columnLabel,
@@ -5689,20 +5706,20 @@
* Updates the designated column with a character stream value.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateCharacterStream</code> which takes a length parameter.
+ * {@code updateCharacterStream} which takes a length parameter.
*
* @param columnIndex the first column is 1, the second is 2, ...
* @param x the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateCharacterStream(int columnIndex,
@@ -5714,22 +5731,23 @@
* Updates the designated column with a character stream value.
* The updater methods are used to update column values in the
* current row or the insert row. The updater methods do not
- * update the underlying database; instead the <code>updateRow</code> or
- * <code>insertRow</code> methods are called to update the database.
+ * update the underlying database; instead the {@code updateRow} or
+ * {@code insertRow} methods are called to update the database.
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>updateCharacterStream</code> which takes a length parameter.
- *
- * @param columnLabel the label for the column specified with the SQL AS clause. If the SQL AS clause was not specified, then the la
-bel is the name of the column
- * @param reader the <code>java.io.Reader</code> object containing
+ * {@code updateCharacterStream} which takes a length parameter.
+ *
+ * @param columnLabel the label for the column specified with the SQL AS clause.
+ * If the SQL AS clause was not specified, then the label
+ * is the name of the column
+ * @param reader the {@code java.io.Reader} object containing
* the new column value
* @exception SQLException if a database access error occurs,
- * the result set concurrency is <code>CONCUR_READ_ONLY</code>
- * or this method is called on a closed result set
+ * the result set concurrency is {@code CONCUR_READ_ONLY}
+ * or this method is called on a closed result set
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void updateCharacterStream(String columnLabel,
@@ -5738,97 +5756,98 @@
}
- /**
- * Sets the designated parameter to the given <code>java.net.URL</code> value.
- * The driver converts this to an SQL <code>DATALINK</code> value
- * when it sends it to the database.
- *
- * @param parameterIndex the first parameter is 1, the second is 2, ...
- * @param x the <code>java.net.URL</code> object to be set
- * @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>PreparedStatement</code>
- * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
- * @since 1.4
- */
+ /**
+ * Sets the designated parameter to the given {@code java.net.URL} value.
+ * The driver converts this to an SQL {@code DATALINK} value
+ * when it sends it to the database.
+ *
+ * @param parameterIndex the first parameter is 1, the second is 2, ...
+ * @param x the {@code java.net.URL} object to be set
+ * @exception SQLException if a database access error occurs or
+ * this method is called on a closed {@code PreparedStatement}
+ * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
+ * @since 1.4
+ */
public void setURL(int parameterIndex, java.net.URL x) throws SQLException{
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to a <code>Reader</code> object.
- * This method differs from the <code>setCharacterStream (int, Reader)</code> method
- * because it informs the driver that the parameter value should be sent to
- * the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
- * driver may have to do extra work to determine whether the parameter
- * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
- * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
- * it might be more efficient to use a version of
- * <code>setNClob</code> which takes a length parameter.
- *
- * @param parameterIndex index of the first parameter is 1, the second is 2, ...
- * @param reader An object that contains the data to set the parameter value to.
- * @throws SQLException if parameterIndex does not correspond to a parameter
- * marker in the SQL statement;
- * if the driver does not support national character sets;
- * if the driver can detect that a data conversion
- * error could occur; if a database access error occurs or
- * this method is called on a closed <code>PreparedStatement</code>
- * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
- *
- * @since 1.6
- */
+ /**
+ * Sets the designated parameter to a {@code Reader} object.
+ * This method differs from the {@code setCharacterStream (int, Reader)} method
+ * because it informs the driver that the parameter value should be sent to
+ * the server as a {@code NCLOB}. When the {@code setCharacterStream} method is used, the
+ * driver may have to do extra work to determine whether the parameter
+ * data should be sent to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
+ * <P><B>Note:</B> Consult your JDBC driver documentation to determine if
+ * it might be more efficient to use a version of
+ * {@code setNClob} which takes a length parameter.
+ *
+ * @param parameterIndex index of the first parameter is 1, the second is 2, ...
+ * @param reader An object that contains the data to set the parameter value to.
+ * @throws SQLException if parameterIndex does not correspond to a parameter
+ * marker in the SQL statement;
+ * if the driver does not support national character sets;
+ * if the driver can detect that a data conversion
+ * error could occur; if a database access error occurs or
+ * this method is called on a closed {@code PreparedStatement}
+ * @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
+ *
+ * @since 1.6
+ */
public void setNClob(int parameterIndex, Reader reader)
throws SQLException{
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to a <code>Reader</code> object. The <code>reader</code> must contain the number
- * of characters specified by length otherwise a <code>SQLException</code> will be
- * generated when the <code>CallableStatement</code> is executed.
- * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
- * because it informs the driver that the parameter value should be sent to
- * the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
- * driver may have to do extra work to determine whether the parameter
- * data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
- *
- * @param parameterName the name of the parameter to be set
- * @param reader An object that contains the data to set the parameter value to.
- * @param length the number of characters in the parameter data.
- * @throws SQLException if parameterIndex does not correspond to a parameter
- * marker in the SQL statement; if the length specified is less than zero;
- * if the driver does not support national
- * character sets; if the driver can detect that a data conversion
- * error could occur; if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
- * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
- * @since 1.6
- */
- public void setNClob(String parameterName, Reader reader, long length)
+ /**
+ * Sets the designated parameter to a {@code Reader} object.
+ * The {@code reader} must contain the number
+ * of characters specified by length otherwise a {@code SQLException} will be
+ * generated when the {@code CallableStatement} is executed.
+ * This method differs from the {@code setCharacterStream (int, Reader, int)} method
+ * because it informs the driver that the parameter value should be sent to
+ * the server as a {@code NCLOB}. When the {@code setCharacterStream} method is used, the
+ * driver may have to do extra work to determine whether the parameter
+ * data should be send to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
+ *
+ * @param parameterName the name of the parameter to be set
+ * @param reader An object that contains the data to set the parameter value to.
+ * @param length the number of characters in the parameter data.
+ * @throws SQLException if parameterIndex does not correspond to a parameter
+ * marker in the SQL statement; if the length specified is less than zero;
+ * if the driver does not support national
+ * character sets; if the driver can detect that a data conversion
+ * error could occur; if a database access error occurs or
+ * this method is called on a closed {@code CallableStatement}
+ * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+ * this method
+ * @since 1.6
+ */
+ public void setNClob(String parameterName, Reader reader, long length)
throws SQLException{
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
- }
+ }
/**
- * Sets the designated parameter to a <code>Reader</code> object.
- * This method differs from the <code>setCharacterStream (int, Reader)</code> method
+ * Sets the designated parameter to a {@code Reader} object.
+ * This method differs from the {@code setCharacterStream (int, Reader)} method
* because it informs the driver that the parameter value should be sent to
- * the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
+ * the server as a {@code NCLOB}. When the {@code setCharacterStream} method is used, the
* driver may have to do extra work to determine whether the parameter
- * data should be send to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
+ * data should be send to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setNClob</code> which takes a length parameter.
+ * {@code setNClob} which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param reader An object that contains the data to set the parameter value to.
* @throws SQLException if the driver does not support national character sets;
- * if the driver can detect that a data conversion
- * error could occur; if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * if the driver can detect that a data conversion
+ * error could occur; if a database access error occurs or
+ * this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
*
* @since 1.6
@@ -5839,23 +5858,25 @@
}
- /**
- ** of characters specified by length otherwise a <code>SQLException</code> will becontain the number
- * generated when the <code>PreparedStatement</code> is executed.
- * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
+ /**
+ * Sets the designated parameter to a {@code Reader} object. The reader must contain the number
+ * of characters specified by length otherwise a {@code SQLException} will be
+ * generated when the {@code PreparedStatement} is executed.
+ * This method differs from the {@code setCharacterStream (int, Reader, int)} method
* because it informs the driver that the parameter value should be sent to
- * the server as a <code>NCLOB</code>. When the <code>setCharacterStream</code> method is used, the
+ * the server as a {@code NCLOB}. When the {@code setCharacterStream} method is used, the
* driver may have to do extra work to determine whether the parameter
- * data should be sent to the server as a <code>LONGNVARCHAR</code> or a <code>NCLOB</code>
+ * data should be sent to the server as a {@code LONGNVARCHAR} or a {@code NCLOB}
+ *
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @throws SQLException if parameterIndex does not correspond to a parameter
- * marker in the SQL statement; if the length specified is less than zero;
- * if the driver does not support national character sets;
- * if the driver can detect that a data conversion
- * error could occur; if a database access error occurs or
- * this method is called on a closed <code>PreparedStatement</code>
+ * marker in the SQL statement; if the length specified is less than zero;
+ * if the driver does not support national character sets;
+ * if the driver can detect that a data conversion
+ * error could occur; if a database access error occurs or
+ * this method is called on a closed {@code PreparedStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
*
* @since 1.6
@@ -5867,14 +5888,14 @@
/**
- * Sets the designated parameter to a <code>java.sql.NClob</code> object. The driver converts this to
-a
- * SQL <code>NCLOB</code> value when it sends it to the database.
+ * Sets the designated parameter to a {@code java.sql.NClob} object.
+ * The driver converts this to an
+ * SQL {@code NCLOB} value when it sends it to the database.
* @param parameterIndex of the first parameter is 1, the second is 2, ...
* @param value the parameter value
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur ; or if a database access error occurs
+ * error could occur; or if a database access error occurs
* @since 1.6
*/
public void setNClob(int parameterIndex, NClob value) throws SQLException{
@@ -5883,14 +5904,14 @@
/**
- * Sets the designated parameter to the given <code>String</code> object.
- * The driver converts this to a SQL <code>NCHAR</code> or
- * <code>NVARCHAR</code> or <code>LONGNVARCHAR</code>
+ * Sets the designated parameter to the given {@code String} object.
+ * The driver converts this to a SQL {@code NCHAR} or
+ * {@code NVARCHAR} or {@code LONGNVARCHAR}
* @param parameterName the name of the column to be set
* @param value the parameter value
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur; or if a database access error occurs
+ * error could occur; or if a database access error occurs
* @since 1.6
*/
public void setNString(String parameterName, String value)
@@ -5899,8 +5920,8 @@
}
/**
- * Sets the designated parameter to a <code>Reader</code> object. The
- * <code>Reader</code> reads the data till end-of-file is reached. The
+ * Sets the designated parameter to a {@code Reader} object. The
+ * {@code Reader} reads the data till end-of-file is reached. The
* driver does the necessary conversion from Java character format to
* the national character set in the database.
* @param parameterIndex of the first parameter is 1, the second is 2, ...
@@ -5908,7 +5929,7 @@
* @param length the number of characters in the parameter data.
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur ; or if a database access error occurs
+ * error could occur ; or if a database access error occurs
* @since 1.6
*/
public void setNCharacterStream(int parameterIndex, Reader value, long length) throws SQLException{
@@ -5918,8 +5939,8 @@
/**
- * Sets the designated parameter to a <code>Reader</code> object. The
- * <code>Reader</code> reads the data till end-of-file is reached. The
+ * Sets the designated parameter to a {@code Reader} object. The
+ * {@code Reader} reads the data till end-of-file is reached. The
* driver does the necessary conversion from Java character format to
* the national character set in the database.
* @param parameterName the name of the column to be set
@@ -5935,9 +5956,9 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to a <code>Reader</code> object. The
- * <code>Reader</code> reads the data till end-of-file is reached. The
+ /**
+ * Sets the designated parameter to a {@code Reader} object. The
+ * {@code Reader} reads the data till end-of-file is reached. The
* driver does the necessary conversion from Java character format to
* the national character set in the database.
@@ -5946,14 +5967,14 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setNCharacterStream</code> which takes a length parameter.
+ * {@code setNCharacterStream} which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param value the parameter value
* @throws SQLException if the driver does not support national
* character sets; if the driver can detect that a data conversion
- * error could occur ; if a database access error occurs; or
- * this method is called on a closed <code>CallableStatement</code>
+ * error could occur ; if a database access error occurs; or
+ * this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@@ -5962,23 +5983,23 @@
}
/**
- * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value,
- * using the given <code>Calendar</code> object. The driver uses
- * the <code>Calendar</code> object to construct an SQL <code>TIMESTAMP</code> value,
+ * Sets the designated parameter to the given {@code java.sql.Timestamp} value,
+ * using the given {@code Calendar} object. The driver uses
+ * the {@code Calendar} object to construct an SQL {@code TIMESTAMP} value,
* which the driver then sends to the database. With a
- * a <code>Calendar</code> object, the driver can calculate the timestamp
+ * a {@code Calendar} object, the driver can calculate the timestamp
* taking into account a custom timezone. If no
- * <code>Calendar</code> object is specified, the driver uses the default
+ * {@code Calendar} object is specified, the driver uses the default
* timezone, which is that of the virtual machine running the application.
*
* @param parameterName the name of the parameter
* @param x the parameter value
- * @param cal the <code>Calendar</code> object the driver will use
- * to construct the timestamp
+ * @param cal the {@code Calendar} object the driver will use
+ * to construct the timestamp
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getTimestamp
* @since 1.4
*/
@@ -5987,28 +6008,29 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to a <code>Reader</code> object. The <code>reader</code> must contain the number
- * of characters specified by length otherwise a <code>SQLException</code> will be
- * generated when the <code>CallableStatement</code> is executed.
- * This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
- * because it informs the driver that the parameter value should be sent to
- * the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
- * driver may have to do extra work to determine whether the parameter
- * data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
- * @param parameterName the name of the parameter to be set
- * @param reader An object that contains the data to set the parameter value to.
- * @param length the number of characters in the parameter data.
- * @throws SQLException if parameterIndex does not correspond to a parameter
- * marker in the SQL statement; if the length specified is less than zero;
- * a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
- * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
- *
- * @since 1.6
- */
- public void setClob(String parameterName, Reader reader, long length)
+ /**
+ * Sets the designated parameter to a {@code Reader} object. The {@code reader} must contain the number
+ * of characters specified by length otherwise a {@code SQLException} will be
+ * generated when the {@code CallableStatement} is executed.
+ * This method differs from the {@code setCharacterStream (int, Reader, int)} method
+ * because it informs the driver that the parameter value should be sent to
+ * the server as a {@code CLOB}. When the {@code setCharacterStream} method is used, the
+ * driver may have to do extra work to determine whether the parameter
+ * data should be send to the server as a {@code LONGVARCHAR} or a {@code CLOB}
+ *
+ * @param parameterName the name of the parameter to be set
+ * @param reader An object that contains the data to set the parameter value to.
+ * @param length the number of characters in the parameter data.
+ * @throws SQLException if parameterIndex does not correspond to a parameter
+ * marker in the SQL statement; if the length specified is less than zero;
+ * a database access error occurs or
+ * this method is called on a closed {@code CallableStatement}
+ * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+ * this method
+ *
+ * @since 1.6
+ */
+ public void setClob(String parameterName, Reader reader, long length)
throws SQLException{
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
@@ -6016,16 +6038,16 @@
/**
- * Sets the designated parameter to the given <code>java.sql.Clob</code> object.
- * The driver converts this to an SQL <code>CLOB</code> value when it
+ * Sets the designated parameter to the given {@code java.sql.Clob} object.
+ * The driver converts this to an SQL {@code CLOB} value when it
* sends it to the database.
*
* @param parameterName the name of the parameter
- * @param x a <code>Clob</code> object that maps an SQL <code>CLOB</code> value
+ * @param x a {@code Clob} object that maps an SQL {@code CLOB} value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void setClob (String parameterName, Clob x) throws SQLException{
@@ -6033,21 +6055,21 @@
}
/**
- * Sets the designated parameter to a <code>Reader</code> object.
- * This method differs from the <code>setCharacterStream (int, Reader)</code> method
+ * Sets the designated parameter to a {@code Reader} object.
+ * This method differs from the {@code setCharacterStream (int, Reader)} method
* because it informs the driver that the parameter value should be sent to
- * the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
+ * the server as a {@code CLOB}. When the {@code setCharacterStream} method is used, the
* driver may have to do extra work to determine whether the parameter
- * data should be send to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
+ * data should be send to the server as a {@code LONGVARCHAR} or a {@code CLOB}
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setClob</code> which takes a length parameter.
+ * {@code setClob} which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param reader An object that contains the data to set the parameter value to.
* @throws SQLException if a database access error occurs or this method is called on
- * a closed <code>CallableStatement</code>
+ * a closed {@code CallableStatement}
*
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
@@ -6058,19 +6080,19 @@
}
- /**
- * Sets the designated parameter to the given <code>java.sql.Date</code> value
+ /**
+ * Sets the designated parameter to the given {@code java.sql.Date} value
* using the default time zone of the virtual machine that is running
* the application.
* The driver converts this
- * to an SQL <code>DATE</code> value when it sends it to the database.
+ * to an SQL {@code DATE} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getDate
* @since 1.4
*/
@@ -6080,23 +6102,23 @@
}
/**
- * Sets the designated parameter to the given <code>java.sql.Date</code> value,
- * using the given <code>Calendar</code> object. The driver uses
- * the <code>Calendar</code> object to construct an SQL <code>DATE</code> value,
+ * Sets the designated parameter to the given {@code java.sql.Date} value,
+ * using the given {@code Calendar} object. The driver uses
+ * the {@code Calendar} object to construct an SQL {@code DATE} value,
* which the driver then sends to the database. With a
- * a <code>Calendar</code> object, the driver can calculate the date
+ * a {@code Calendar} object, the driver can calculate the date
* taking into account a custom timezone. If no
- * <code>Calendar</code> object is specified, the driver uses the default
+ * {@code Calendar} object is specified, the driver uses the default
* timezone, which is that of the virtual machine running the application.
*
* @param parameterName the name of the parameter
* @param x the parameter value
- * @param cal the <code>Calendar</code> object the driver will use
+ * @param cal the {@code Calendar} object the driver will use
* to construct the date
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getDate
* @since 1.4
*/
@@ -6107,16 +6129,16 @@
/**
- * Sets the designated parameter to the given <code>java.sql.Time</code> value.
+ * Sets the designated parameter to the given {@code java.sql.Time} value.
* The driver converts this
- * to an SQL <code>TIME</code> value when it sends it to the database.
+ * to an SQL {@code TIME} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getTime
* @since 1.4
*/
@@ -6126,23 +6148,23 @@
}
/**
- * Sets the designated parameter to the given <code>java.sql.Time</code> value,
- * using the given <code>Calendar</code> object. The driver uses
- * the <code>Calendar</code> object to construct an SQL <code>TIME</code> value,
+ * Sets the designated parameter to the given {@code java.sql.Time} value,
+ * using the given {@code Calendar} object. The driver uses
+ * the {@code Calendar} object to construct an SQL {@code TIME} value,
* which the driver then sends to the database. With a
- * a <code>Calendar</code> object, the driver can calculate the time
+ * a {@code Calendar} object, the driver can calculate the time
* taking into account a custom timezone. If no
- * <code>Calendar</code> object is specified, the driver uses the default
+ * {@code Calendar} object is specified, the driver uses the default
* timezone, which is that of the virtual machine running the application.
*
* @param parameterName the name of the parameter
* @param x the parameter value
- * @param cal the <code>Calendar</code> object the driver will use
+ * @param cal the {@code Calendar} object the driver will use
* to construct the time
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getTime
* @since 1.4
*/
@@ -6152,22 +6174,22 @@
}
/**
- * Sets the designated parameter to a <code>Reader</code> object.
- * This method differs from the <code>setCharacterStream (int, Reader)</code> method
+ * Sets the designated parameter to a {@code Reader} object.
+ * This method differs from the {@code setCharacterStream (int, Reader)} method
* because it informs the driver that the parameter value should be sent to
- * the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
+ * the server as a {@code CLOB}. When the {@code setCharacterStream} method is used, the
* driver may have to do extra work to determine whether the parameter
- * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
+ * data should be sent to the server as a {@code LONGVARCHAR} or a {@code CLOB}
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setClob</code> which takes a length parameter.
+ * {@code setClob} which takes a length parameter.
*
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
* @param reader An object that contains the data to set the parameter value to.
* @throws SQLException if a database access error occurs, this method is called on
- * a closed <code>PreparedStatement</code>or if parameterIndex does not correspond to a parameter
- * marker in the SQL statement
+ * a closed {@code PreparedStatement}or if parameterIndex does not correspond to a parameter
+ * marker in the SQL statement
*
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
@@ -6178,20 +6200,20 @@
}
- /**
- * Sets the designated parameter to a <code>Reader</code> object. The reader must contain the number
- * of characters specified by length otherwise a <code>SQLException</code> will be
- * generated when the <code>PreparedStatement</code> is executed.
- *This method differs from the <code>setCharacterStream (int, Reader, int)</code> method
+ /**
+ * Sets the designated parameter to a {@code Reader} object. The reader must contain the number
+ * of characters specified by length otherwise a {@code SQLException} will be
+ * generated when the {@code PreparedStatement} is executed.
+ * This method differs from the {@code setCharacterStream (int, Reader, int)} method
* because it informs the driver that the parameter value should be sent to
- * the server as a <code>CLOB</code>. When the <code>setCharacterStream</code> method is used, the
+ * the server as a {@code CLOB}. When the {@code setCharacterStream} method is used, the
* driver may have to do extra work to determine whether the parameter
- * data should be sent to the server as a <code>LONGVARCHAR</code> or a <code>CLOB</code>
+ * data should be sent to the server as a {@code LONGVARCHAR} or a {@code CLOB}
* @param parameterIndex index of the first parameter is 1, the second is 2, ...
* @param reader An object that contains the data to set the parameter value to.
* @param length the number of characters in the parameter data.
* @throws SQLException if a database access error occurs, this method is called on
- * a closed <code>PreparedStatement</code>, if parameterIndex does not correspond to a parameter
+ * a closed {@code PreparedStatement}, if parameterIndex does not correspond to a parameter
* marker in the SQL statement, or if the length specified is less than zero.
*
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
@@ -6203,26 +6225,27 @@
}
- /**
- * Sets the designated parameter to a <code>InputStream</code> object. The inputstream must contain the number
- * of characters specified by length otherwise a <code>SQLException</code> will be
- * generated when the <code>PreparedStatement</code> is executed.
- * This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
+ /**
+ * Sets the designated parameter to a {@code InputStream} object. The inputstream must contain the number
+ * of characters specified by length otherwise a {@code SQLException} will be
+ * generated when the {@code PreparedStatement} is executed.
+ * This method differs from the {@code setBinaryStream (int, InputStream, int)}
* method because it informs the driver that the parameter value should be
- * sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
+ * sent to the server as a {@code BLOB}. When the {@code setBinaryStream} method is used,
* the driver may have to do extra work to determine whether the parameter
- * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
+ * data should be sent to the server as a {@code LONGVARBINARY} or a {@code BLOB}
+ *
* @param parameterIndex index of the first parameter is 1,
- * the second is 2, ...
+ * the second is 2, ...
* @param inputStream An object that contains the data to set the parameter
- * value to.
+ * value to.
* @param length the number of bytes in the parameter data.
* @throws SQLException if a database access error occurs,
- * this method is called on a closed <code>PreparedStatement</code>,
- * if parameterIndex does not correspond
- * to a parameter marker in the SQL statement, if the length specified
- * is less than zero or if the number of bytes in the inputstream does not match
- * the specified length.
+ * this method is called on a closed {@code PreparedStatement},
+ * if parameterIndex does not correspond
+ * to a parameter marker in the SQL statement, if the length specified
+ * is less than zero or if the number of bytes in the inputstream does not match
+ * the specified length.
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
*
* @since 1.6
@@ -6233,28 +6256,27 @@
}
/**
- * Sets the designated parameter to a <code>InputStream</code> object.
- * This method differs from the <code>setBinaryStream (int, InputStream)</code>
- * This method differs from the <code>setBinaryStream (int, InputStream)</code>
+ * Sets the designated parameter to a {@code InputStream} object.
+ * This method differs from the {@code setBinaryStream (int, InputStream)}
+ * This method differs from the {@code setBinaryStream (int, InputStream)}
* method because it informs the driver that the parameter value should be
- * sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
+ * sent to the server as a {@code BLOB}. When the {@code setBinaryStream} method is used,
* the driver may have to do extra work to determine whether the parameter
- * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
+ * data should be sent to the server as a {@code LONGVARBINARY} or a {@code BLOB}
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setBlob</code> which takes a length parameter.
+ * {@code setBlob} which takes a length parameter.
*
* @param parameterIndex index of the first parameter is 1,
- * the second is 2, ...
-
-
+ * the second is 2, ...
+ *
* @param inputStream An object that contains the data to set the parameter
- * value to.
+ * value to.
* @throws SQLException if a database access error occurs,
- * this method is called on a closed <code>PreparedStatement</code> or
- * if parameterIndex does not correspond
- * to a parameter marker in the SQL statement,
+ * this method is called on a closed {@code PreparedStatement} or
+ * if parameterIndex does not correspond
+ * to a parameter marker in the SQL statement,
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
*
* @since 1.6
@@ -6264,72 +6286,72 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to a <code>InputStream</code> object. The <code>inputstream</code> must contain the number
- * of characters specified by length, otherwise a <code>SQLException</code> will be
- * generated when the <code>CallableStatement</code> is executed.
- * This method differs from the <code>setBinaryStream (int, InputStream, int)</code>
- * method because it informs the driver that the parameter value should be
- * sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
- * the driver may have to do extra work to determine whether the parameter
- * data should be sent to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
- *
- * @param parameterName the name of the parameter to be set
- * the second is 2, ...
- *
- * @param inputStream An object that contains the data to set the parameter
- * value to.
- * @param length the number of bytes in the parameter data.
- * @throws SQLException if parameterIndex does not correspond
- * to a parameter marker in the SQL statement, or if the length specified
- * is less than zero; if the number of bytes in the inputstream does not match
- * the specified length; if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
- * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
- *
- * @since 1.6
- */
- public void setBlob(String parameterName, InputStream inputStream, long length)
+ /**
+ * Sets the designated parameter to a {@code InputStream} object. The {@code inputstream} must contain the number
+ * of characters specified by length, otherwise a {@code SQLException} will be
+ * generated when the {@code CallableStatement} is executed.
+ * This method differs from the {@code setBinaryStream (int, InputStream, int)}
+ * method because it informs the driver that the parameter value should be
+ * sent to the server as a {@code BLOB}. When the {@code setBinaryStream} method is used,
+ * the driver may have to do extra work to determine whether the parameter
+ * data should be sent to the server as a {@code LONGVARBINARY} or a {@code BLOB}
+ *
+ * @param parameterName the name of the parameter to be set
+ * the second is 2, ...
+ *
+ * @param inputStream An object that contains the data to set the parameter
+ * value to.
+ * @param length the number of bytes in the parameter data.
+ * @throws SQLException if parameterIndex does not correspond
+ * to a parameter marker in the SQL statement, or if the length specified
+ * is less than zero; if the number of bytes in the inputstream does not match
+ * the specified length; if a database access error occurs or
+ * this method is called on a closed {@code CallableStatement}
+ * @exception SQLFeatureNotSupportedException if the JDBC driver does not support
+ * this method
+ *
+ * @since 1.6
+ */
+ public void setBlob(String parameterName, InputStream inputStream, long length)
throws SQLException{
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to the given <code>java.sql.Blob</code> object.
- * The driver converts this to an SQL <code>BLOB</code> value when it
+ /**
+ * Sets the designated parameter to the given {@code java.sql.Blob} object.
+ * The driver converts this to an SQL {@code BLOB} value when it
* sends it to the database.
*
* @param parameterName the name of the parameter
- * @param x a <code>Blob</code> object that maps an SQL <code>BLOB</code> value
+ * @param x a {@code Blob} object that maps an SQL {@code BLOB} value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.6
*/
public void setBlob (String parameterName, Blob x) throws SQLException{
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to a <code>InputStream</code> object.
- * This method differs from the <code>setBinaryStream (int, InputStream)</code>
+ /**
+ * Sets the designated parameter to a {@code InputStream} object.
+ * This method differs from the {@code setBinaryStream (int, InputStream)}
* method because it informs the driver that the parameter value should be
- * sent to the server as a <code>BLOB</code>. When the <code>setBinaryStream</code> method is used,
+ * sent to the server as a {@code BLOB}. When the {@code setBinaryStream} method is used,
* the driver may have to do extra work to determine whether the parameter
- * data should be send to the server as a <code>LONGVARBINARY</code> or a <code>BLOB</code>
+ * data should be send to the server as a {@code LONGVARBINARY} or a {@code BLOB}
*
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setBlob</code> which takes a length parameter.
+ * {@code setBlob} which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param inputStream An object that contains the data to set the parameter
- * value to.
+ * value to.
* @throws SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
*
* @since 1.6
@@ -6339,22 +6361,22 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
+ /**
* Sets the value of the designated parameter with the given object. The second
* argument must be an object type; for integral values, the
- * <code>java.lang</code> equivalent objects should be used.
+ * {@code java.lang} equivalent objects should be used.
*
* <p>The given Java object will be converted to the given targetSqlType
* before being sent to the database.
*
* If the object has a custom mapping (is of a class implementing the
- * interface <code>SQLData</code>),
- * the JDBC driver should call the method <code>SQLData.writeSQL</code> to write it
+ * interface {@code SQLData}),
+ * the JDBC driver should call the method {@code SQLData.writeSQL} to write it
* to the SQL data stream.
* If, on the other hand, the object is of a class implementing
- * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>, <code>NClob</code>,
- * <code>Struct</code>, <code>java.net.URL</code>,
- * or <code>Array</code>, the driver should pass it to the database as a
+ * {@code Ref}, {@code Blob}, {@code Clob}, {@code NClob},
+ * {@code Struct}, {@code java.net.URL},
+ * or {@code Array}, the driver should pass it to the database as a
* value of the corresponding SQL type.
* <P>
* Note that this method may be used to pass datatabase-
@@ -6365,17 +6387,17 @@
* @param targetSqlType the SQL type (as defined in java.sql.Types) to be
* sent to the database. The scale argument may further qualify this type.
* @param scale for java.sql.Types.DECIMAL or java.sql.Types.NUMERIC types,
- * this is the number of digits after the decimal point. For all other
- * types, this value will be ignored.
+ * this is the number of digits after the decimal point. For all other
+ * types, this value will be ignored.
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
- * @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
- * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
- * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
- * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
- * <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
- * or <code>STRUCT</code> data type and the JDBC driver does not support
- * this data type
+ * this method is called on a closed {@code CallableStatement}
+ * @exception SQLFeatureNotSupportedException if {@code targetSqlType} is
+ * an {@code ARRAY, BLOB, CLOB,
+ * DATALINK, JAVA_OBJECT, NCHAR,
+ * NCLOB, NVARCHAR, LONGNVARCHAR,
+ * REF, ROWID, SQLXML}
+ * or {@code STRUCT} data type and the JDBC driver does not support
+ * this data type
* @see Types
* @see #getObject
* @since 1.4
@@ -6387,7 +6409,7 @@
/**
* Sets the value of the designated parameter with the given object.
- * This method is like the method <code>setObject</code>
+ * This method is like the method {@code setObject}
* above, except that it assumes a scale of zero.
*
* @param parameterName the name of the parameter
@@ -6395,14 +6417,14 @@
* @param targetSqlType the SQL type (as defined in java.sql.Types) to be
* sent to the database
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
- * @exception SQLFeatureNotSupportedException if <code>targetSqlType</code> is
- * a <code>ARRAY</code>, <code>BLOB</code>, <code>CLOB</code>,
- * <code>DATALINK</code>, <code>JAVA_OBJECT</code>, <code>NCHAR</code>,
- * <code>NCLOB</code>, <code>NVARCHAR</code>, <code>LONGNVARCHAR</code>,
- * <code>REF</code>, <code>ROWID</code>, <code>SQLXML</code>
- * or <code>STRUCT</code> data type and the JDBC driver does not support
- * this data type
+ * this method is called on a closed {@code CallableStatement}
+ * @exception SQLFeatureNotSupportedException if {@code targetSqlType} is
+ * an {@code ARRAY, BLOB, CLOB,
+ * DATALINK, JAVA_OBJECT, NCHAR,
+ * NCLOB, NVARCHAR, LONGNVARCHAR,
+ * REF, ROWID, SQLXML}
+ * or {@code STRUCT} data type and the JDBC driver does not support
+ * this data type
* @see #getObject
* @since 1.4
*/
@@ -6411,13 +6433,13 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
+ /**
* Sets the value of the designated parameter with the given object.
- * The second parameter must be of type <code>Object</code>; therefore, the
- * <code>java.lang</code> equivalent objects should be used for built-in types.
+ * The second parameter must be of type {@code Object}; therefore, the
+ * {@code java.lang} equivalent objects should be used for built-in types.
*
* <p>The JDBC specification specifies a standard mapping from
- * Java <code>Object</code> types to SQL types. The given argument
+ * Java {@code Object} types to SQL types. The given argument
* will be converted to the corresponding SQL type before being
* sent to the database.
*
@@ -6425,13 +6447,13 @@
* specific abstract data types, by using a driver-specific Java
* type.
*
- * If the object is of a class implementing the interface <code>SQLData</code>,
- * the JDBC driver should call the method <code>SQLData.writeSQL</code>
+ * If the object is of a class implementing the interface {@code SQLData},
+ * the JDBC driver should call the method {@code SQLData.writeSQL}
* to write it to the SQL data stream.
* If, on the other hand, the object is of a class implementing
- * <code>Ref</code>, <code>Blob</code>, <code>Clob</code>, <code>NClob</code>,
- * <code>Struct</code>, <code>java.net.URL</code>,
- * or <code>Array</code>, the driver should pass it to the database as a
+ * {@code Ref}, {@code Blob}, {@code Clob}, {@code NClob},
+ * {@code Struct}, {@code java.net.URL},
+ * or {@code Array}, the driver should pass it to the database as a
* value of the corresponding SQL type.
* <P>
* This method throws an exception if there is an ambiguity, for example, if the
@@ -6440,10 +6462,10 @@
* @param parameterName the name of the parameter
* @param x the object containing the input parameter value
* @exception SQLException if a database access error occurs,
- * this method is called on a closed <code>CallableStatement</code> or if the given
- * <code>Object</code> parameter is ambiguous
+ * this method is called on a closed {@code CallableStatement} or if the given
+ * {@code Object} parameter is ambiguous
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getObject
* @since 1.4
*/
@@ -6454,9 +6476,9 @@
/**
* Sets the designated parameter to the given input stream, which will have
* the specified number of bytes.
- * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+ * When a very large ASCII value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code>. Data will be read from the stream
+ * {@code java.io.InputStream}. Data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from ASCII to the database char format.
*
@@ -6468,9 +6490,9 @@
* @param x the Java input stream that contains the ASCII parameter value
* @param length the number of bytes in the stream
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.4
*/
public void setAsciiStream(String parameterName, java.io.InputStream x, int length)
@@ -6482,9 +6504,9 @@
/**
* Sets the designated parameter to the given input stream, which will have
* the specified number of bytes.
- * When a very large binary value is input to a <code>LONGVARBINARY</code>
+ * When a very large binary value is input to a {@code LONGVARBINARY}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code> object. The data will be read from the stream
+ * {@code java.io.InputStream} object. The data will be read from the stream
* as needed until end-of-file is reached.
*
* <P><B>Note:</B> This stream object can either be a standard
@@ -6495,9 +6517,9 @@
* @param x the java input stream which contains the binary parameter value
* @param length the number of bytes in the stream
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.4
*/
public void setBinaryStream(String parameterName, java.io.InputStream x,
@@ -6506,11 +6528,11 @@
}
/**
- * Sets the designated parameter to the given <code>Reader</code>
+ * Sets the designated parameter to the given {@code Reader}
* object, which is the given number of characters long.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -6519,13 +6541,13 @@
* standard interface.
*
* @param parameterName the name of the parameter
- * @param reader the <code>java.io.Reader</code> object that
+ * @param reader the {@code java.io.Reader} object that
* contains the UNICODE data used as the designated parameter
* @param length the number of characters in the stream
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.4
*/
public void setCharacterStream(String parameterName,
@@ -6536,9 +6558,9 @@
/**
* Sets the designated parameter to the given input stream.
- * When a very large ASCII value is input to a <code>LONGVARCHAR</code>
+ * When a very large ASCII value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code>. Data will be read from the stream
+ * {@code java.io.InputStream}. Data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from ASCII to the database char format.
*
@@ -6547,15 +6569,15 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setAsciiStream</code> which takes a length parameter.
+ * {@code setAsciiStream} which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param x the Java input stream that contains the ASCII parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
- * @since 1.6
- */
+ * @since 1.6
+ */
public void setAsciiStream(String parameterName, java.io.InputStream x)
throws SQLException{
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
@@ -6564,9 +6586,9 @@
/**
* Sets the designated parameter to the given input stream.
- * When a very large binary value is input to a <code>LONGVARBINARY</code>
+ * When a very large binary value is input to a {@code LONGVARBINARY}
* parameter, it may be more practical to send it via a
- * <code>java.io.InputStream</code> object. The data will be read from the
+ * {@code java.io.InputStream} object. The data will be read from the
* stream as needed until end-of-file is reached.
*
* <P><B>Note:</B> This stream object can either be a standard
@@ -6574,12 +6596,12 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setBinaryStream</code> which takes a length parameter.
+ * {@code setBinaryStream} which takes a length parameter.
*
* @param parameterName the name of the parameter
* @param x the java input stream which contains the binary parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@@ -6589,11 +6611,11 @@
}
/**
- * Sets the designated parameter to the given <code>Reader</code>
+ * Sets the designated parameter to the given {@code Reader}
* object.
- * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+ * When a very large UNICODE value is input to a {@code LONGVARCHAR}
* parameter, it may be more practical to send it via a
- * <code>java.io.Reader</code> object. The data will be read from the stream
+ * {@code java.io.Reader} object. The data will be read from the stream
* as needed until end-of-file is reached. The JDBC driver will
* do any necessary conversion from UNICODE to the database char format.
*
@@ -6602,13 +6624,13 @@
* standard interface.
* <P><B>Note:</B> Consult your JDBC driver documentation to determine if
* it might be more efficient to use a version of
- * <code>setCharacterStream</code> which takes a length parameter.
+ * {@code setCharacterStream} which takes a length parameter.
*
* @param parameterName the name of the parameter
- * @param reader the <code>java.io.Reader</code> object that contains the
+ * @param reader the {@code java.io.Reader} object that contains the
* Unicode data
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @throws SQLFeatureNotSupportedException if the JDBC driver does not support this method
* @since 1.6
*/
@@ -6619,16 +6641,16 @@
/**
* Sets the designated parameter to the given
- * <code>java.math.BigDecimal</code> value.
- * The driver converts this to an SQL <code>NUMERIC</code> value when
+ * {@code java.math.BigDecimal} value.
+ * The driver converts this to an SQL {@code NUMERIC} value when
* it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getBigDecimal
* @since 1.4
*/
@@ -6636,20 +6658,20 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to the given Java <code>String</code> value.
+ /**
+ * Sets the designated parameter to the given Java {@code String} value.
* The driver converts this
- * to an SQL <code>VARCHAR</code> or <code>LONGVARCHAR</code> value
+ * to an SQL {@code VARCHAR} or {@code LONGVARCHAR} value
* (depending on the argument's
- * size relative to the driver's limits on <code>VARCHAR</code> values)
+ * size relative to the driver's limits on {@code VARCHAR} values)
* when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getString
* @since 1.4
*/
@@ -6659,19 +6681,19 @@
- /**
+ /**
* Sets the designated parameter to the given Java array of bytes.
- * The driver converts this to an SQL <code>VARBINARY</code> or
- * <code>LONGVARBINARY</code> (depending on the argument's size relative
- * to the driver's limits on <code>VARBINARY</code> values) when it sends
+ * The driver converts this to an SQL {@code VARBINARY} or
+ * {@code LONGVARBINARY} (depending on the argument's size relative
+ * to the driver's limits on {@code VARBINARY} values) when it sends
* it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getBytes
* @since 1.4
*/
@@ -6680,17 +6702,17 @@
}
/**
- * Sets the designated parameter to the given <code>java.sql.Timestamp</code> value.
+ * Sets the designated parameter to the given {@code java.sql.Timestamp} value.
* The driver
- * converts this to an SQL <code>TIMESTAMP</code> value when it sends it to the
+ * converts this to an SQL {@code TIMESTAMP} value when it sends it to the
* database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getTimestamp
* @since 1.4
*/
@@ -6700,16 +6722,16 @@
}
/**
- * Sets the designated parameter to SQL <code>NULL</code>.
+ * Sets the designated parameter to SQL {@code NULL}.
*
* <P><B>Note:</B> You must specify the parameter's SQL type.
*
* @param parameterName the name of the parameter
- * @param sqlType the SQL type code defined in <code>java.sql.Types</code>
+ * @param sqlType the SQL type code defined in {@code java.sql.Types}
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.4
*/
public void setNull(String parameterName, int sqlType) throws SQLException {
@@ -6717,8 +6739,8 @@
}
/**
- * Sets the designated parameter to SQL <code>NULL</code>.
- * This version of the method <code>setNull</code> should
+ * Sets the designated parameter to SQL {@code NULL}.
+ * This version of the method {@code setNull} should
* be used for user-defined types and REF type parameters. Examples
* of user-defined types include: STRUCT, DISTINCT, JAVA_OBJECT, and
* named array types.
@@ -6738,14 +6760,14 @@
*
*
* @param parameterName the name of the parameter
- * @param sqlType a value from <code>java.sql.Types</code>
+ * @param sqlType a value from {@code java.sql.Types}
* @param typeName the fully-qualified name of an SQL user-defined type;
* ignored if the parameter is not a user-defined type or
- * SQL <code>REF</code> value
+ * SQL {@code REF} value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.4
*/
public void setNull (String parameterName, int sqlType, String typeName)
@@ -6754,17 +6776,17 @@
}
/**
- * Sets the designated parameter to the given Java <code>boolean</code> value.
+ * Sets the designated parameter to the given Java {@code boolean} value.
* The driver converts this
- * to an SQL <code>BIT</code> or <code>BOOLEAN</code> value when it sends it to the database.
+ * to an SQL {@code BIT} or {@code BOOLEAN} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @see #getBoolean
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @since 1.4
*/
public void setBoolean(String parameterName, boolean x) throws SQLException{
@@ -6774,16 +6796,16 @@
/**
- * Sets the designated parameter to the given Java <code>byte</code> value.
+ * Sets the designated parameter to the given Java {@code byte} value.
* The driver converts this
- * to an SQL <code>TINYINT</code> value when it sends it to the database.
+ * to an SQL {@code TINYINT} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getByte
* @since 1.4
*/
@@ -6793,16 +6815,16 @@
/**
- * Sets the designated parameter to the given Java <code>short</code> value.
+ * Sets the designated parameter to the given Java {@code short} value.
* The driver converts this
- * to an SQL <code>SMALLINT</code> value when it sends it to the database.
+ * to an SQL {@code SMALLINT} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getShort
* @since 1.4
*/
@@ -6812,16 +6834,16 @@
/**
- * Sets the designated parameter to the given Java <code>int</code> value.
+ * Sets the designated parameter to the given Java {@code int} value.
* The driver converts this
- * to an SQL <code>INTEGER</code> value when it sends it to the database.
+ * to an SQL {@code INTEGER} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getInt
* @since 1.4
*/
@@ -6829,17 +6851,17 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to the given Java <code>long</code> value.
+ /**
+ * Sets the designated parameter to the given Java {@code long} value.
* The driver converts this
- * to an SQL <code>BIGINT</code> value when it sends it to the database.
+ * to an SQL {@code BIGINT} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getLong
* @since 1.4
*/
@@ -6848,17 +6870,17 @@
}
- /**
- * Sets the designated parameter to the given Java <code>float</code> value.
+ /**
+ * Sets the designated parameter to the given Java {@code float} value.
* The driver converts this
- * to an SQL <code>FLOAT</code> value when it sends it to the database.
+ * to an SQL {@code FLOAT} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getFloat
* @since 1.4
*/
@@ -6866,17 +6888,17 @@
throw new SQLFeatureNotSupportedException(resBundle.handleGetObject("jdbcrowsetimpl.featnotsupp").toString());
}
- /**
- * Sets the designated parameter to the given Java <code>double</code> value.
+ /**
+ * Sets the designated parameter to the given Java {@code double} value.
* The driver converts this
- * to an SQL <code>DOUBLE</code> value when it sends it to the database.
+ * to an SQL {@code DOUBLE} value when it sends it to the database.
*
* @param parameterName the name of the parameter
* @param x the parameter value
* @exception SQLException if a database access error occurs or
- * this method is called on a closed <code>CallableStatement</code>
+ * this method is called on a closed {@code CallableStatement}
* @exception SQLFeatureNotSupportedException if the JDBC driver does not support
- * this method
+ * this method
* @see #getDouble
* @since 1.4
*/
@@ -6887,7 +6909,6 @@
/**
* This method re populates the resBundle
* during the deserialization process
- *
*/
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
// Default state initialization happens here
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Thu Jun 25 07:13:27 2015 +0000
@@ -43,22 +43,22 @@
/**
- * The facility called on internally by the <code>RIOptimisticProvider</code> implementation to
+ * The facility called on internally by the {@code RIOptimisticProvider} implementation to
* propagate changes back to the data source from which the rowset got its data.
* <P>
- * A <code>CachedRowSetWriter</code> object, called a writer, has the public
- * method <code>writeData</code> for writing modified data to the underlying data source.
+ * A {@code CachedRowSetWriter} object, called a writer, has the public
+ * method {@code writeData} for writing modified data to the underlying data source.
* This method is invoked by the rowset internally and is never invoked directly by an application.
* A writer also has public methods for setting and getting
- * the <code>CachedRowSetReader</code> object, called a reader, that is associated
+ * the {@code CachedRowSetReader} object, called a reader, that is associated
* with the writer. The remainder of the methods in this class are private and
* are invoked internally, either directly or indirectly, by the method
- * <code>writeData</code>.
+ * {@code writeData}.
* <P>
- * Typically the <code>SyncFactory</code> manages the <code>RowSetReader</code> and
- * the <code>RowSetWriter</code> implementations using <code>SyncProvider</code> objects.
+ * Typically the {@code SyncFactory} manages the {@code RowSetReader} and
+ * the {@code RowSetWriter} implementations using {@code SyncProvider} objects.
* Standard JDBC RowSet implementations provide an object instance of this
- * writer by invoking the <code>SyncProvider.getRowSetWriter()</code> method.
+ * writer by invoking the {@code SyncProvider.getRowSetWriter()} method.
*
* @version 0.2
* @author Jonathan Bruce
@@ -69,15 +69,15 @@
public class CachedRowSetWriter implements TransactionalWriter, Serializable {
/**
- * The <code>Connection</code> object that this writer will use to make a
+ * The {@code Connection} object that this writer will use to make a
* connection to the data source to which it will write data.
*
*/
private transient Connection con;
/**
- * The SQL <code>SELECT</code> command that this writer will call
- * internally. The method <code>initSQLStatements</code> builds this
+ * The SQL {@code SELECT} command that this writer will call
+ * internally. The method {@code initSQLStatements} builds this
* command by supplying the words "SELECT" and "FROM," and using
* metadata to get the table name and column names .
*
@@ -86,9 +86,9 @@
private String selectCmd;
/**
- * The SQL <code>UPDATE</code> command that this writer will call
+ * The SQL {@code UPDATE} command that this writer will call
* internally to write data to the rowset's underlying data source.
- * The method <code>initSQLStatements</code> builds this <code>String</code>
+ * The method {@code initSQLStatements} builds this {@code String}
* object.
*
* @serial
@@ -96,8 +96,8 @@
private String updateCmd;
/**
- * The SQL <code>WHERE</code> clause the writer will use for update
- * statements in the <code>PreparedStatement</code> object
+ * The SQL {@code WHERE} clause the writer will use for update
+ * statements in the {@code PreparedStatement} object
* it sends to the underlying data source.
*
* @serial
@@ -105,7 +105,7 @@
private String updateWhere;
/**
- * The SQL <code>DELETE</code> command that this writer will call
+ * The SQL {@code DELETE} command that this writer will call
* internally to delete a row in the rowset's underlying data source.
*
* @serial
@@ -113,8 +113,8 @@
private String deleteCmd;
/**
- * The SQL <code>WHERE</code> clause the writer will use for delete
- * statements in the <code>PreparedStatement</code> object
+ * The SQL {@code WHERE} clause the writer will use for delete
+ * statements in the {@code PreparedStatement} object
* it sends to the underlying data source.
*
* @serial
@@ -122,9 +122,9 @@
private String deleteWhere;
/**
- * The SQL <code>INSERT INTO</code> command that this writer will internally use
+ * The SQL {@code INSERT INTO} command that this writer will internally use
* to insert data into the rowset's underlying data source. The method
- * <code>initSQLStatements</code> builds this command with a question
+ * {@code initSQLStatements} builds this command with a question
* mark parameter placeholder for each column in the rowset.
*
* @serial
@@ -133,8 +133,8 @@
/**
* An array containing the column numbers of the columns that are
- * needed to uniquely identify a row in the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * needed to uniquely identify a row in the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
*
* @serial
*/
@@ -142,7 +142,7 @@
/**
* An array of the parameters that should be used to set the parameter
- * placeholders in a <code>PreparedStatement</code> object that this
+ * placeholders in a {@code PreparedStatement} object that this
* writer will execute.
*
* @serial
@@ -150,33 +150,33 @@
private Object[] params;
/**
- * The <code>CachedRowSetReader</code> object that has been
- * set as the reader for the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * The {@code CachedRowSetReader} object that has been
+ * set as the reader for the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
*
* @serial
*/
private CachedRowSetReader reader;
/**
- * The <code>ResultSetMetaData</code> object that contains information
- * about the columns in the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * The {@code ResultSetMetaData} object that contains information
+ * about the columns in the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
*
* @serial
*/
private ResultSetMetaData callerMd;
/**
- * The number of columns in the <code>CachedRowSet</code> object
- * for which this <code>CachedRowSetWriter</code> object is the writer.
+ * The number of columns in the {@code CachedRowSet} object
+ * for which this {@code CachedRowSetWriter} object is the writer.
*
* @serial
*/
private int callerColumnCount;
/**
- * This <code>CachedRowSet<code> will hold the conflicting values
+ * This {@code CachedRowSet} will hold the conflicting values
* retrieved from the db and hold it.
*/
private CachedRowSetImpl crsResolve;
@@ -209,8 +209,8 @@
}
/**
- * Propagates changes in the given <code>RowSet</code> object
- * back to its underlying data source and returns <code>true</code>
+ * Propagates changes in the given {@code RowSet} object
+ * back to its underlying data source and returns {@code true}
* if successful. The writer will check to see if
* the data in the pre-modified rowset (the original values) differ
* from the data in the underlying data source. If data in the data
@@ -221,15 +221,15 @@
* access for concurrent users.
* <P>
* This method is called by the rowset internally when
- * the application invokes the method <code>acceptChanges</code>.
- * The <code>writeData</code> method in turn calls private methods that
+ * the application invokes the method {@code acceptChanges}.
+ * The {@code writeData} method in turn calls private methods that
* it defines internally.
* The following is a general summary of what the method
- * <code>writeData</code> does, much of which is accomplished
+ * {@code writeData} does, much of which is accomplished
* through calls to its own internal methods.
* <OL>
- * <LI>Creates a <code>CachedRowSet</code> object from the given
- * <code>RowSet</code> object
+ * <LI>Creates a {@code CachedRowSet} object from the given
+ * {@code RowSet} object
* <LI>Makes a connection with the data source
* <UL>
* <LI>Disables autocommit mode if it is not already disabled
@@ -237,32 +237,32 @@
* </UL>
* <LI>Checks to see if the reader has read new data since the writer
* was last called and, if so, calls the method
- * <code>initSQLStatements</code> to initialize new SQL statements
+ * {@code initSQLStatements} to initialize new SQL statements
* <UL>
- * <LI>Builds new <code>SELECT</code>, <code>UPDATE</code>,
- * <code>INSERT</code>, and <code>DELETE</code> statements
- * <LI>Uses the <code>CachedRowSet</code> object's metadata to
+ * <LI>Builds new {@code SELECT}, {@code UPDATE},
+ * {@code INSERT}, and {@code DELETE} statements
+ * <LI>Uses the {@code CachedRowSet} object's metadata to
* determine the table name, column names, and the columns
* that make up the primary key
* </UL>
* <LI>When there is no conflict, propagates changes made to the
- * <code>CachedRowSet</code> object back to its underlying data source
+ * {@code CachedRowSet} object back to its underlying data source
* <UL>
- * <LI>Iterates through each row of the <code>CachedRowSet</code> object
+ * <LI>Iterates through each row of the {@code CachedRowSet} object
* to determine whether it has been updated, inserted, or deleted
* <LI>If the corresponding row in the data source has not been changed
* since the rowset last read its
* values, the writer will use the appropriate command to update,
* insert, or delete the row
* <LI>If any data in the data source does not match the original values
- * for the <code>CachedRowSet</code> object, the writer will roll
+ * for the {@code CachedRowSet} object, the writer will roll
* back any changes it has made to the row in the data source.
* </UL>
* </OL>
*
- * @return <code>true</code> if changes to the rowset were successfully
+ * @return {@code true} if changes to the rowset were successfully
* written to the rowset's underlying data source;
- * <code>false</code> otherwise
+ * {@code false} otherwise
*/
public boolean writeData(RowSetInternal caller) throws SQLException {
long conflicts = 0;
@@ -434,25 +434,25 @@
} //end writeData
-/**
- * Updates the given <code>CachedRowSet</code> object's underlying data
- * source so that updates to the rowset are reflected in the original
- * data source, and returns <code>false</code> if the update was successful.
- * A return value of <code>true</code> indicates that there is a conflict,
- * meaning that a value updated in the rowset has already been changed by
- * someone else in the underlying data source. A conflict can also exist
- * if, for example, more than one row in the data source would be affected
- * by the update or if no rows would be affected. In any case, if there is
- * a conflict, this method does not update the underlying data source.
- * <P>
- * This method is called internally by the method <code>writeData</code>
- * if a row in the <code>CachedRowSet</code> object for which this
- * <code>CachedRowSetWriter</code> object is the writer has been updated.
- *
- * @return <code>false</code> if the update to the underlying data source is
- * successful; <code>true</code> otherwise
- * @throws SQLException if a database access error occurs
- */
+ /**
+ * Updates the given {@code CachedRowSet} object's underlying data
+ * source so that updates to the rowset are reflected in the original
+ * data source, and returns {@code false} if the update was successful.
+ * A return value of {@code true} indicates that there is a conflict,
+ * meaning that a value updated in the rowset has already been changed by
+ * someone else in the underlying data source. A conflict can also exist
+ * if, for example, more than one row in the data source would be affected
+ * by the update or if no rows would be affected. In any case, if there is
+ * a conflict, this method does not update the underlying data source.
+ * <P>
+ * This method is called internally by the method {@code writeData}
+ * if a row in the {@code CachedRowSet} object for which this
+ * {@code CachedRowSetWriter} object is the writer has been updated.
+ *
+ * @return {@code false} if the update to the underlying data source is
+ * successful; {@code true} otherwise
+ * @throws SQLException if a database access error occurs
+ */
private boolean updateOriginalRow(CachedRowSet crs)
throws SQLException {
PreparedStatement pstmt;
@@ -805,16 +805,16 @@
/**
* Inserts a row that has been inserted into the given
- * <code>CachedRowSet</code> object into the data source from which
- * the rowset is derived, returning <code>false</code> if the insertion
+ * {@code CachedRowSet} object into the data source from which
+ * the rowset is derived, returning {@code false} if the insertion
* was successful.
*
- * @param crs the <code>CachedRowSet</code> object that has had a row inserted
+ * @param crs the {@code CachedRowSet} object that has had a row inserted
* and to whose underlying data source the row will be inserted
- * @param pstmt the <code>PreparedStatement</code> object that will be used
+ * @param pstmt the {@code PreparedStatement} object that will be used
* to execute the insertion
- * @return <code>false</code> to indicate that the insertion was successful;
- * <code>true</code> otherwise
+ * @return {@code false} to indicate that the insertion was successful;
+ * {@code true} otherwise
* @throws SQLException if a database access error occurs
*/
private boolean insertNewRow(CachedRowSet crs,
@@ -917,24 +917,24 @@
}
}
-/**
- * Deletes the row in the underlying data source that corresponds to
- * a row that has been deleted in the given <code> CachedRowSet</code> object
- * and returns <code>false</code> if the deletion was successful.
- * <P>
- * This method is called internally by this writer's <code>writeData</code>
- * method when a row in the rowset has been deleted. The values in the
- * deleted row are the same as those that are stored in the original row
- * of the given <code>CachedRowSet</code> object. If the values in the
- * original row differ from the row in the underlying data source, the row
- * in the data source is not deleted, and <code>deleteOriginalRow</code>
- * returns <code>true</code> to indicate that there was a conflict.
- *
- *
- * @return <code>false</code> if the deletion was successful, which means that
- * there was no conflict; <code>true</code> otherwise
- * @throws SQLException if there was a database access error
- */
+ /**
+ * Deletes the row in the underlying data source that corresponds to
+ * a row that has been deleted in the given {@code CachedRowSet} object
+ * and returns {@code false} if the deletion was successful.
+ * <P>
+ * This method is called internally by this writer's {@code writeData}
+ * method when a row in the rowset has been deleted. The values in the
+ * deleted row are the same as those that are stored in the original row
+ * of the given {@code CachedRowSet} object. If the values in the
+ * original row differ from the row in the underlying data source, the row
+ * in the data source is not deleted, and {@code deleteOriginalRow}
+ * returns {@code true} to indicate that there was a conflict.
+ *
+ *
+ * @return {@code false} if the deletion was successful, which means that
+ * there was no conflict; {@code true} otherwise
+ * @throws SQLException if there was a database access error
+ */
private boolean deleteOriginalRow(CachedRowSet crs, CachedRowSetImpl crsRes) throws SQLException {
PreparedStatement pstmt;
int i;
@@ -1056,13 +1056,13 @@
}
/**
- * Composes a <code>SELECT</code>, <code>UPDATE</code>, <code>INSERT</code>,
- * and <code>DELETE</code> statement that can be used by this writer to
- * write data to the data source backing the given <code>CachedRowSet</code>
+ * Composes a {@code SELECT}, {@code UPDATE}, {@code INSERT},
+ * and {@code DELETE} statement that can be used by this writer to
+ * write data to the data source backing the given {@code CachedRowSet}
* object.
*
- * @ param caller a <code>CachedRowSet</code> object for which this
- * <code>CachedRowSetWriter</code> object is the writer
+ * @param caller a {@code CachedRowSet} object for which this
+ * {@code CachedRowSetWriter} object is the writer
* @throws SQLException if a database access error occurs
*/
private void initSQLStatements(CachedRowSet caller) throws SQLException {
@@ -1177,13 +1177,13 @@
* table names. The given metadata object is used to get the proper order
* and separator.
*
- * @param dbmd a <code>DatabaseMetaData</code> object that contains metadata
- * about this writer's <code>CachedRowSet</code> object
- * @param catalog a <code>String</code> object with the rowset's catalog
+ * @param dbmd a {@code DatabaseMetaData} object that contains metadata
+ * about this writer's {@code CachedRowSet} object
+ * @param catalog a {@code String} object with the rowset's catalog
* name
- * @param table a <code>String</code> object with the name of the table from
+ * @param table a {@code String} object with the name of the table from
* which this writer's rowset was derived
- * @return a <code>String</code> object with the fully qualified name of the
+ * @return a {@code String} object with the fully qualified name of the
* table from which this writer's rowset was derived
* @throws SQLException if a database access error occurs
*/
@@ -1221,21 +1221,21 @@
}
/**
- * Assigns to the given <code>CachedRowSet</code> object's
- * <code>params</code>
+ * Assigns to the given {@code CachedRowSet} object's
+ * {@code params}
* field an array whose length equals the number of columns needed
* to uniquely identify a row in the rowset. The array is given
- * values by the method <code>buildWhereClause</code>.
+ * values by the method {@code buildWhereClause}.
* <P>
- * If the <code>CachedRowSet</code> object's <code>keyCols</code>
- * field has length <code>0</code> or is <code>null</code>, the array
+ * If the {@code CachedRowSet} object's {@code keyCols}
+ * field has length {@code 0} or is {@code null}, the array
* is set with the column number of every column in the rowset.
- * Otherwise, the array in the field <code>keyCols</code> is set with only
+ * Otherwise, the array in the field {@code keyCols} is set with only
* the column numbers of the columns that are required to form a unique
* identifier for a row.
*
- * @param crs the <code>CachedRowSet</code> object for which this
- * <code>CachedRowSetWriter</code> object is the writer
+ * @param crs the {@code CachedRowSet} object for which this
+ * {@code CachedRowSetWriter} object is the writer
*
* @throws SQLException if a database access error occurs
*/
@@ -1263,29 +1263,29 @@
}
/**
- * Constructs an SQL <code>WHERE</code> clause using the given
- * string as a starting point. The resulting clause will contain
- * a column name and " = ?" for each key column, that is, each column
- * that is needed to form a unique identifier for a row in the rowset.
- * This <code>WHERE</code> clause can be added to
- * a <code>PreparedStatement</code> object that updates, inserts, or
- * deletes a row.
- * <P>
- * This method uses the given result set to access values in the
- * <code>CachedRowSet</code> object that called this writer. These
- * values are used to build the array of parameters that will serve as
- * replacements for the "?" parameter placeholders in the
- * <code>PreparedStatement</code> object that is sent to the
- * <code>CachedRowSet</code> object's underlying data source.
- *
- * @param whereClause a <code>String</code> object that is an empty
- * string ("")
- * @param rs a <code>ResultSet</code> object that can be used
- * to access the <code>CachedRowSet</code> object's data
- * @return a <code>WHERE</code> clause of the form "<code>WHERE</code>
- * columnName = ? AND columnName = ? AND columnName = ? ..."
- * @throws SQLException if a database access error occurs
- */
+ * Constructs an SQL {@code WHERE} clause using the given
+ * string as a starting point. The resulting clause will contain
+ * a column name and " = ?" for each key column, that is, each column
+ * that is needed to form a unique identifier for a row in the rowset.
+ * This {@code WHERE} clause can be added to
+ * a {@code PreparedStatement} object that updates, inserts, or
+ * deletes a row.
+ * <P>
+ * This method uses the given result set to access values in the
+ * {@code CachedRowSet} object that called this writer. These
+ * values are used to build the array of parameters that will serve as
+ * replacements for the "?" parameter placeholders in the
+ * {@code PreparedStatement} object that is sent to the
+ * {@code CachedRowSet} object's underlying data source.
+ *
+ * @param whereClause a {@code String} object that is an empty
+ * string ("")
+ * @param rs a {@code ResultSet} object that can be used
+ * to access the {@code CachedRowSet} object's data
+ * @return a {@code WHERE} clause of the form "{@code WHERE}
+ * columnName = ? AND columnName = ? AND columnName = ? ..."
+ * @throws SQLException if a database access error occurs
+ */
private String buildWhereClause(String whereClause,
ResultSet rs) throws SQLException {
whereClause = "WHERE ";
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/SyncResolverImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/SyncResolverImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -39,8 +39,8 @@
/**
* There will be two sets of data which will be maintained by the rowset at the
- * time of synchronization. The <code>SyncProvider</code> will utilize the
- * <code>SyncResolver</code> to synchronize the changes back to database.
+ * time of synchronization. The {@code SyncProvider} will utilize the
+ * {@code SyncResolver} to synchronize the changes back to database.
*/
public class SyncResolverImpl extends CachedRowSetImpl implements SyncResolver {
/**
@@ -79,19 +79,19 @@
private int rowStatus;
/**
- * This will contain the size of the <code>CachedRowSet</code> object
+ * This will contain the size of the {@code CachedRowSet} object
*/
private int sz;
/**
- * The <code>Connection</code> handle used to synchronize the changes
+ * The {@code Connection} handle used to synchronize the changes
* back to datasource. This is the same connection handle as was passed
* to the CachedRowSet while fetching the data.
*/
private transient Connection con;
/**
- * The <code>CachedRowSet</code> object which will encapsulate
+ * The {@code CachedRowSet} object which will encapsulate
* a row at any time. This will be built from CachedRowSet and
* SyncResolver values. Synchronization takes place on a row by
* row basis encapsulated as a CahedRowSet.
@@ -123,13 +123,13 @@
/**
* Retrieves the conflict status of the current row of this
- * <code>SyncResolver</code>, which indicates the operationthe <code>RowSet</code>
+ * {@code SyncResolver}, which indicates the operationthe {@code RowSet}
* object was attempting when the conflict occurred.
*
* @return one of the following constants:
- * <code>SyncResolver.UPDATE_ROW_CONFLICT</code>,
- * <code>SyncResolver.DELETE_ROW_CONFLICT</code>, or
- * <code>SyncResolver.INSERT_ROW_CONFLICT</code>
+ * {@code SyncResolver.UPDATE_ROW_CONFLICT},
+ * {@code SyncResolver.DELETE_ROW_CONFLICT}, or
+ * {@code SyncResolver.INSERT_ROW_CONFLICT}
*/
public int getStatus() {
return ((Integer)stats.get(rowStatus-1)).intValue();
@@ -137,10 +137,10 @@
/**
* Retrieves the value in the designated column in the current row of this
- * <code>SyncResolver</code> object, which is the value that caused a conflict.
- *
- * @param index <code>int</code> designating the column in this row of this
- * <code>SyncResolver</code> object from which to retrieve the value
+ * {@code SyncResolver} object, which is the value that caused a conflict.
+ *
+ * @param index {@code int} designating the column in this row of this
+ * {@code SyncResolver} object from which to retrieve the value
* causing a conflict
*/
public Object getConflictValue(int index) throws SQLException {
@@ -153,10 +153,10 @@
/**
* Retrieves the value in the designated column in the current row of this
- * <code>SyncResolver</code> object, which is the value that caused a conflict.
- *
- * @param columnName a <code>String</code> object designating the column in this row of this
- * <code>SyncResolver</code> object from which to retrieve the value
+ * {@code SyncResolver} object, which is the value that caused a conflict.
+ *
+ * @param columnName a {@code String} object designating the column in this row of this
+ * {@code SyncResolver} object from which to retrieve the value
* causing a conflict
*/
public Object getConflictValue(String columnName) throws SQLException {
@@ -169,12 +169,12 @@
/**
* Sets <i>obj</i> as the value in column <i>index</i> in the current row of the
- * <code>RowSet</code> object. This value is the resolved value that is to be
+ * {@code RowSet} object. This value is the resolved value that is to be
* persisted in the data source.
*
- * @param index an <code>int</code> giving the number of the column into which to
+ * @param index an {@code int} giving the number of the column into which to
* set the value to be persisted
- * @param obj an <code>Object</code> that is the value to be set in the data source
+ * @param obj an {@code Object} that is the value to be set in the data source
*/
public void setResolvedValue(int index, Object obj) throws SQLException {
// modify method to throw SQLException in spec
@@ -291,18 +291,18 @@
* This passes a CachedRowSet as a row to the CachedRowSetWriter
* after the values have been resolved, back to the datasource.
*
- * @param row a <code>CachedRowSet</code> object which will hold the
+ * @param row a {@code CachedRowSet} object which will hold the
* values of a particular row after they have been resolved by
* the user to synchronize back to datasource.
* @throws SQLException if synchronization does not happen properly
- * maybe beacuse <code>Connection</code> has timed out.
+ * maybe beacuse {@code Connection} has timed out.
**/
private void writeData(CachedRowSet row) throws SQLException {
crw.updateResolvedConflictToDB(row, crw.getReader().connect((RowSetInternal)crsSync));
}
/**
- * This function builds a row as a <code>CachedRowSet</code> object
+ * This function builds a row as a {@code CachedRowSet} object
* which has been resolved and is ready to be synchrinized to the datasource
*
* @throws SQLException if there is problem in building
@@ -385,12 +385,12 @@
/**
* Sets <i>obj</i> as the value in column <i>columnName</i> in the current row of the
- * <code>RowSet</code> object. This value is the resolved value that is to be
+ * {@code RowSet} object. This value is the resolved value that is to be
* persisted in the data source.
*
- * @param columnName a <code>String</code> object giving the name of the column
+ * @param columnName a {@code String} object giving the name of the column
* into which to set the value to be persisted
- * @param obj an <code>Object</code> that is the value to be set in the data source
+ * @param obj an {@code Object} that is the value to be set in the data source
*/
public void setResolvedValue(String columnName, Object obj) throws SQLException {
// modify method to throw SQLException in spec
@@ -445,13 +445,13 @@
}
/**
- * Moves the cursor down one row from its current position. A <code>SyncResolver</code>
+ * Moves the cursor down one row from its current position. A {@code SyncResolver}
* cursor is initially positioned before the first conflict row; the first call to the
- * method <code>nextConflict()</code> makes the first conflict row the current row;
+ * method {@code nextConflict()} makes the first conflict row the current row;
* the second call makes the second conflict row the current row, and so on.
* <p>
* If an input stream is open for the current row, a call to the method next will
- * implicitly close it. A <code>SyncResolver</code> object's warning chain is cleared
+ * implicitly close it. A {@code SyncResolver} object's warning chain is cleared
* when a new row
*
* @return true if the new current row is valid; false if there are no more rows
@@ -495,9 +495,9 @@
/**
- * Moves the cursor to the previous conflict row in this <code>SyncResolver</code> object.
- *
- * @return <code>true</code> if the cursor is on a valid row; <code>false</code>
+ * Moves the cursor to the previous conflict row in this {@code SyncResolver} object.
+ *
+ * @return {@code true} if the cursor is on a valid row; {@code false}
* if it is off the result set
* @throws SQLException if a database access error occurs or the result set type
* is TYPE_FORWARD_ONLY
@@ -511,17 +511,17 @@
//-----------------------------------------------------------------------
/**
- * Sets this <code>CachedRowSetImpl</code> object's command property
- * to the given <code>String</code> object and clears the parameters,
+ * Sets this {@code CachedRowSetImpl} object's command property
+ * to the given {@code String} object and clears the parameters,
* if any, that were set for the previous command.
* <P>
* The command property may not be needed
* if the rowset is produced by a data source, such as a spreadsheet,
* that does not support commands. Thus, this property is optional
- * and may be <code>null</code>.
- *
- * @param cmd a <code>String</code> object containing an SQL query
- * that will be set as the command; may be <code>null</code>
+ * and may be {@code null}.
+ *
+ * @param cmd a {@code String} object containing an SQL query
+ * that will be set as the command; may be {@code null}
* @throws SQLException if an error occurs
*/
public void setCommand(String cmd) throws SQLException {
@@ -534,25 +534,25 @@
//---------------------------------------------------------------------
/**
- * Populates this <code>CachedRowSetImpl</code> object with data from
- * the given <code>ResultSet</code> object. This
- * method is an alternative to the method <code>execute</code>
- * for filling the rowset with data. The method <code>populate</code>
+ * Populates this {@code CachedRowSetImpl} object with data from
+ * the given {@code ResultSet} object. This
+ * method is an alternative to the method {@code execute}
+ * for filling the rowset with data. The method {@code populate}
* does not require that the properties needed by the method
- * <code>execute</code>, such as the <code>command</code> property,
- * be set. This is true because the method <code>populate</code>
- * is given the <code>ResultSet</code> object from
+ * {@code execute}, such as the {@code command} property,
+ * be set. This is true because the method {@code populate}
+ * is given the {@code ResultSet} object from
* which to get data and thus does not need to use the properties
* required for setting up a connection and executing this
- * <code>CachedRowSetImpl</code> object's command.
+ * {@code CachedRowSetImpl} object's command.
* <P>
* After populating this rowset with data, the method
- * <code>populate</code> sets the rowset's metadata and
- * then sends a <code>RowSetChangedEvent</code> object
+ * {@code populate} sets the rowset's metadata and
+ * then sends a {@code RowSetChangedEvent} object
* to all registered listeners prior to returning.
*
- * @param data the <code>ResultSet</code> object containing the data
- * to be read into this <code>CachedRowSetImpl</code> object
+ * @param data the {@code ResultSet} object containing the data
+ * to be read into this {@code CachedRowSetImpl} object
* @throws SQLException if an error occurs; or the max row setting is
* violated while populating the RowSet
* @see #execute
@@ -562,18 +562,18 @@
}
/**
- * Populates this <code>CachedRowSetImpl</code> object with data,
+ * Populates this {@code CachedRowSetImpl} object with data,
* using the given connection to produce the result set from
* which data will be read. A second form of this method,
* which takes no arguments, uses the values from this rowset's
* user, password, and either url or data source properties to
- * create a new database connection. The form of <code>execute</code>
+ * create a new database connection. The form of {@code execute}
* that is given a connection ignores these properties.
*
- * @param conn A standard JDBC <code>Connection</code> object that this
- * <code>CachedRowSet</code> object can pass to a synchronization provider
+ * @param conn A standard JDBC {@code Connection} object that this
+ * {@code CachedRowSet} object can pass to a synchronization provider
* to establish a connection to the data source
- * @throws SQLException if an invalid <code>Connection</code> is supplied
+ * @throws SQLException if an invalid {@code Connection} is supplied
* or an error occurs in establishing the connection to the
* data source
* @see #populate
@@ -585,11 +585,11 @@
/**
* Propagates all row update, insert, and delete changes to the
- * underlying data source backing this <code>CachedRowSetImpl</code>
+ * underlying data source backing this {@code CachedRowSetImpl}
* object.
* <P>
* <b>Note</b>In the reference implementation an optimistic concurrency implementation
- * is provided as a sample implementation of a the <code>SyncProvider</code>
+ * is provided as a sample implementation of a the {@code SyncProvider}
* abstract class.
* <P>
* This method fails if any of the updates cannot be propagated back
@@ -601,17 +601,17 @@
* In that case, when deleted rows are not shown, which is usually true,
* the current row is not affected.
* <P>
- * If no <code>SyncProvider</code> is configured, the reference implementation
- * leverages the <code>RIOptimisticProvider</code> available which provides the
+ * If no {@code SyncProvider} is configured, the reference implementation
+ * leverages the {@code RIOptimisticProvider} available which provides the
* default and reference synchronization capabilities for disconnected
- * <code>RowSets</code>.
+ * {@code RowSets}.
*
* @throws SQLException if the cursor is on the insert row or the underlying
* reference synchronization provider fails to commit the updates
* to the datasource
* @throws SyncProviderException if an internal error occurs within the
- * <code>SyncProvider</code> instance during either during the
- * process or at any time when the <code>SyncProvider</code>
+ * {@code SyncProvider} instance during either during the
+ * process or at any time when the {@code SyncProvider}
* instance touches the data source.
* @see #acceptChanges(java.sql.Connection)
* @see javax.sql.RowSetWriter
@@ -623,18 +623,18 @@
/**
* Propagates all row update, insert, and delete changes to the
- * data source backing this <code>CachedRowSetImpl</code> object
- * using the given <code>Connection</code> object.
+ * data source backing this {@code CachedRowSetImpl} object
+ * using the given {@code Connection} object.
* <P>
- * The reference implementation <code>RIOptimisticProvider</code>
+ * The reference implementation {@code RIOptimisticProvider}
* modifies its synchronization to a write back function given
* the updated connection
* The reference implementation modifies its synchronization behaviour
- * via the <code>SyncProvider</code> to ensure the synchronization
- * occurs according to the updated JDBC <code>Connection</code>
+ * via the {@code SyncProvider} to ensure the synchronization
+ * occurs according to the updated JDBC {@code Connection}
* properties.
*
- * @param con a standard JDBC <code>Connection</code> object
+ * @param con a standard JDBC {@code Connection} object
* @throws SQLException if the cursor is on the insert row or the underlying
* synchronization provider fails to commit the updates
* back to the data source
@@ -648,11 +648,11 @@
}
/**
- * Restores this <code>CachedRowSetImpl</code> object to its original state,
+ * Restores this {@code CachedRowSetImpl} object to its original state,
* that is, its state before the last set of changes.
* <P>
* Before returning, this method moves the cursor before the first row
- * and sends a <code>rowSetChanged</code> event to all registered
+ * and sends a {@code rowSetChanged} event to all registered
* listeners.
* @throws SQLException if an error is occurs rolling back the RowSet
* state to the definied original value.
@@ -663,8 +663,8 @@
}
/**
- * Releases the current contents of this <code>CachedRowSetImpl</code>
- * object and sends a <code>rowSetChanged</code> event object to all
+ * Releases the current contents of this {@code CachedRowSetImpl}
+ * object and sends a {@code rowSetChanged} event object to all
* registered listeners.
*
* @throws SQLException if an error occurs flushing the contents of
@@ -690,7 +690,7 @@
/**
* Immediately removes the current row from this
- * <code>CachedRowSetImpl</code> object if the row has been inserted, and
+ * {@code CachedRowSetImpl} object if the row has been inserted, and
* also notifies listeners the a row has changed. An exception is thrown
* if the row is not a row that has been inserted or the cursor is before
* the first row, after the last row, or on the insert row.
@@ -710,10 +710,10 @@
* row has been modified. This method can be
* called to reverse updates on a all columns until all updates in a row have
* been rolled back to their originating state since the last synchronization
- * (<code>acceptChanges</code>) or population. This method may also be called
+ * ({@code acceptChanges}) or population. This method may also be called
* while performing updates to the insert row.
* <P>
- * <code>undoUpdate</code may be called at any time during the life-time of a
+ * {@code undoUpdate} may be called at any time during the life-time of a
* rowset, however after a synchronization has occurs this method has no
* affect until further modification to the RowSet data occurs.
*
@@ -733,12 +733,12 @@
//--------------------------------------------------------------------
/**
- * Returns a new <code>RowSet</code> object backed by the same data as
- * that of this <code>CachedRowSetImpl</code> object and sharing a set of cursors
+ * Returns a new {@code RowSet} object backed by the same data as
+ * that of this {@code CachedRowSetImpl} object and sharing a set of cursors
* with it. This allows cursors to interate over a shared set of rows, providing
* multiple views of the underlying data.
*
- * @return a <code>RowSet</code> object that is a copy of this <code>CachedRowSetImpl</code>
+ * @return a {@code RowSet} object that is a copy of this {@code CachedRowSetImpl}
* object and shares a set of cursors with it
* @throws SQLException if an error occurs or cloning is
* not supported
@@ -750,19 +750,19 @@
}
/**
- * Returns a new <code>RowSet</code> object containing by the same data
- * as this <code>CachedRowSetImpl</code> object. This method
- * differs from the method <code>createCopy</code> in that it throws a
- * <code>CloneNotSupportedException</code> object instead of an
- * <code>SQLException</code> object, as the method <code>createShared</code>
- * does. This <code>clone</code>
- * method is called internally by the method <code>createShared</code>,
- * which catches the <code>CloneNotSupportedException</code> object
- * and in turn throws a new <code>SQLException</code> object.
- *
- * @return a copy of this <code>CachedRowSetImpl</code> object
+ * Returns a new {@code RowSet} object containing by the same data
+ * as this {@code CachedRowSetImpl} object. This method
+ * differs from the method {@code createCopy} in that it throws a
+ * {@code CloneNotSupportedException} object instead of an
+ * {@code SQLException} object, as the method {@code createShared}
+ * does. This {@code clone}
+ * method is called internally by the method {@code createShared},
+ * which catches the {@code CloneNotSupportedException} object
+ * and in turn throws a new {@code SQLException} object.
+ *
+ * @return a copy of this {@code CachedRowSetImpl} object
* @throws CloneNotSupportedException if an error occurs when
- * attempting to clone this <code>CachedRowSetImpl</code> object
+ * attempting to clone this {@code CachedRowSetImpl} object
* @see #createShared
*/
protected Object clone() throws CloneNotSupportedException {
@@ -770,8 +770,8 @@
}
/**
- * Creates a <code>RowSet</code> object that is a deep copy of
- * this <code>CachedRowSetImpl</code> object's data, including
+ * Creates a {@code RowSet} object that is a deep copy of
+ * this {@code CachedRowSetImpl} object's data, including
* constraints. Updates made
* on a copy are not visible to the original rowset;
* a copy of a rowset is completely independent from the original.
@@ -780,12 +780,12 @@
* from first principles, which can be quite expensive.
* For example, it can eliminate the need to query a
* remote database server.
- * @return a new <code>CachedRowSet</code> object that is a deep copy
- * of this <code>CachedRowSet</code> object and is
- * completely independent from this <code>CachedRowSetImpl</code>
+ * @return a new {@code CachedRowSet} object that is a deep copy
+ * of this {@code CachedRowSet} object and is
+ * completely independent from this {@code CachedRowSetImpl}
* object.
* @throws SQLException if an error occurs in generating the copy of this
- * of the <code>CachedRowSetImpl</code>
+ * of the {@code CachedRowSetImpl}
* @see #createShared
* @see javax.sql.RowSetEvent
* @see javax.sql.RowSetListener
@@ -795,21 +795,21 @@
}
/**
- * Creates a <code>RowSet</code> object that is a copy of
- * this <code>CachedRowSetImpl</code> object's table structure
+ * Creates a {@code RowSet} object that is a copy of
+ * this {@code CachedRowSetImpl} object's table structure
* and the constraints only.
* There will be no data in the object being returned.
* Updates made on a copy are not visible to the original rowset.
* <P>
* This helps in getting the underlying XML schema which can
- * be used as the basis for populating a <code>WebRowSet</code>.
- *
- * @return a new <code>CachedRowSet</code> object that is a copy
- * of this <code>CachedRowSetImpl</code> object's schema and
+ * be used as the basis for populating a {@code WebRowSet}.
+ *
+ * @return a new {@code CachedRowSet} object that is a copy
+ * of this {@code CachedRowSetImpl} object's schema and
* retains all the constraints on the original rowset but contains
* no data
* @throws SQLException if an error occurs in generating the copy
- * of the <code>CachedRowSet</code> object
+ * of the {@code CachedRowSet} object
* @see #createShared
* @see #createCopy
* @see #createCopyNoConstraints
@@ -821,17 +821,17 @@
}
/**
- * Creates a <code>CachedRowSet</code> object that is a copy of
- * this <code>CachedRowSetImpl</code> object's data only.
+ * Creates a {@code CachedRowSet} object that is a copy of
+ * this {@code CachedRowSetImpl} object's data only.
* All constraints set in this object will not be there
* in the returning object. Updates made
* on a copy are not visible to the original rowset.
*
- * @return a new <code>CachedRowSet</code> object that is a deep copy
- * of this <code>CachedRowSetImpl</code> object and is
- * completely independent from this <code>CachedRowSetImpl</code> object
+ * @return a new {@code CachedRowSet} object that is a deep copy
+ * of this {@code CachedRowSetImpl} object and is
+ * completely independent from this {@code CachedRowSetImpl} object
* @throws SQLException if an error occurs in generating the copy of the
- * of the <code>CachedRowSet</code>
+ * of the {@code CachedRowSet}
* @see #createShared
* @see #createCopy
* @see #createCopySchema
@@ -843,15 +843,15 @@
}
/**
- * Converts this <code>CachedRowSetImpl</code> object to a collection
- * of tables. The sample implementation utilitizes the <code>TreeMap</code>
+ * Converts this {@code CachedRowSetImpl} object to a collection
+ * of tables. The sample implementation utilitizes the {@code TreeMap}
* collection type.
* This class guarantees that the map will be in ascending key order,
* sorted according to the natural order for the key's class.
*
- * @return a <code>Collection</code> object consisting of tables,
+ * @return a {@code Collection} object consisting of tables,
* each of which is a copy of a row in this
- * <code>CachedRowSetImpl</code> object
+ * {@code CachedRowSetImpl} object
* @throws SQLException if an error occurs in generating the collection
* @see #toCollection(int)
* @see #toCollection(String)
@@ -863,16 +863,16 @@
}
/**
- * Returns the specified column of this <code>CachedRowSetImpl</code> object
- * as a <code>Collection</code> object. This method makes a copy of the
- * column's data and utilitizes the <code>Vector</code> to establish the
- * collection. The <code>Vector</code> class implements a growable array
+ * Returns the specified column of this {@code CachedRowSetImpl} object
+ * as a {@code Collection} object. This method makes a copy of the
+ * column's data and utilitizes the {@code Vector} to establish the
+ * collection. The {@code Vector} class implements a growable array
* objects allowing the individual components to be accessed using an
* an integer index similar to that of an array.
*
- * @return a <code>Collection</code> object that contains the value(s)
+ * @return a {@code Collection} object that contains the value(s)
* stored in the specified column of this
- * <code>CachedRowSetImpl</code>
+ * {@code CachedRowSetImpl}
* object
* @throws SQLException if an error occurs generated the collection; or
* an invalid column is provided.
@@ -886,16 +886,16 @@
}
/**
- * Returns the specified column of this <code>CachedRowSetImpl</code> object
- * as a <code>Collection</code> object. This method makes a copy of the
- * column's data and utilitizes the <code>Vector</code> to establish the
- * collection. The <code>Vector</code> class implements a growable array
+ * Returns the specified column of this {@code CachedRowSetImpl} object
+ * as a {@code Collection} object. This method makes a copy of the
+ * column's data and utilitizes the {@code Vector} to establish the
+ * collection. The {@code Vector} class implements a growable array
* objects allowing the individual components to be accessed using an
* an integer index similar to that of an array.
*
- * @return a <code>Collection</code> object that contains the value(s)
+ * @return a {@code Collection} object that contains the value(s)
* stored in the specified column of this
- * <code>CachedRowSetImpl</code>
+ * {@code CachedRowSetImpl}
* object
* @throws SQLException if an error occurs generated the collection; or
* an invalid column is provided.
@@ -914,25 +914,25 @@
/**
- * Returns the <code>SyncProvider</code> implementation being used
- * with this <code>CachedRowSetImpl</code> implementation rowset.
+ * Returns the {@code SyncProvider} implementation being used
+ * with this {@code CachedRowSetImpl} implementation rowset.
*
* @return the SyncProvider used by the rowset. If not provider was
* set when the rowset was instantiated, the reference
* implementation (default) provider is returned.
* @throws SQLException if error occurs while return the
- * <code>SyncProvider</code> instance.
+ * {@code SyncProvider} instance.
*/
public SyncProvider getSyncProvider() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Sets the active <code>SyncProvider</code> and attempts to load
- * load the new provider using the <code>SyncFactory</code> SPI.
+ * Sets the active {@code SyncProvider} and attempts to load
+ * load the new provider using the {@code SyncFactory} SPI.
*
* @throws SQLException if an error occurs while resetting the
- * <code>SyncProvider</code>.
+ * {@code SyncProvider}.
*/
public void setSyncProvider(String providerStr) throws SQLException {
throw new UnsupportedOperationException();
@@ -953,23 +953,23 @@
//---------------------------------------------------------------------
/**
- * Populates this <code>CachedRowSetImpl</code> object with data.
+ * Populates this {@code CachedRowSetImpl} object with data.
* This form of the method uses the rowset's user, password, and url or
* data source name properties to create a database
* connection. If properties that are needed
* have not been set, this method will throw an exception.
* <P>
- * Another form of this method uses an existing JDBC <code>Connection</code>
+ * Another form of this method uses an existing JDBC {@code Connection}
* object instead of creating a new one; therefore, it ignores the
* properties used for establishing a new connection.
* <P>
* The query specified by the command property is executed to create a
- * <code>ResultSet</code> object from which to retrieve data.
+ * {@code ResultSet} object from which to retrieve data.
* The current contents of the rowset are discarded, and the
* rowset's metadata is also (re)set. If there are outstanding updates,
* they are also ignored.
* <P>
- * The method <code>execute</code> closes any database connections that it
+ * The method {@code execute} closes any database connections that it
* creates.
*
* @throws SQLException if an error occurs or the
@@ -987,20 +987,20 @@
/**
* Moves the cursor down one row from its current position and
- * returns <code>true</code> if the new cursor position is a
+ * returns {@code true} if the new cursor position is a
* valid row.
- * The cursor for a new <code>ResultSet</code> object is initially
+ * The cursor for a new {@code ResultSet} object is initially
* positioned before the first row. The first call to the method
- * <code>next</code> moves the cursor to the first row, making it
+ * {@code next} moves the cursor to the first row, making it
* the current row; the second call makes the second row the
* current row, and so on.
*
* <P>If an input stream from the previous row is open, it is
- * implicitly closed. The <code>ResultSet</code> object's warning
+ * implicitly closed. The {@code ResultSet} object's warning
* chain is cleared when a new row is read.
*
- * @return <code>true</code> if the new current row is valid;
- * <code>false</code> if there are no more rows
+ * @return {@code true} if the new current row is valid;
+ * {@code false} if there are no more rows
* @throws SQLException if an error occurs or
* the cursor is not positioned in the rowset, before
* the first row, or after the last row
@@ -1010,9 +1010,9 @@
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the next
- * row and returns <code>true</code> if the cursor is still in the rowset;
- * returns <code>false</code> if the cursor has moved to the position after
+ * Moves this {@code CachedRowSetImpl} object's cursor to the next
+ * row and returns {@code true} if the cursor is still in the rowset;
+ * returns {@code false} if the cursor has moved to the position after
* the last row.
* <P>
* This method handles the cases where the cursor moves to a row that
@@ -1021,15 +1021,15 @@
* that has been deleted, this method moves the cursor to the next
* row until the cursor is on a row that has not been deleted.
* <P>
- * The method <code>internalNext</code> is called by methods such as
- * <code>next</code>, <code>absolute</code>, and <code>relative</code>,
+ * The method {@code internalNext} is called by methods such as
+ * {@code next}, {@code absolute}, and {@code relative},
* and, as its name implies, is only called internally.
* <p>
* This is a implementation only method and is not required as a standard
- * implementation of the <code>CachedRowSet</code> interface.
- *
- * @return <code>true</code> if the cursor is on a valid row in this
- * rowset; <code>false</code> if it is after the last row
+ * implementation of the {@code CachedRowSet} interface.
+ *
+ * @return {@code true} if the cursor is on a valid row in this
+ * rowset; {@code false} if it is after the last row
* @throws SQLException if an error occurs
*/
protected boolean internalNext() throws SQLException {
@@ -1037,25 +1037,25 @@
}
/**
- * Closes this <code>CachedRowSetImpl</code> objecy and releases any resources
+ * Closes this {@code CachedRowSetImpl} objecy and releases any resources
* it was using.
*
* @throws SQLException if an error occurs when releasing any resources in use
- * by this <code>CachedRowSetImpl</code> object
+ * by this {@code CachedRowSetImpl} object
*/
public void close() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Reports whether the last column read was SQL <code>NULL</code>.
- * Note that you must first call the method <code>getXXX</code>
+ * Reports whether the last column read was SQL {@code NULL}.
+ * Note that you must first call the method {@code getXXX}
* on a column to try to read its value and then call the method
- * <code>wasNull</code> to determine whether the value was
- * SQL <code>NULL</code>.
- *
- * @return <code>true</code> if the value in the last column read
- * was SQL <code>NULL</code>; <code>false</code> otherwise
+ * {@code wasNull} to determine whether the value was
+ * SQL {@code NULL}.
+ *
+ * @return {@code true} if the value in the last column read
+ * was SQL {@code NULL}; {@code false} otherwise
* @throws SQLException if an error occurs
*/
public boolean wasNull() throws SQLException {
@@ -1064,9 +1064,9 @@
/**
* Returns the insert row or the current row of this
- * <code>CachedRowSetImpl</code>object.
- *
- * @return the <code>Row</code> object on which this <code>CachedRowSetImpl</code>
+ * {@code CachedRowSetImpl}object.
+ *
+ * @return the {@code Row} object on which this {@code CachedRowSetImpl}
* objects's cursor is positioned
*/
protected BaseRow getCurrentRow() {
@@ -1077,7 +1077,7 @@
* Removes the row on which the cursor is positioned.
* <p>
* This is a implementation only method and is not required as a standard
- * implementation of the <code>CachedRowSet</code> interface.
+ * implementation of the {@code CachedRowSet} interface.
*
* @throws SQLException if the cursor is positioned on the insert
* row
@@ -1089,20 +1089,20 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>String</code> object.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code String} object.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code null}
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
- * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>, <b>VARCHAR</b></code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
+ * SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
+ * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT,} <b>{@code CHAR, VARCHAR}</b>
+ * or {@code LONGVARCHAR} value. The bold SQL type designates the
* recommended return type.
*/
public String getString(int columnIndex) throws SQLException {
@@ -1111,18 +1111,18 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>boolean</code> value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code boolean} value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value as a <code>boolean</code> in the Java progamming language;
- * if the value is SQL <code>NULL</code>, the result is <code>false</code>
+ * @return the column value as a {@code boolean} in the Java progamming language;
+ * if the value is SQL {@code NULL}, the result is {@code false}
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>BOOLEAN</code> value
+ * SQL {@code BOOLEAN} value
* @see #getBoolean(String)
*/
public boolean getBoolean(int columnIndex) throws SQLException {
@@ -1131,20 +1131,20 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>byte</code> value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code byte} value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value as a <code>byte</code> in the Java programming
- * language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
+ * @return the column value as a {@code byte} in the Java programming
+ * language; if the value is SQL {@code NULL}, the result is {@code 0}
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code><b>TINYINT</b>, SMALLINT, INTEGER, BIGINT, REAL,
- * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type
+ * SQL <b>{@code TINYINT}</b>, {@code SMALLINT, INTEGER,
+ * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
+ * VARCHAR} or {@code LONGVARCHAR} value. The bold SQL type
* designates the recommended return type.
* @see #getByte(String)
*/
@@ -1154,21 +1154,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>short</code> value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code short} value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code 0}
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER, BIGINT, REAL
- * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
- * recommended return type.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code TINYINT}, <b>{@code SMALLINT}</b>,
+ * {@code INTEGER, BIGINT, REAL, FLOAT, DOUBLE,
+ * DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
+ * or {@code LONGVARCHAR} value. The bold SQL type
+ * designates the recommended return type.
* @see #getShort(String)
*/
public short getShort(int columnIndex) throws SQLException {
@@ -1177,21 +1178,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as an
- * <code>int</code> value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as an
+ * {@code int} value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code 0}
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
- * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
- * recommended return type.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code TINYINT, SMALLINT,} <b>{@code INTEGER}</b>,
+ * {@code BIGINT, REAL, FLOAT, DOUBLE, DECIMAL,
+ * NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the
+ * recommended return type.
*/
public int getInt(int columnIndex) throws SQLException {
throw new UnsupportedOperationException();
@@ -1199,21 +1201,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>long</code> value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code long} value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code 0}
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, SMALLINT, INTEGER, <b>BIGINT</b>, REAL
- * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
- * recommended return type.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code TINYINT, SMALLINT, INTEGER,}
+ * <b>{@code BIGINT}</b>, {@code REAL, FLOAT, DOUBLE,
+ * DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
+ * or {@code LONGVARCHAR} value. The bold SQL type
+ * designates the recommended return type.
* @see #getLong(String)
*/
public long getLong(int columnIndex) throws SQLException {
@@ -1222,21 +1225,21 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>float</code> value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code float} value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code 0}
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, <b>REAL</b>,
- * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
- * recommended return type.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT,}
+ * <b>{@code REAL}</b>, {@code FLOAT, DOUBLE, DECIMAL, NUMERIC,
+ * BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the recommended return type.
* @see #getFloat(String)
*/
public float getFloat(int columnIndex) throws SQLException {
@@ -1245,21 +1248,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>double</code> value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code double} value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>0</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code 0}
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
- * <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
- * recommended return type.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,}
+ * <b>{@code FLOAT, DOUBLE}</b>,
+ * {@code DECIMAL, NUMERIC, BIT, CHAR, VARCHAR}
+ * or {@code LONGVARCHAR} value. The bold SQL type
+ * designates the recommended return type.
* @see #getDouble(String)
*
*/
@@ -1269,21 +1273,21 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>java.math.BigDecimal</code> object.
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code java.math.BigDecimal} object.
* <P>
- * This method is deprecated; use the version of <code>getBigDecimal</code>
+ * This method is deprecated; use the version of {@code getBigDecimal}
* that does not take a scale parameter and returns a value with full
* precision.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
* @param scale the number of digits to the right of the decimal point in the
* value returned
* @return the column value with the specified number of digits to the right
- * of the decimal point; if the value is SQL <code>NULL</code>, the
- * result is <code>null</code>
+ * of the decimal point; if the value is SQL {@code NULL}, the
+ * result is {@code null}
* @throws SQLException if the given column index is out of bounds,
* the cursor is not on a valid row, or this method fails
* @deprecated
@@ -1295,22 +1299,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>byte</code> array value.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code byte} array value.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value as a <code>byte</code> array in the Java programming
- * language; if the value is SQL <code>NULL</code>, the
- * result is <code>null</code>
+ * @return the column value as a {@code byte} array in the Java programming
+ * language; if the value is SQL {@code NULL}, the
+ * result is {@code null}
*
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code><b>BINARY</b>, <b>VARBINARY</b> or
- * LONGVARBINARY</code> value.
- * The bold SQL type designates the recommended return type.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL <b>{@code BINARY, VARBINARY}</b> or
+ * {@code LONGVARBINARY} value.
+ * The bold SQL type designates the recommended return type.
* @see #getBytes(String)
*/
public byte[] getBytes(int columnIndex) throws SQLException {
@@ -1319,17 +1323,17 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>java.sql.Date</code> object.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code java.sql.Date} object.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value as a <code>java.sql.Data</code> object; if
- * the value is SQL <code>NULL</code>, the
- * result is <code>null</code>
+ * @return the column value as a {@code java.sql.Data} object; if
+ * the value is SQL {@code NULL}, the
+ * result is {@code null}
* @throws SQLException if the given column index is out of bounds,
- * the cursor is not on a valid row, or this method fails
+ * the cursor is not on a valid row, or this method fails
*/
public java.sql.Date getDate(int columnIndex) throws SQLException {
throw new UnsupportedOperationException();
@@ -1337,14 +1341,14 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>java.sql.Time</code> object.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code java.sql.Time} object.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code null}
* @throws SQLException if the given column index is out of bounds,
* the cursor is not on a valid row, or this method fails
*/
@@ -1354,14 +1358,14 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>java.sql.Timestamp</code> object.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code java.sql.Timestamp} object.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return the column value; if the value is SQL <code>NULL</code>, the
- * result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL}, the
+ * result is {@code null}
* @throws SQLException if the given column index is out of bounds,
* the cursor is not on a valid row, or this method fails
*/
@@ -1371,33 +1375,33 @@
/**
* Retrieves the value of the designated column in the current row of this
- * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+ * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
* object.
*
* A column value can be retrieved as a stream of ASCII characters
* and then read in chunks from the stream. This method is particularly
- * suitable for retrieving large <code>LONGVARCHAR</code> values. The JDBC
+ * suitable for retrieving large {@code LONGVARCHAR} values. The JDBC
* driver will do any necessary conversion from the database format into ASCII.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
* call to a get method implicitly closes the stream. . Also, a
- * stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
+ * stream may return {@code 0} for {@code CachedRowSetImpl.available()}
* whether there is data available or not.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @return a Java input stream that delivers the database column value
* as a stream of one-byte ASCII characters. If the value is SQL
- * <code>NULL</code>, the result is <code>null</code>.
+ * {@code NULL}, the result is {@code null}.
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
- * <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
- * bold SQL type designates the recommended return types that this method is
- * used to retrieve.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code CHAR, VARCHAR}, <b>{@code LONGVARCHAR}</b>,
+ * {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value. The
+ * bold SQL type designates the recommended return types
+ * that this method is used to retrieve.
* @see #getAsciiStream(String)
*/
public java.io.InputStream getAsciiStream(int columnIndex) throws SQLException {
@@ -1416,8 +1420,8 @@
* stream may return 0 for available() whether there is data
* available or not.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @return a Java input stream that delivers the database column value
* as a stream of two byte Unicode characters. If the value is SQL NULL
@@ -1432,30 +1436,30 @@
/**
* Retrieves the value of the designated column in the current row of this
- * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+ * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
* object.
* <P>
* A column value can be retrieved as a stream of uninterpreted bytes
* and then read in chunks from the stream. This method is particularly
- * suitable for retrieving large <code>LONGVARBINARY</code> values.
+ * suitable for retrieving large {@code LONGVARBINARY} values.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
* call to a get method implicitly closes the stream. Also, a
- * stream may return <code>0</code> for
- * <code>CachedRowSetImpl.available()</code> whether there is data
+ * stream may return {@code 0} for
+ * {@code CachedRowSetImpl.available()} whether there is data
* available or not.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
* @return a Java input stream that delivers the database column value
- * as a stream of uninterpreted bytes. If the value is SQL <code>NULL</code>
- * then the result is <code>null</code>.
+ * as a stream of uninterpreted bytes. If the value is SQL {@code NULL}
+ * then the result is {@code null}.
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
+ * SQL {@code BINARY, VARBINARY} or <b>{@code LONGVARBINARY}</b>.
* The bold type indicates the SQL type that this method is recommened
* to retrieve.
* @see #getBinaryStream(String)
@@ -1472,19 +1476,19 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>String</code> object.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * of the current row as a {@code String} object.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
- * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, <b>CHAR</b>,
- * <b>VARCHAR</b></code> or <code>LONGVARCHAR<</code> value. The bold SQL type
- * designates the recommended return type.
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+ * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT,}
+ * <b>{@code CHAR, VARCHAR}</b> or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the recommended return type.
*/
public String getString(String columnName) throws SQLException {
throw new UnsupportedOperationException();
@@ -1492,17 +1496,17 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>boolean</code> value.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value as a <code>boolean</code> in the Java programming
- * language; if the value is SQL <code>NULL</code>,
- * the result is <code>false</code>
+ * of the current row as a {@code boolean} value.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value as a {@code boolean} in the Java programming
+ * language; if the value is SQL {@code NULL},
+ * the result is {@code false}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>BOOLEAN</code> value
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code BOOLEAN} value
* @see #getBoolean(int)
*/
public boolean getBoolean(String columnName) throws SQLException {
@@ -1511,19 +1515,19 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>byte</code> value.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value as a <code>byte</code> in the Java programming
- * language; if the value is SQL <code>NULL</code>, the result is <code>0</code>
+ * of the current row as a {@code byte} value.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value as a {@code byte} in the Java programming
+ * language; if the value is SQL {@code NULL}, the result is {@code 0}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code><B>TINYINT</B>, SMALLINT, INTEGER,
- * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
- * VARCHAR</code> or <code>LONGVARCHAR</code> value. The
- * bold type designates the recommended return type
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL <b>{@code TINYINT}</b>,
+ * {@code SMALLINT, INTEGER, BIGINT, REAL, FLOAT, DOUBLE,
+ * DECIMAL, NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR}
+ * value. The bold type designates the recommended return type.
*/
public byte getByte(String columnName) throws SQLException {
throw new UnsupportedOperationException();
@@ -1531,19 +1535,20 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>short</code> value.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>0</code>
+ * of the current row as a {@code short} value.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code 0}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TINYINT, <b>SMALLINT</b>, INTEGER
- * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
- * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
- * designates the recommended return type.
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code TINYINT,}
+ * <b>{@code SMALLINT}</b>, {@code INTEGER,
+ * BIGINT, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
+ * VARCHAR} or {@code LONGVARCHAR} value. The bold SQL type
+ * designates the recommended return type.
* @see #getShort(int)
*/
public short getShort(String columnName) throws SQLException {
@@ -1552,20 +1557,21 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as an <code>int</code> value.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>0</code>
+ * of the current row as an {@code int} value.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code 0}
* @throws SQLException if (1) the given column name is not the name
- * of a column in this rowset,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, SMALLINT, <b>INTEGER</b>, BIGINT, REAL
- * FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
- * recommended return type.
+ * of a column in this rowset,
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code TINYINT, SMALLINT,} <b>{@code INTEGER}</b>,
+ * {@code BIGINT, REAL, FLOAT, DOUBLE, DECIMAL,
+ * NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the
+ * recommended return type.
*/
public int getInt(String columnName) throws SQLException {
throw new UnsupportedOperationException();
@@ -1573,19 +1579,19 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>long</code> value.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>0</code>
+ * of the current row as a {@code long} value.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code 0}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
- * <b>BIGINT</b>, REAL, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
- * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
- * designates the recommended return type.
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,}
+ * <b>{@code BIGINT}</b>, {@code REAL, FLOAT, DOUBLE, DECIMAL,
+ * NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the recommended return type.
* @see #getLong(int)
*/
public long getLong(String columnName) throws SQLException {
@@ -1594,19 +1600,19 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>float</code> value.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>0</code>
+ * of the current row as a {@code float} value.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code 0}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
- * BIGINT, <b>REAL</b>, FLOAT, DOUBLE, DECIMAL, NUMERIC, BIT, CHAR,
- * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
- * designates the recommended return type.
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+ * BIGINT,} <b>{@code REAL}</b>, {@code FLOAT, DOUBLE, DECIMAL,
+ * NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the recommended return type.
* @see #getFloat(String)
*/
public float getFloat(String columnName) throws SQLException {
@@ -1615,20 +1621,20 @@
/**
* Retrieves the value stored in the designated column
- * of the current row of this <code>CachedRowSetImpl</code> object
- * as a <code>double</code> value.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>0</code>
+ * of the current row of this {@code CachedRowSetImpl} object
+ * as a {@code double} value.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code 0}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
- * BIGINT, REAL, <b>FLOAT</b>, <b>DOUBLE</b>, DECIMAL, NUMERIC, BIT, CHAR,
- * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
- * designates the recommended return types.
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+ * BIGINT, REAL,} <b>{@code FLOAT, DOUBLE}</b>, {@code DECIMAL,
+ * NUMERIC, BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the recommended return types.
* @see #getDouble(int)
*/
public double getDouble(String columnName) throws SQLException {
@@ -1637,22 +1643,22 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>java.math.BigDecimal</code> object.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
+ * of the current row as a {@code java.math.BigDecimal} object.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
* @param scale the number of digits to the right of the decimal point
- * @return a java.math.BugDecimal object with <code><i>scale</i></code>
- * number of digits to the right of the decimal point.
+ * @return a java.math.BugDecimal object with <i>{@code scale}</i>
+ * number of digits to the right of the decimal point.
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
- * BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
- * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
- * designates the recommended return type that this method is used to
- * retrieve.
- * @deprecated Use the <code>getBigDecimal(String columnName)</code>
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+ * BIGINT, REAL, FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
+ * {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the recommended return type
+ * that this method is used to retrieve.
+ * @deprecated Use the {@code getBigDecimal(String columnName)}
* method instead
*/
@Deprecated
@@ -1662,19 +1668,19 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>byte</code> array.
+ * of the current row as a {@code byte} array.
* The bytes represent the raw values returned by the driver.
*
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value as a <code>byte</code> array in the Java programming
- * language; if the value is SQL <code>NULL</code>, the result is <code>null</code>
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value as a {@code byte} array in the Java programming
+ * language; if the value is SQL {@code NULL}, the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code><b>BINARY</b>, <b>VARBINARY</b>
- * </code> or <code>LONGVARBINARY</code> values
- * The bold SQL type designates the recommended return type.
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL <b>{@code BINARY, VARBINARY}</b>
+ * or {@code LONGVARBINARY} values.
+ * The bold SQL type designates the recommended return type.
* @see #getBytes(int)
*/
public byte[] getBytes(String columnName) throws SQLException {
@@ -1683,17 +1689,17 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>java.sql.Date</code> object.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * of the current row as a {@code java.sql.Date} object.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>DATE</code> or
- * <code>TIMESTAMP</code> value
+ * column does not store an SQL {@code DATE} or
+ * {@code TIMESTAMP} value
*/
public java.sql.Date getDate(String columnName) throws SQLException {
throw new UnsupportedOperationException();
@@ -1701,12 +1707,12 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>java.sql.Time</code> object.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * of the current row as a {@code java.sql.Time} object.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if the given column name does not match one of
* this rowset's column names or the cursor is not on one of
* this rowset's rows or its insert row
@@ -1717,12 +1723,12 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>java.sql.Timestamp</code> object.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * of the current row as a {@code java.sql.Timestamp} object.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if the given column name does not match one of
* this rowset's column names or the cursor is not on one of
* this rowset's rows or its insert row
@@ -1733,32 +1739,32 @@
/**
* Retrieves the value of the designated column in the current row of this
- * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+ * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
* object.
*
* A column value can be retrieved as a stream of ASCII characters
* and then read in chunks from the stream. This method is particularly
- * suitable for retrieving large <code>LONGVARCHAR</code> values. The
- * <code>SyncProvider</code> will rely on the JDBC driver to do any necessary
+ * suitable for retrieving large {@code LONGVARCHAR} values. The
+ * {@code SyncProvider} will rely on the JDBC driver to do any necessary
* conversion from the database format into ASCII format.
*
* <P><B>Note:</B> All the data in the returned stream must
* be read prior to getting the value of any other column. The
- * next call to a <code>getXXX</code> method implicitly closes the stream.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
+ * next call to a {@code getXXX} method implicitly closes the stream.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
* @return a Java input stream that delivers the database column value
* as a stream of one-byte ASCII characters. If the value is SQL
- * <code>NULL</code>, the result is <code>null</code>.
+ * {@code NULL}, the result is {@code null}.
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>CHAR, VARCHAR</code>, <code><b>LONGVARCHAR</b></code>
- * <code>BINARY, VARBINARY</code> or <code>LONGVARBINARY</code> value. The
- * bold SQL type designates the recommended return types that this method is
- * used to retrieve.
+ * a column in this rowset
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code CHAR, VARCHAR}, <b>{@code LONGVARCHAR}</b>,
+ * {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value. The
+ * bold SQL type designates the recommended return types
+ * that this method is used to retrieve.
* @see #getAsciiStream(int)
*/
public java.io.InputStream getAsciiStream(String columnName) throws SQLException {
@@ -1769,23 +1775,23 @@
/**
* A column value can be retrieved as a stream of Unicode characters
* and then read in chunks from the stream. This method is particularly
- * suitable for retrieving large <code>LONGVARCHAR</code> values.
+ * suitable for retrieving large {@code LONGVARCHAR} values.
* The JDBC driver will do any necessary conversion from the database
* format into Unicode.
*
* <P><B>Note:</B> All the data in the returned stream must
* be read prior to getting the value of any other column. The
- * next call to a <code>getXXX</code> method implicitly closes the stream.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
+ * next call to a {@code getXXX} method implicitly closes the stream.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
* @return a Java input stream that delivers the database column value
* as a stream of two-byte Unicode characters. If the value is
- * SQL <code>NULL</code>, the result is <code>null</code>.
+ * SQL {@code NULL}, the result is {@code null}.
* @throws SQLException if the given column name does not match one of
* this rowset's column names or the cursor is not on one of
* this rowset's rows or its insert row
- * @deprecated use the method <code>getCharacterStream</code> instead
+ * @deprecated use the method {@code getCharacterStream} instead
*/
@Deprecated
public java.io.InputStream getUnicodeStream(String columnName) throws SQLException {
@@ -1794,30 +1800,30 @@
/**
* Retrieves the value of the designated column in the current row of this
- * <code>CachedRowSetImpl</code> object as a <code>java.io.InputStream</code>
+ * {@code CachedRowSetImpl} object as a {@code java.io.InputStream}
* object.
* <P>
* A column value can be retrieved as a stream of uninterpreted bytes
* and then read in chunks from the stream. This method is particularly
- * suitable for retrieving large <code>LONGVARBINARY</code> values.
+ * suitable for retrieving large {@code LONGVARBINARY} values.
*
* <P><B>Note:</B> All the data in the returned stream must be
* read prior to getting the value of any other column. The next
* call to a get method implicitly closes the stream. Also, a
- * stream may return <code>0</code> for <code>CachedRowSetImpl.available()</code>
+ * stream may return {@code 0} for {@code CachedRowSetImpl.available()}
* whether there is data available or not.
*
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
* @return a Java input stream that delivers the database column value
* as a stream of uninterpreted bytes. If the value is SQL
- * <code>NULL</code>, the result is <code>null</code>.
+ * {@code NULL}, the result is {@code null}.
* @throws SQLException if (1) the given column name is unknown,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>BINARY, VARBINARY</code> or <code><b>LONGVARBINARY</b></code>
- * The bold type indicates the SQL type that this method is recommened
- * to retrieve.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code BINARY, VARBINARY} or <b>{@code LONGVARBINARY}</b>
+ * The bold type indicates the SQL type that this method is recommened
+ * to retrieve.
* @see #getBinaryStream(int)
*
*/
@@ -1831,17 +1837,17 @@
//=====================================================================
/**
- * The first warning reported by calls on this <code>CachedRowSetImpl</code>
- * object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
- * be chained to this <code>SQLWarning</code>.
+ * The first warning reported by calls on this {@code CachedRowSetImpl}
+ * object is returned. Subsequent {@code CachedRowSetImpl} warnings will
+ * be chained to this {@code SQLWarning}.
*
* <P>The warning chain is automatically cleared each time a new
* row is read.
*
* <P><B>Note:</B> This warning chain only covers warnings caused
- * by <code>ResultSet</code> methods. Any warning caused by statement
+ * by {@code ResultSet} methods. Any warning caused by statement
* methods (such as reading OUT parameters) will be chained on the
- * <code>Statement</code> object.
+ * {@code Statement} object.
*
* @return the first SQLWarning or null
*/
@@ -1850,10 +1856,10 @@
}
/**
- * Clears all the warnings reporeted for the <code>CachedRowSetImpl</code>
- * object. After a call to this method, the <code>getWarnings</code> method
- * returns <code>null</code> until a new warning is reported for this
- * <code>CachedRowSetImpl</code> object.
+ * Clears all the warnings reporeted for the {@code CachedRowSetImpl}
+ * object. After a call to this method, the {@code getWarnings} method
+ * returns {@code null} until a new warning is reported for this
+ * {@code CachedRowSetImpl} object.
*/
public void clearWarnings() {
throw new UnsupportedOperationException();
@@ -1861,25 +1867,25 @@
/**
* Retrieves the name of the SQL cursor used by this
- * <code>CachedRowSetImpl</code> object.
+ * {@code CachedRowSetImpl} object.
*
* <P>In SQL, a result table is retrieved through a cursor that is
- * named. The current row of a <code>ResultSet</code> can be updated or deleted
+ * named. The current row of a {@code ResultSet} can be updated or deleted
* using a positioned update/delete statement that references the
* cursor name. To ensure that the cursor has the proper isolation
- * level to support an update operation, the cursor's <code>SELECT</code>
- * statement should be of the form <code>select for update</code>.
- * If the <code>for update</code> clause
+ * level to support an update operation, the cursor's {@code SELECT}
+ * statement should be of the form {@code select for update}.
+ * If the {@code for update} clause
* is omitted, positioned updates may fail.
*
* <P>JDBC supports this SQL feature by providing the name of the
- * SQL cursor used by a <code>ResultSet</code> object. The current row
+ * SQL cursor used by a {@code ResultSet} object. The current row
* of a result set is also the current row of this SQL cursor.
*
* <P><B>Note:</B> If positioned updates are not supported, an
- * <code>SQLException</code> is thrown.
- *
- * @return the SQL cursor name for this <code>CachedRowSetImpl</code> object's
+ * {@code SQLException} is thrown.
+ *
+ * @return the SQL cursor name for this {@code CachedRowSetImpl} object's
* cursor
* @throws SQLException if an error occurs
*/
@@ -1888,12 +1894,12 @@
}
/**
- * Retrieves a <code>ResultSetMetaData</code> object instance that
- * contains information about the <code>CachedRowSet</code> object.
+ * Retrieves a {@code ResultSetMetaData} object instance that
+ * contains information about the {@code CachedRowSet} object.
* However, applications should cast the returned object to a
- * <code>RowSetMetaData</code> interface implementation. In the
+ * {@code RowSetMetaData} interface implementation. In the
* reference implementation, this cast can be done on the
- * <code>RowSetMetaDataImpl</code> class.
+ * {@code RowSetMetaDataImpl} class.
* <P>
* For example:
* <pre>
@@ -1907,10 +1913,10 @@
* crs.setMetaData(metaData);
* </pre>
*
- * @return the <code>ResultSetMetaData</code> object that describes this
- * <code>CachedRowSetImpl</code> object's columns
+ * @return the {@code ResultSetMetaData} object that describes this
+ * {@code CachedRowSetImpl} object's columns
* @throws SQLException if an error occurs in generating the RowSet
- * meta data; or if the <code>CachedRowSetImpl</code> is empty.
+ * meta data; or if the {@code CachedRowSetImpl} is empty.
* @see javax.sql.RowSetMetaData
*/
public ResultSetMetaData getMetaData() throws SQLException {
@@ -1920,10 +1926,10 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as an
- * <code>Object</code> value.
+ * of this {@code CachedRowSetImpl} object as an
+ * {@code Object} value.
* <P>
- * The type of the <code>Object</code> will be the default
+ * The type of the {@code Object} will be the default
* Java object type corresponding to the column's SQL type,
* following the mapping for built-in types specified in the JDBC 3.0
* specification.
@@ -1931,23 +1937,23 @@
* This method may also be used to read datatabase-specific
* abstract data types.
* <P>
- * This implementation of the method <code>getObject</code> extends its
+ * This implementation of the method {@code getObject} extends its
* behavior so that it gets the attributes of an SQL structured type
- * as an array of <code>Object</code> values. This method also custom
+ * as an array of {@code Object} values. This method also custom
* maps SQL user-defined types to classes in the Java programming language.
* When the specified column contains
* a structured or distinct value, the behavior of this method is as
- * if it were a call to the method <code>getObject(columnIndex,
- * this.getStatement().getConnection().getTypeMap())</code>.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * if it were a call to the method {@code getObject(columnIndex,
+ * this.getStatement().getConnection().getTypeMap())}.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return a <code>java.lang.Object</code> holding the column value;
- * if the value is SQL <code>NULL</code>, the result is <code>null</code>
+ * @return a {@code java.lang.Object} holding the column value;
+ * if the value is SQL {@code NULL}, the result is {@code null}
* @throws SQLException if the given column index is out of bounds,
* the cursor is not on a valid row, or there is a problem getting
- * the <code>Class</code> object for a custom mapping
+ * the {@code Class} object for a custom mapping
* @see #getObject(String)
*/
public Object getObject(int columnIndex) throws SQLException {
@@ -1956,10 +1962,10 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as an
- * <code>Object</code> value.
+ * of this {@code CachedRowSetImpl} object as an
+ * {@code Object} value.
* <P>
- * The type of the <code>Object</code> will be the default
+ * The type of the {@code Object} will be the default
* Java object type corresponding to the column's SQL type,
* following the mapping for built-in types specified in the JDBC 3.0
* specification.
@@ -1967,23 +1973,23 @@
* This method may also be used to read datatabase-specific
* abstract data types.
* <P>
- * This implementation of the method <code>getObject</code> extends its
+ * This implementation of the method {@code getObject} extends its
* behavior so that it gets the attributes of an SQL structured type
- * as an array of <code>Object</code> values. This method also custom
+ * as an array of {@code Object} values. This method also custom
* maps SQL user-defined types to classes
* in the Java programming language. When the specified column contains
* a structured or distinct value, the behavior of this method is as
- * if it were a call to the method <code>getObject(columnIndex,
- * this.getStatement().getConnection().getTypeMap())</code>.
- *
- * @param columnName a <code>String</code> object that must match the
+ * if it were a call to the method {@code getObject(columnIndex,
+ * this.getStatement().getConnection().getTypeMap())}.
+ *
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @return a <code>java.lang.Object</code> holding the column value;
- * if the value is SQL <code>NULL</code>, the result is <code>null</code>
+ * @return a {@code java.lang.Object} holding the column value;
+ * if the value is SQL {@code NULL}, the result is {@code null}
* @throws SQLException if (1) the given column name does not match one of
* this rowset's column names, (2) the cursor is not
* on a valid row, or (3) there is a problem getting
- * the <code>Class</code> object for a custom mapping
+ * the {@code Class} object for a custom mapping
* @see #getObject(int)
*/
public Object getObject(String columnName) throws SQLException {
@@ -1993,10 +1999,10 @@
//----------------------------------------------------------------
/**
- * Maps the given column name for one of this <code>CachedRowSetImpl</code>
+ * Maps the given column name for one of this {@code CachedRowSetImpl}
* object's columns to its column number.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @return the column index of the given column name
* @throws SQLException if the given column name does not match one
@@ -2014,25 +2020,25 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>java.io.Reader</code> object.
+ * of the current row as a {@code java.io.Reader} object.
*
* <P><B>Note:</B> All the data in the returned stream must
* be read prior to getting the value of any other column. The
- * next call to a <code>getXXX</code> method implicitly closes the stream.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * next call to a {@code getXXX} method implicitly closes the stream.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
* @return a Java character stream that delivers the database column value
* as a stream of two-byte unicode characters in a
- * <code>java.io.Reader</code> object. If the value is
- * SQL <code>NULL</code>, the result is <code>null</code>.
+ * {@code java.io.Reader} object. If the value is
+ * SQL {@code NULL}, the result is {@code null}.
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>, BINARY, VARBINARY</code> or
- * <code>LONGVARBINARY</code> value.
- * The bold SQL type designates the recommended return type.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code CHAR, VARCHAR,} <b>{@code LONGVARCHAR}</b>,
+ * {@code BINARY, VARBINARY} or {@code LONGVARBINARY} value.
+ * The bold SQL type designates the recommended return type.
* @see #getCharacterStream(String)
*/
public java.io.Reader getCharacterStream(int columnIndex) throws SQLException{
@@ -2041,23 +2047,24 @@
/**
* Retrieves the value stored in the designated column
- * of the current row as a <code>java.io.Reader</code> object.
+ * of the current row as a {@code java.io.Reader} object.
*
* <P><B>Note:</B> All the data in the returned stream must
* be read prior to getting the value of any other column. The
- * next call to a <code>getXXX</code> method implicitly closes the stream.
- *
- * @param columnName a <code>String</code> object giving the SQL name of
- * a column in this <code>CachedRowSetImpl</code> object
+ * next call to a {@code getXXX} method implicitly closes the stream.
+ *
+ * @param columnName a {@code String} object giving the SQL name of
+ * a column in this {@code CachedRowSetImpl} object
* @return a Java input stream that delivers the database column value
* as a stream of two-byte Unicode characters. If the value is
- * SQL <code>NULL</code>, the result is <code>null</code>.
+ * SQL {@code NULL}, the result is {@code null}.
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>CHAR, VARCHAR, <b>LONGVARCHAR</b>,
- * BINARY, VARYBINARY</code> or <code>LONGVARBINARY</code> value.
- * The bold SQL type designates the recommended return type.
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code CHAR, VARCHAR,}
+ * <b>{@code LONGVARCHAR}</b>,
+ * {@code BINARY, VARYBINARY} or {@code LONGVARBINARY} value.
+ * The bold SQL type designates the recommended return type.
*/
public java.io.Reader getCharacterStream(String columnName) throws SQLException {
throw new UnsupportedOperationException();
@@ -2065,21 +2072,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>java.math.BigDecimal</code> object.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code java.math.BigDecimal} object.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @return a <code>java.math.BigDecimal</code> value with full precision;
- * if the value is SQL <code>NULL</code>, the result is <code>null</code>
+ * @return a {@code java.math.BigDecimal} value with full precision;
+ * if the value is SQL {@code NULL}, the result is {@code null}
* @throws SQLException if (1) the given column index is out of bounds,
- * (2) the cursor is not on one of this rowset's rows or its
- * insert row, or (3) the designated column does not store an
- * SQL <code>TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
- * FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT, CHAR, VARCHAR</code>
- * or <code>LONGVARCHAR</code> value. The bold SQL type designates the
- * recommended return types that this method is used to retrieve.
+ * (2) the cursor is not on one of this rowset's rows or its
+ * insert row, or (3) the designated column does not store an
+ * SQL {@code TINYINT, SMALLINT, INTEGER, BIGINT, REAL,
+ * FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
+ * {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the
+ * recommended return types that this method is used to retrieve.
* @see #getBigDecimal(String)
*/
public BigDecimal getBigDecimal(int columnIndex) throws SQLException {
@@ -2088,21 +2096,21 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>java.math.BigDecimal</code> object.
- *
- * @param columnName a <code>String</code> object that must match the
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code java.math.BigDecimal} object.
+ *
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @return a <code>java.math.BigDecimal</code> value with full precision;
- * if the value is SQL <code>NULL</code>, the result is <code>null</code>
+ * @return a {@code java.math.BigDecimal} value with full precision;
+ * if the value is SQL {@code NULL}, the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
- * a column in this rowset, (2) the cursor is not on one of
- * this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TINYINT, SMALLINT, INTEGER
- * BIGINT, REAL, FLOAT, DOUBLE, <b>DECIMAL</b>, <b>NUMERIC</b>, BIT CHAR,
- * VARCHAR</code> or <code>LONGVARCHAR</code> value. The bold SQL type
- * designates the recommended return type that this method is used to
- * retrieve
+ * a column in this rowset, (2) the cursor is not on one of
+ * this rowset's rows or its insert row, or (3) the designated
+ * column does not store an SQL {@code TINYINT, SMALLINT, INTEGER,
+ * BIGINT, REAL, FLOAT, DOUBLE,} <b>{@code DECIMAL, NUMERIC}</b>,
+ * {@code BIT, CHAR, VARCHAR} or {@code LONGVARCHAR} value.
+ * The bold SQL type designates the recommended return type
+ * that this method is used to retrieve.
* @see #getBigDecimal(int)
*/
public BigDecimal getBigDecimal(String columnName) throws SQLException {
@@ -2114,7 +2122,7 @@
//---------------------------------------------------------------------
/**
- * Returns the number of rows in this <code>CachedRowSetImpl</code> object.
+ * Returns the number of rows in this {@code CachedRowSetImpl} object.
*
* @return number of rows in the rowset
*/
@@ -2124,10 +2132,10 @@
/**
* Indicates whether the cursor is before the first row in this
- * <code>CachedRowSetImpl</code> object.
- *
- * @return <code>true</code> if the cursor is before the first row;
- * <code>false</code> otherwise or if the rowset contains no rows
+ * {@code CachedRowSetImpl} object.
+ *
+ * @return {@code true} if the cursor is before the first row;
+ * {@code false} otherwise or if the rowset contains no rows
* @throws SQLException if an error occurs
*/
public boolean isBeforeFirst() throws SQLException {
@@ -2136,10 +2144,10 @@
/**
* Indicates whether the cursor is after the last row in this
- * <code>CachedRowSetImpl</code> object.
- *
- * @return <code>true</code> if the cursor is after the last row;
- * <code>false</code> otherwise or if the rowset contains no rows
+ * {@code CachedRowSetImpl} object.
+ *
+ * @return {@code true} if the cursor is after the last row;
+ * {@code false} otherwise or if the rowset contains no rows
* @throws SQLException if an error occurs
*/
public boolean isAfterLast() throws SQLException {
@@ -2148,10 +2156,10 @@
/**
* Indicates whether the cursor is on the first row in this
- * <code>CachedRowSetImpl</code> object.
- *
- * @return <code>true</code> if the cursor is on the first row;
- * <code>false</code> otherwise or if the rowset contains no rows
+ * {@code CachedRowSetImpl} object.
+ *
+ * @return {@code true} if the cursor is on the first row;
+ * {@code false} otherwise or if the rowset contains no rows
* @throws SQLException if an error occurs
*/
public boolean isFirst() throws SQLException {
@@ -2160,14 +2168,14 @@
/**
* Indicates whether the cursor is on the last row in this
- * <code>CachedRowSetImpl</code> object.
+ * {@code CachedRowSetImpl} object.
* <P>
- * Note: Calling the method <code>isLast</code> may be expensive
+ * Note: Calling the method {@code isLast} may be expensive
* because the JDBC driver might need to fetch ahead one row in order
* to determine whether the current row is the last row in this rowset.
*
- * @return <code>true</code> if the cursor is on the last row;
- * <code>false</code> otherwise or if this rowset contains no rows
+ * @return {@code true} if the cursor is on the last row;
+ * {@code false} otherwise or if this rowset contains no rows
* @throws SQLException if an error occurs
*/
public boolean isLast() throws SQLException {
@@ -2175,19 +2183,19 @@
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the front of
+ * Moves this {@code CachedRowSetImpl} object's cursor to the front of
* the rowset, just before the first row. This method has no effect if
* this rowset contains no rows.
*
* @throws SQLException if an error occurs or the type of this rowset
- * is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+ * is {@code ResultSet.TYPE_FORWARD_ONLY}
*/
public void beforeFirst() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the end of
+ * Moves this {@code CachedRowSetImpl} object's cursor to the end of
* the rowset, just after the last row. This method has no effect if
* this rowset contains no rows.
*
@@ -2198,34 +2206,34 @@
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the first row
- * and returns <code>true</code> if the operation was successful. This
+ * Moves this {@code CachedRowSetImpl} object's cursor to the first row
+ * and returns {@code true} if the operation was successful. This
* method also notifies registered listeners that the cursor has moved.
*
- * @return <code>true</code> if the cursor is on a valid row;
- * <code>false</code> otherwise or if there are no rows in this
- * <code>CachedRowSetImpl</code> object
+ * @return {@code true} if the cursor is on a valid row;
+ * {@code false} otherwise or if there are no rows in this
+ * {@code CachedRowSetImpl} object
* @throws SQLException if the type of this rowset
- * is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+ * is {@code ResultSet.TYPE_FORWARD_ONLY}
*/
public boolean first() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the first
- * row and returns <code>true</code> if the operation is successful.
+ * Moves this {@code CachedRowSetImpl} object's cursor to the first
+ * row and returns {@code true} if the operation is successful.
* <P>
- * This method is called internally by the methods <code>first</code>,
- * <code>isFirst</code>, and <code>absolute</code>.
- * It in turn calls the method <code>internalNext</code> in order to
+ * This method is called internally by the methods {@code first},
+ * {@code isFirst}, and {@code absolute}.
+ * It in turn calls the method {@code internalNext} in order to
* handle the case where the first row is a deleted row that is not visible.
* <p>
* This is a implementation only method and is not required as a standard
- * implementation of the <code>CachedRowSet</code> interface.
- *
- * @return <code>true</code> if the cursor moved to the first row;
- * <code>false</code> otherwise
+ * implementation of the {@code CachedRowSet} interface.
+ *
+ * @return {@code true} if the cursor moved to the first row;
+ * {@code false} otherwise
* @throws SQLException if an error occurs
*/
protected boolean internalFirst() throws SQLException {
@@ -2233,35 +2241,35 @@
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the last row
- * and returns <code>true</code> if the operation was successful. This
+ * Moves this {@code CachedRowSetImpl} object's cursor to the last row
+ * and returns {@code true} if the operation was successful. This
* method also notifies registered listeners that the cursor has moved.
*
- * @return <code>true</code> if the cursor is on a valid row;
- * <code>false</code> otherwise or if there are no rows in this
- * <code>CachedRowSetImpl</code> object
+ * @return {@code true} if the cursor is on a valid row;
+ * {@code false} otherwise or if there are no rows in this
+ * {@code CachedRowSetImpl} object
* @throws SQLException if the type of this rowset
- * is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+ * is {@code ResultSet.TYPE_FORWARD_ONLY}
*/
public boolean last() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the last
- * row and returns <code>true</code> if the operation is successful.
+ * Moves this {@code CachedRowSetImpl} object's cursor to the last
+ * row and returns {@code true} if the operation is successful.
* <P>
- * This method is called internally by the method <code>last</code>
+ * This method is called internally by the method {@code last}
* when rows have been deleted and the deletions are not visible.
- * The method <code>internalLast</code> handles the case where the
+ * The method {@code internalLast} handles the case where the
* last row is a deleted row that is not visible by in turn calling
- * the method <code>internalPrevious</code>.
+ * the method {@code internalPrevious}.
* <p>
* This is a implementation only method and is not required as a standard
- * implementation of the <code>CachedRowSet</code> interface.
- *
- * @return <code>true</code> if the cursor moved to the last row;
- * <code>false</code> otherwise
+ * implementation of the {@code CachedRowSet} interface.
+ *
+ * @return {@code true} if the cursor moved to the last row;
+ * {@code false} otherwise
* @throws SQLException if an error occurs
*/
protected boolean internalLast() throws SQLException {
@@ -2269,12 +2277,12 @@
}
/**
- * Returns the number of the current row in this <code>CachedRowSetImpl</code>
+ * Returns the number of the current row in this {@code CachedRowSetImpl}
* object. The first row is number 1, the second number 2, and so on.
*
- * @return the number of the current row; <code>0</code> if there is no
+ * @return the number of the current row; {@code 0} if there is no
* current row
- * @throws SQLException if an error occurs; or if the <code>CacheRowSetImpl</code>
+ * @throws SQLException if an error occurs; or if the {@code CacheRowSetImpl}
* is empty
*/
public int getRow() throws SQLException {
@@ -2282,51 +2290,51 @@
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the row number
+ * Moves this {@code CachedRowSetImpl} object's cursor to the row number
* specified.
*
* <p>If the number is positive, the cursor moves to an absolute row with
* respect to the beginning of the rowset. The first row is row 1, the second
* is row 2, and so on. For example, the following command, in which
- * <code>crs</code> is a <code>CachedRowSetImpl</code> object, moves the cursor
+ * {@code crs} is a {@code CachedRowSetImpl} object, moves the cursor
* to the fourth row, starting from the beginning of the rowset.
- * <PRE><code>
+ * <PRE>{@code
*
* crs.absolute(4);
*
- * </code> </PRE>
+ * }</PRE>
* <P>
* If the number is negative, the cursor moves to an absolute row position
* with respect to the end of the rowset. For example, calling
- * <code>absolute(-1)</code> positions the cursor on the last row,
- * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
- * If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
+ * {@code absolute(-1)} positions the cursor on the last row,
+ * {@code absolute(-2)} moves it on the next-to-last row, and so on.
+ * If the {@code CachedRowSetImpl} object {@code crs} has five rows,
* the following command moves the cursor to the fourth-to-last row, which
* in the case of a rowset with five rows, is also the second row, counting
* from the beginning.
- * <PRE><code>
+ * <PRE>{@code
*
* crs.absolute(-4);
*
- * </code> </PRE>
+ * }</PRE>
*
* If the number specified is larger than the number of rows, the cursor
* will move to the position after the last row. If the number specified
* would move the cursor one or more rows before the first row, the cursor
* moves to the position before the first row.
* <P>
- * Note: Calling <code>absolute(1)</code> is the same as calling the
- * method <code>first()</code>. Calling <code>absolute(-1)</code> is the
- * same as calling <code>last()</code>.
+ * Note: Calling {@code absolute(1)} is the same as calling the
+ * method {@code first()}. Calling {@code absolute(-1)} is the
+ * same as calling {@code last()}.
*
* @param row a positive number to indicate the row, starting row numbering from
- * the first row, which is <code>1</code>; a negative number to indicate
+ * the first row, which is {@code 1}; a negative number to indicate
* the row, starting row numbering from the last row, which is
- * <code>-1</code>; it must not be <code>0</code>
- * @return <code>true</code> if the cursor is on the rowset; <code>false</code>
+ * {@code -1}; it must not be {@code 0}
+ * @return {@code true} if the cursor is on the rowset; {@code false}
* otherwise
- * @throws SQLException if the given cursor position is <code>0</code> or the
- * type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+ * @throws SQLException if the given cursor position is {@code 0} or the
+ * type of this rowset is {@code ResultSet.TYPE_FORWARD_ONLY}
*/
public boolean absolute( int row ) throws SQLException {
throw new UnsupportedOperationException();
@@ -2340,80 +2348,80 @@
* If the number is positive, the cursor moves the specified number of
* rows toward the end of the rowset, starting at the current row.
* For example, the following command, in which
- * <code>crs</code> is a <code>CachedRowSetImpl</code> object with 100 rows,
+ * {@code crs} is a {@code CachedRowSetImpl} object with 100 rows,
* moves the cursor forward four rows from the current row. If the
* current row is 50, the cursor would move to row 54.
- * <PRE><code>
+ * <PRE>{@code
*
* crs.relative(4);
*
- * </code> </PRE>
+ * }</PRE>
* <P>
* If the number is negative, the cursor moves back toward the beginning
* the specified number of rows, starting at the current row.
* For example, calling the method
- * <code>absolute(-1)</code> positions the cursor on the last row,
- * <code>absolute(-2)</code> moves it on the next-to-last row, and so on.
- * If the <code>CachedRowSetImpl</code> object <code>crs</code> has five rows,
+ * {@code absolute(-1)} positions the cursor on the last row,
+ * {@code absolute(-2)} moves it on the next-to-last row, and so on.
+ * If the {@code CachedRowSetImpl} object {@code crs} has five rows,
* the following command moves the cursor to the fourth-to-last row, which
* in the case of a rowset with five rows, is also the second row
* from the beginning.
- * <PRE><code>
+ * <PRE>{@code
*
* crs.absolute(-4);
*
- * </code> </PRE>
+ * }</PRE>
*
* If the number specified is larger than the number of rows, the cursor
* will move to the position after the last row. If the number specified
* would move the cursor one or more rows before the first row, the cursor
* moves to the position before the first row. In both cases, this method
- * throws an <code>SQLException</code>.
+ * throws an {@code SQLException}.
* <P>
- * Note: Calling <code>absolute(1)</code> is the same as calling the
- * method <code>first()</code>. Calling <code>absolute(-1)</code> is the
- * same as calling <code>last()</code>. Calling <code>relative(0)</code>
+ * Note: Calling {@code absolute(1)} is the same as calling the
+ * method {@code first()}. Calling {@code absolute(-1)} is the
+ * same as calling {@code last()}. Calling {@code relative(0)}
* is valid, but it does not change the cursor position.
*
- * @param rows an <code>int</code> indicating the number of rows to move
+ * @param rows an {@code int} indicating the number of rows to move
* the cursor, starting at the current row; a positive number
* moves the cursor forward; a negative number moves the cursor
* backward; must not move the cursor past the valid
* rows
- * @return <code>true</code> if the cursor is on a row in this
- * <code>CachedRowSetImpl</code> object; <code>false</code>
+ * @return {@code true} if the cursor is on a row in this
+ * {@code CachedRowSetImpl} object; {@code false}
* otherwise
* @throws SQLException if there are no rows in this rowset, the cursor is
* positioned either before the first row or after the last row, or
- * the rowset is type <code>ResultSet.TYPE_FORWARD_ONLY</code>
+ * the rowset is type {@code ResultSet.TYPE_FORWARD_ONLY}
*/
public boolean relative(int rows) throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Moves this <code>CachedRowSetImpl</code> object's cursor to the
- * previous row and returns <code>true</code> if the cursor is on
- * a valid row or <code>false</code> if it is not.
+ * Moves this {@code CachedRowSetImpl} object's cursor to the
+ * previous row and returns {@code true} if the cursor is on
+ * a valid row or {@code false} if it is not.
* This method also notifies all listeners registered with this
- * <code>CachedRowSetImpl</code> object that its cursor has moved.
+ * {@code CachedRowSetImpl} object that its cursor has moved.
* <P>
- * Note: calling the method <code>previous()</code> is not the same
- * as calling the method <code>relative(-1)</code>. This is true
- * because it is possible to call <code>previous()</code> from the insert
+ * Note: calling the method {@code previous()} is not the same
+ * as calling the method {@code relative(-1)}. This is true
+ * because it is possible to call {@code previous()} from the insert
* row, from after the last row, or from the current row, whereas
- * <code>relative</code> may only be called from the current row.
+ * {@code relative} may only be called from the current row.
* <P>
- * The method <code>previous</code> may used in a <code>while</code>
+ * The method {@code previous} may used in a {@code while}
* loop to iterate through a rowset starting after the last row
- * and moving toward the beginning. The loop ends when <code>previous</code>
- * returns <code>false</code>, meaning that there are no more rows.
+ * and moving toward the beginning. The loop ends when {@code previous}
+ * returns {@code false}, meaning that there are no more rows.
* For example, the following code fragment retrieves all the data in
- * the <code>CachedRowSetImpl</code> object <code>crs</code>, which has
+ * the {@code CachedRowSetImpl} object {@code crs}, which has
* three columns. Note that the cursor must initially be positioned
* after the last row so that the first call to the method
- * <code>previous</code> places the cursor on the last line.
- * <PRE> <code>
+ * {@code previous} places the cursor on the last line.
+ * <PRE>{@code
*
* crs.afterLast();
* while (previous()) {
@@ -2423,33 +2431,33 @@
* System.out.println(name + " " + age + " " + ssn);
* }
*
- * </code> </PRE>
- * This method throws an <code>SQLException</code> if the cursor is not
+ * }</PRE>
+ * This method throws an {@code SQLException} if the cursor is not
* on a row in the rowset, before the first row, or after the last row.
*
- * @return <code>true</code> if the cursor is on a valid row;
- * <code>false</code> if it is before the first row or after the
+ * @return {@code true} if the cursor is on a valid row;
+ * {@code false} if it is before the first row or after the
* last row
* @throws SQLException if the cursor is not on a valid position or the
- * type of this rowset is <code>ResultSet.TYPE_FORWARD_ONLY</code>
+ * type of this rowset is {@code ResultSet.TYPE_FORWARD_ONLY}
*/
public boolean previous() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Moves the cursor to the previous row in this <code>CachedRowSetImpl</code>
+ * Moves the cursor to the previous row in this {@code CachedRowSetImpl}
* object, skipping past deleted rows that are not visible; returns
- * <code>true</code> if the cursor is on a row in this rowset and
- * <code>false</code> when the cursor goes before the first row.
+ * {@code true} if the cursor is on a row in this rowset and
+ * {@code false} when the cursor goes before the first row.
* <P>
- * This method is called internally by the method <code>previous</code>.
+ * This method is called internally by the method {@code previous}.
* <P>
* This is a implementation only method and is not required as a standard
- * implementation of the <code>CachedRowSet</code> interface.
- *
- * @return <code>true</code> if the cursor is on a row in this rowset;
- * <code>false</code> when the cursor reaches the position before
+ * implementation of the {@code CachedRowSet} interface.
+ *
+ * @return {@code true} if the cursor is on a row in this rowset;
+ * {@code false} when the cursor reaches the position before
* the first row
* @throws SQLException if an error occurs
*/
@@ -2463,14 +2471,14 @@
//---------------------------------------------------------------------
/**
- * Indicates whether the current row of this <code>CachedRowSetImpl</code>
+ * Indicates whether the current row of this {@code CachedRowSetImpl}
* object has been updated. The value returned
- * depends on whether this rowset can detect updates: <code>false</code>
+ * depends on whether this rowset can detect updates: {@code false}
* will always be returned if it does not detect updates.
*
- * @return <code>true</code> if the row has been visibly updated
+ * @return {@code true} if the row has been visibly updated
* by the owner or another and updates are detected;
- * <code>false</code> otherwise
+ * {@code false} otherwise
* @throws SQLException if the cursor is on the insert row or not
* not on a valid row
*
@@ -2482,13 +2490,13 @@
/**
* Indicates whether the designated column of the current row of
- * this <code>CachedRowSetImpl</code> object has been updated. The
+ * this {@code CachedRowSetImpl} object has been updated. The
* value returned depends on whether this rowset can detcted updates:
- * <code>false</code> will always be returned if it does not detect updates.
+ * {@code false} will always be returned if it does not detect updates.
*
* @param idx the index identifier of the column that may be have been updated.
- * @return <code>true</code> is the designated column has been updated
- * and the rowset detects updates; <code>false</code> if the rowset has not
+ * @return {@code true} is the designated column has been updated
+ * and the rowset detects updates; {@code false} if the rowset has not
* been updated or the rowset does not detect updates
* @throws SQLException if the cursor is on the insert row or not
* on a valid row
@@ -2500,14 +2508,14 @@
/**
* Indicates whether the designated column of the current row of
- * this <code>CachedRowSetImpl</code> object has been updated. The
+ * this {@code CachedRowSetImpl} object has been updated. The
* value returned depends on whether this rowset can detcted updates:
- * <code>false</code> will always be returned if it does not detect updates.
- *
- * @param columnName the <code>String</code> column name column that may be have
+ * {@code false} will always be returned if it does not detect updates.
+ *
+ * @param columnName the {@code String} column name column that may be have
* been updated.
- * @return <code>true</code> is the designated column has been updated
- * and the rowset detects updates; <code>false</code> if the rowset has not
+ * @return {@code true} is the designated column has been updated
+ * and the rowset detects updates; {@code false} if the rowset has not
* been updated or the rowset does not detect updates
* @throws SQLException if the cursor is on the insert row or not
* on a valid row
@@ -2521,8 +2529,8 @@
* Indicates whether the current row has been inserted. The value returned
* depends on whether or not the rowset can detect visible inserts.
*
- * @return <code>true</code> if a row has been inserted and inserts are detected;
- * <code>false</code> otherwise
+ * @return {@code true} if a row has been inserted and inserts are detected;
+ * {@code false} otherwise
* @throws SQLException if the cursor is on the insert row or not
* not on a valid row
*
@@ -2536,12 +2544,12 @@
* Indicates whether the current row has been deleted. A deleted row
* may leave a visible "hole" in a rowset. This method can be used to
* detect such holes if the rowset can detect deletions. This method
- * will always return <code>false</code> if this rowset cannot detect
+ * will always return {@code false} if this rowset cannot detect
* deletions.
*
- * @return <code>true</code> if (1)the current row is blank, indicating that
+ * @return {@code true} if (1)the current row is blank, indicating that
* the row has been deleted, and (2)deletions are detected;
- * <code>false</code> otherwise
+ * {@code false} otherwise
* @throws SQLException if the cursor is on a valid row in this rowset
* @see DatabaseMetaData#deletesAreDetected
*/
@@ -2551,8 +2559,8 @@
/**
* Sets the designated nullable column in the current row or the
- * insert row of this <code>CachedRowSetImpl</code> object with
- * <code>null</code> value.
+ * insert row of this {@code CachedRowSetImpl} object with
+ * {@code null} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset; however, another method must be called to complete
@@ -2565,15 +2573,15 @@
* <P>
* In order to propagate updates in this rowset to the underlying
* data source, an application must call the method {@link #acceptChanges}
- * after it calls either <code>updateRow</code> or <code>insertRow</code>.
- *
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * after it calls either {@code updateRow} or {@code insertRow}.
+ *
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateNull(int columnIndex) throws SQLException {
throw new UnsupportedOperationException();
@@ -2581,8 +2589,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>boolean</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code boolean} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -2593,14 +2601,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBoolean(int columnIndex, boolean x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2608,8 +2616,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>byte</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code byte} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -2620,14 +2628,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateByte(int columnIndex, byte x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2635,8 +2643,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>short</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code short} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -2647,14 +2655,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateShort(int columnIndex, short x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2662,8 +2670,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>int</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code int} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -2674,14 +2682,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateInt(int columnIndex, int x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2689,8 +2697,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>long</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code long} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -2701,14 +2709,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateLong(int columnIndex, long x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2717,8 +2725,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>float</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code float} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -2729,14 +2737,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateFloat(int columnIndex, float x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2744,8 +2752,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -2756,14 +2764,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateDouble(int columnIndex, double x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2771,8 +2779,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.math.BigDecimal</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.math.BigDecimal} object.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -2783,14 +2791,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBigDecimal(int columnIndex, BigDecimal x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2798,8 +2806,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>String</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code String} object.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -2810,17 +2818,17 @@
* as inserted. Both of these methods must be called before the
* cursor moves to another row.
* <P>
- * The method <code>acceptChanges</code> must be called if the
+ * The method {@code acceptChanges} must be called if the
* updated values are to be written back to the underlying database.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateString(int columnIndex, String x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2828,8 +2836,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>byte</code> array.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code byte} array.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -2840,14 +2848,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBytes(int columnIndex, byte x[]) throws SQLException {
throw new UnsupportedOperationException();
@@ -2855,8 +2863,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Date</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Date} object.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -2867,15 +2875,15 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, (3) the type of the designated column is not
- * an SQL <code>DATE</code> or <code>TIMESTAMP</code>, or
- * (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * an SQL {@code DATE} or {@code TIMESTAMP}, or
+ * (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateDate(int columnIndex, java.sql.Date x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2883,8 +2891,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Time</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Time} object.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -2895,15 +2903,15 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, (3) the type of the designated column is not
- * an SQL <code>TIME</code> or <code>TIMESTAMP</code>, or
- * (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * an SQL {@code TIME} or {@code TIMESTAMP}, or
+ * (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateTime(int columnIndex, java.sql.Time x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2911,8 +2919,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Timestamp</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Timestamp} object.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -2923,16 +2931,16 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, (3) the type of the designated column is not
- * an SQL <code>DATE</code>, <code>TIME</code>, or
- * <code>TIMESTAMP</code>, or (4) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * an SQL {@code DATE}, {@code TIME}, or
+ * {@code TIMESTAMP}, or (4) this rowset is
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateTimestamp(int columnIndex, java.sql.Timestamp x) throws SQLException {
throw new UnsupportedOperationException();
@@ -2940,7 +2948,7 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
+ * row of this {@code CachedRowSetImpl} object with the given
* ASCII stream value.
* <P>
* This method updates a column value in either the current row or
@@ -2952,8 +2960,8 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @param length the number of one-byte ASCII characters in the stream
@@ -2965,8 +2973,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.io.InputStream</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.io.InputStream} object.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -2977,17 +2985,17 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param x the new column value; must be a <code>java.io.InputStream</code>
- * containing <code>BINARY</code>, <code>VARBINARY</code>, or
- * <code>LONGVARBINARY</code> data
+ * @param x the new column value; must be a {@code java.io.InputStream}
+ * containing {@code BINARY}, {@code VARBINARY}, or
+ * {@code LONGVARBINARY} data
* @param length the length of the stream in bytes
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, (3) the data in the stream is not binary, or
- * (4) this rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * (4) this rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBinaryStream(int columnIndex, java.io.InputStream x,int length) throws SQLException {
throw new UnsupportedOperationException();
@@ -2995,8 +3003,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.io.Reader</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.io.Reader} object.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3007,19 +3015,19 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param x the new column value; must be a <code>java.io.Reader</code>
- * containing <code>BINARY</code>, <code>VARBINARY</code>,
- * <code>LONGVARBINARY</code>, <code>CHAR</code>, <code>VARCHAR</code>,
- * or <code>LONGVARCHAR</code> data
+ * @param x the new column value; must be a {@code java.io.Reader}
+ * containing {@code BINARY}, {@code VARBINARY},
+ * {@code LONGVARBINARY}, {@code CHAR}, {@code VARCHAR},
+ * or {@code LONGVARCHAR} data
* @param length the length of the stream in characters
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, (3) the data in the stream is not a binary or
* character type, or (4) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateCharacterStream(int columnIndex, java.io.Reader x, int length) throws SQLException {
throw new UnsupportedOperationException();
@@ -3027,11 +3035,11 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Object</code> value. The <code>scale</code> parameter indicates
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Object} value. The {@code scale} parameter indicates
* the number of digits to the right of the decimal point and is ignored
* if the new column value is not a type that will be mapped to an SQL
- * <code>DECIMAL</code> or <code>NUMERIC</code> value.
+ * {@code DECIMAL} or {@code NUMERIC} value.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3042,16 +3050,16 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @param scale the number of digits to the right of the decimal point (for
- * <code>DECIMAL</code> and <code>NUMERIC</code> types only)
+ * {@code DECIMAL} and {@code NUMERIC} types only)
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateObject(int columnIndex, Object x, int scale) throws SQLException {
throw new UnsupportedOperationException();
@@ -3059,8 +3067,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Object</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Object} value.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3071,14 +3079,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
* @param x the new column value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateObject(int columnIndex, Object x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3087,8 +3095,8 @@
/**
* Sets the designated nullable column in the current row or the
- * insert row of this <code>CachedRowSetImpl</code> object with
- * <code>null</code> value.
+ * insert row of this {@code CachedRowSetImpl} object with
+ * {@code null} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3098,12 +3106,12 @@
* must be called, which will insert the new row into both this rowset
* and the database.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateNull(String columnName) throws SQLException {
throw new UnsupportedOperationException();
@@ -3111,8 +3119,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>boolean</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code boolean} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3123,13 +3131,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBoolean(String columnName, boolean x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3137,8 +3145,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>byte</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code byte} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3149,13 +3157,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateByte(String columnName, byte x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3163,8 +3171,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>short</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code short} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3175,13 +3183,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateShort(String columnName, short x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3189,8 +3197,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>int</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code int} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3201,13 +3209,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateInt(String columnName, int x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3215,8 +3223,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>long</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code long} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3227,13 +3235,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateLong(String columnName, long x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3241,8 +3249,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>float</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code float} value.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3253,13 +3261,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateFloat(String columnName, float x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3267,8 +3275,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3279,13 +3287,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateDouble(String columnName, double x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3293,8 +3301,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.math.BigDecimal</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.math.BigDecimal} object.
* <P>
* This method updates a column value in the current row or the insert
* row of this rowset, but it does not update the database.
@@ -3305,13 +3313,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBigDecimal(String columnName, BigDecimal x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3319,8 +3327,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>String</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code String} object.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3331,13 +3339,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateString(String columnName, String x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3345,8 +3353,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>byte</code> array.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code byte} array.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3357,13 +3365,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBytes(String columnName, byte x[]) throws SQLException {
throw new UnsupportedOperationException();
@@ -3371,8 +3379,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Date</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Date} object.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3383,15 +3391,15 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, (3) the type
- * of the designated column is not an SQL <code>DATE</code> or
- * <code>TIMESTAMP</code>, or (4) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * of the designated column is not an SQL {@code DATE} or
+ * {@code TIMESTAMP}, or (4) this rowset is
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateDate(String columnName, java.sql.Date x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3399,8 +3407,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Time</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Time} object.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3411,15 +3419,15 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, (3) the type
- * of the designated column is not an SQL <code>TIME</code> or
- * <code>TIMESTAMP</code>, or (4) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * of the designated column is not an SQL {@code TIME} or
+ * {@code TIMESTAMP}, or (4) this rowset is
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateTime(String columnName, java.sql.Time x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3427,8 +3435,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Timestamp</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Timestamp} object.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3439,7 +3447,7 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if the given column index is out of bounds or
@@ -3448,9 +3456,9 @@
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, (3) the type
- * of the designated column is not an SQL <code>DATE</code>,
- * <code>TIME</code>, or <code>TIMESTAMP</code>, or (4) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * of the designated column is not an SQL {@code DATE},
+ * {@code TIME}, or {@code TIMESTAMP}, or (4) this
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateTimestamp(String columnName, java.sql.Timestamp x) throws SQLException {
throw new UnsupportedOperationException();
@@ -3458,7 +3466,7 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
+ * row of this {@code CachedRowSetImpl} object with the given
* ASCII stream value.
* <P>
* This method updates a column value in either the current row or
@@ -3470,7 +3478,7 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @param length the number of one-byte ASCII characters in the stream
@@ -3483,8 +3491,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.io.InputStream</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.io.InputStream} object.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3495,17 +3503,17 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param x the new column value; must be a <code>java.io.InputStream</code>
- * containing <code>BINARY</code>, <code>VARBINARY</code>, or
- * <code>LONGVARBINARY</code> data
+ * @param x the new column value; must be a {@code java.io.InputStream}
+ * containing {@code BINARY}, {@code VARBINARY}, or
+ * {@code LONGVARBINARY} data
* @param length the length of the stream in bytes
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, (3) the data
* in the stream is not binary, or (4) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBinaryStream(String columnName, java.io.InputStream x, int length) throws SQLException {
throw new UnsupportedOperationException();
@@ -3513,8 +3521,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.io.Reader</code> object.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.io.Reader} object.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3525,18 +3533,18 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param reader the new column value; must be a
- * <code>java.io.Reader</code> containing <code>BINARY</code>,
- * <code>VARBINARY</code>, <code>LONGVARBINARY</code>, <code>CHAR</code>,
- * <code>VARCHAR</code>, or <code>LONGVARCHAR</code> data
+ * {@code java.io.Reader} containing {@code BINARY},
+ * {@code VARBINARY}, {@code LONGVARBINARY}, {@code CHAR},
+ * {@code VARCHAR}, or {@code LONGVARCHAR} data
* @param length the length of the stream in characters
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, (3) the data
* in the stream is not a binary or character type, or (4) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateCharacterStream(String columnName,
java.io.Reader reader,
@@ -3546,11 +3554,11 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Object</code> value. The <code>scale</code> parameter
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Object} value. The {@code scale} parameter
* indicates the number of digits to the right of the decimal point
* and is ignored if the new column value is not a type that will be
- * mapped to an SQL <code>DECIMAL</code> or <code>NUMERIC</code> value.
+ * mapped to an SQL {@code DECIMAL} or {@code NUMERIC} value.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3561,15 +3569,15 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @param scale the number of digits to the right of the decimal point (for
- * <code>DECIMAL</code> and <code>NUMERIC</code> types only)
+ * {@code DECIMAL} and {@code NUMERIC} types only)
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateObject(String columnName, Object x, int scale) throws SQLException {
throw new UnsupportedOperationException();
@@ -3577,8 +3585,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>Object</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code Object} value.
* <P>
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -3589,20 +3597,20 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
* @param x the new column value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateObject(String columnName, Object x) throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Inserts the contents of this <code>CachedRowSetImpl</code> object's insert
+ * Inserts the contents of this {@code CachedRowSetImpl} object's insert
* row into this rowset immediately following the current row.
* If the current row is the
* position after the last row or before the first row, the new row will
@@ -3614,14 +3622,14 @@
* @throws SQLException if (1) the cursor is not on the insert row,
* (2) one or more of the non-nullable columns in the insert
* row has not been given a value, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void insertRow() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Marks the current row of this <code>CachedRowSetImpl</code> object as
+ * Marks the current row of this {@code CachedRowSetImpl} object as
* updated and notifies listeners registered with this rowset that the
* row has changed.
* <P>
@@ -3631,26 +3639,26 @@
* and the updates made before the cursor moved will be lost.
*
* @throws SQLException if the cursor is on the insert row or this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateRow() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Deletes the current row from this <code>CachedRowSetImpl</code> object and
+ * Deletes the current row from this {@code CachedRowSetImpl} object and
* notifies listeners registered with this rowset that a row has changed.
* This method cannot be called when the cursor is on the insert row.
* <P>
* This method marks the current row as deleted, but it does not delete
* the row from the underlying data source. The method
- * <code>acceptChanges</code> must be called to delete the row in
+ * {@code acceptChanges} must be called to delete the row in
* the data source.
*
* @throws SQLException if (1) this method is called when the cursor
* is on the insert row, before the first row, or after the
* last row or (2) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void deleteRow() throws SQLException {
throw new UnsupportedOperationException();
@@ -3659,7 +3667,7 @@
/**
* Sets the current row with its original value and marks the row as
* not updated, thus undoing any changes made to the row since the
- * last call to the methods <code>updateRow</code> or <code>deleteRow</code>.
+ * last call to the methods {@code updateRow} or {@code deleteRow}.
* This method should be called only when the cursor is on a row in
* this rowset.
*
@@ -3672,11 +3680,11 @@
/**
* Rolls back any updates made to the current row of this
- * <code>CachedRowSetImpl</code> object and notifies listeners that
+ * {@code CachedRowSetImpl} object and notifies listeners that
* a row has changed. To have an effect, this method
- * must be called after an <code>updateXXX</code> method has been
- * called and before the method <code>updateRow</code> has been called.
- * If no updates have been made or the method <code>updateRow</code>
+ * must be called after an {@code updateXXX} method has been
+ * called and before the method {@code updateRow} has been called.
+ * If no updates have been made or the method {@code updateRow}
* has already been called, this method has no effect.
*
* @throws SQLException if the cursor is on the insert row, before the
@@ -3687,39 +3695,39 @@
}
/**
- * Moves the cursor for this <code>CachedRowSetImpl</code> object
+ * Moves the cursor for this {@code CachedRowSetImpl} object
* to the insert row. The current row in the rowset is remembered
* while the cursor is on the insert row.
* <P>
* The insert row is a special row associated with an updatable
* rowset. It is essentially a buffer where a new row may
- * be constructed by calling the appropriate <code>updateXXX</code>
+ * be constructed by calling the appropriate {@code updateXXX}
* methods to assign a value to each column in the row. A complete
* row must be constructed; that is, every column that is not nullable
* must be assigned a value. In order for the new row to become part
- * of this rowset, the method <code>insertRow</code> must be called
+ * of this rowset, the method {@code insertRow} must be called
* before the cursor is moved back to the rowset.
* <P>
* Only certain methods may be invoked while the cursor is on the insert
* row; many methods throw an exception if they are called while the
- * cursor is there. In addition to the <code>updateXXX</code>
- * and <code>insertRow</code> methods, only the <code>getXXX</code> methods
- * may be called when the cursor is on the insert row. A <code>getXXX</code>
- * method should be called on a column only after an <code>updateXXX</code>
+ * cursor is there. In addition to the {@code updateXXX}
+ * and {@code insertRow} methods, only the {@code getXXX} methods
+ * may be called when the cursor is on the insert row. A {@code getXXX}
+ * method should be called on a column only after an {@code updateXXX}
* method has been called on that column; otherwise, the value returned is
* undetermined.
*
- * @throws SQLException if this <code>CachedRowSetImpl</code> object is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * @throws SQLException if this {@code CachedRowSetImpl} object is
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void moveToInsertRow() throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Moves the cursor for this <code>CachedRowSetImpl</code> object to
+ * Moves the cursor for this {@code CachedRowSetImpl} object to
* the current row. The current row is the row the cursor was on
- * when the method <code>moveToInsertRow</code> was called.
+ * when the method {@code moveToInsertRow} was called.
* <P>
* Calling this method has no effect unless it is called while the
* cursor is on the insert row.
@@ -3731,9 +3739,9 @@
}
/**
- * Returns <code>null</code>.
- *
- * @return <code>null</code>
+ * Returns {@code null}.
+ *
+ * @return {@code null}
* @throws SQLException if an error occurs
*/
public Statement getStatement() throws SQLException {
@@ -3742,18 +3750,18 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as an <code>Object</code> in
+ * {@code CachedRowSetImpl} object as an {@code Object} in
* the Java programming language, using the given
- * <code>java.util.Map</code> object to custom map the value if
+ * {@code java.util.Map} object to custom map the value if
* appropriate.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param map a <code>java.util.Map</code> object showing the mapping
+ * @param map a {@code java.util.Map} object showing the mapping
* from SQL type names to classes in the Java programming
* language
- * @return an <code>Object</code> representing the SQL value
+ * @return an {@code Object} representing the SQL value
* @throws SQLException if the given column index is out of bounds or
* the cursor is not on one of this rowset's rows or its
* insert row
@@ -3767,17 +3775,17 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
+ * {@code CachedRowSetImpl} object as a {@code Ref} object
* in the Java programming language.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
+ * @return a {@code Ref} object representing an SQL{@code REF} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>REF</code> value
+ * SQL {@code REF} value
* @see #getRef(String)
*/
public Ref getRef(int columnIndex) throws SQLException {
@@ -3786,17 +3794,17 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
+ * {@code CachedRowSetImpl} object as a {@code Blob} object
* in the Java programming language.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
+ * @return a {@code Blob} object representing an SQL {@code BLOB} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>BLOB</code> value
+ * SQL {@code BLOB} value
* @see #getBlob(String)
*/
public Blob getBlob(int columnIndex) throws SQLException {
@@ -3805,17 +3813,17 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
+ * {@code CachedRowSetImpl} object as a {@code Clob} object
* in the Java programming language.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @return a <code>Clob</code> object representing an SQL <code>CLOB</code> value
+ * @return a {@code Clob} object representing an SQL {@code CLOB} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>CLOB</code> value
+ * SQL {@code CLOB} value
* @see #getClob(String)
*/
public Clob getClob(int columnIndex) throws SQLException {
@@ -3824,18 +3832,18 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as an <code>Array</code> object
+ * {@code CachedRowSetImpl} object as an {@code Array} object
* in the Java programming language.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @return an <code>Array</code> object representing an SQL
- * <code>ARRAY</code> value
+ * @return an {@code Array} object representing an SQL
+ * {@code ARRAY} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>ARRAY</code> value
+ * SQL {@code ARRAY} value
* @see #getArray(String)
*/
public Array getArray(int columnIndex) throws SQLException {
@@ -3844,17 +3852,17 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as an <code>Object</code> in
+ * {@code CachedRowSetImpl} object as an {@code Object} in
* the Java programming language, using the given
- * <code>java.util.Map</code> object to custom map the value if
+ * {@code java.util.Map} object to custom map the value if
* appropriate.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param map a <code>java.util.Map</code> object showing the mapping
+ * @param map a {@code java.util.Map} object showing the mapping
* from SQL type names to classes in the Java programming
* language
- * @return an <code>Object</code> representing the SQL value
+ * @return an {@code Object} representing the SQL value
* @throws SQLException if the given column name is not the name of
* a column in this rowset or the cursor is not on one of
* this rowset's rows or its insert row
@@ -3867,16 +3875,16 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>Ref</code> object
+ * {@code CachedRowSetImpl} object as a {@code Ref} object
* in the Java programming language.
*
- * @param colName a <code>String</code> object that must match the
+ * @param colName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @return a <code>Ref</code> object representing an SQL<code> REF</code> value
+ * @return a {@code Ref} object representing an SQL{@code REF} value
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the column value
- * is not an SQL <code>REF</code> value
+ * is not an SQL {@code REF} value
* @see #getRef(int)
*/
public Ref getRef(String colName) throws SQLException {
@@ -3885,16 +3893,16 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>Blob</code> object
+ * {@code CachedRowSetImpl} object as a {@code Blob} object
* in the Java programming language.
*
- * @param colName a <code>String</code> object that must match the
+ * @param colName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @return a <code>Blob</code> object representing an SQL <code>BLOB</code> value
+ * @return a {@code Blob} object representing an SQL {@code BLOB} value
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>BLOB</code> value
+ * column does not store an SQL {@code BLOB} value
* @see #getBlob(int)
*/
public Blob getBlob(String colName) throws SQLException {
@@ -3903,17 +3911,17 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>Clob</code> object
+ * {@code CachedRowSetImpl} object as a {@code Clob} object
* in the Java programming language.
*
- * @param colName a <code>String</code> object that must match the
+ * @param colName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @return a <code>Clob</code> object representing an SQL
- * <code>CLOB</code> value
+ * @return a {@code Clob} object representing an SQL
+ * {@code CLOB} value
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>CLOB</code> value
+ * column does not store an SQL {@code CLOB} value
* @see #getClob(int)
*/
public Clob getClob(String colName) throws SQLException {
@@ -3922,17 +3930,17 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as an <code>Array</code> object
+ * {@code CachedRowSetImpl} object as an {@code Array} object
* in the Java programming langugage.
*
- * @param colName a <code>String</code> object that must match the
+ * @param colName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @return an <code>Array</code> object representing an SQL
- * <code>ARRAY</code> value
+ * @return an {@code Array} object representing an SQL
+ * {@code ARRAY} value
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>ARRAY</code> value
+ * column does not store an SQL {@code ARRAY} value
* @see #getArray(int)
*/
public Array getArray(String colName) throws SQLException {
@@ -3941,22 +3949,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
- * object, using the given <code>Calendar</code> object to construct an
+ * of this {@code CachedRowSetImpl} object as a {@code java.sql.Date}
+ * object, using the given {@code Calendar} object to construct an
* appropriate millisecond value for the date.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @param cal the <code>java.util.Calendar</code> object to use in
+ * @param cal the {@code java.util.Calendar} object to use in
* constructing the date
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>DATE</code> or
- * <code>TIMESTAMP</code> value
+ * column does not store an SQL {@code DATE} or
+ * {@code TIMESTAMP} value
*/
public java.sql.Date getDate(int columnIndex, Calendar cal) throws SQLException {
throw new UnsupportedOperationException();
@@ -3964,21 +3972,21 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Date</code>
- * object, using the given <code>Calendar</code> object to construct an
+ * of this {@code CachedRowSetImpl} object as a {@code java.sql.Date}
+ * object, using the given {@code Calendar} object to construct an
* appropriate millisecond value for the date.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param cal the <code>java.util.Calendar</code> object to use in
+ * @param cal the {@code java.util.Calendar} object to use in
* constructing the date
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>DATE</code> or
- * <code>TIMESTAMP</code> value
+ * column does not store an SQL {@code DATE} or
+ * {@code TIMESTAMP} value
*/
public java.sql.Date getDate(String columnName, Calendar cal) throws SQLException {
throw new UnsupportedOperationException();
@@ -3986,22 +3994,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
- * object, using the given <code>Calendar</code> object to construct an
+ * of this {@code CachedRowSetImpl} object as a {@code java.sql.Time}
+ * object, using the given {@code Calendar} object to construct an
* appropriate millisecond value for the date.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @param cal the <code>java.util.Calendar</code> object to use in
+ * @param cal the {@code java.util.Calendar} object to use in
* constructing the date
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TIME</code> or
- * <code>TIMESTAMP</code> value
+ * column does not store an SQL {@code TIME} or
+ * {@code TIMESTAMP} value
*/
public java.sql.Time getTime(int columnIndex, Calendar cal) throws SQLException {
throw new UnsupportedOperationException();
@@ -4009,21 +4017,21 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Time</code>
- * object, using the given <code>Calendar</code> object to construct an
+ * of this {@code CachedRowSetImpl} object as a {@code java.sql.Time}
+ * object, using the given {@code Calendar} object to construct an
* appropriate millisecond value for the date.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param cal the <code>java.util.Calendar</code> object to use in
+ * @param cal the {@code java.util.Calendar} object to use in
* constructing the date
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TIME</code> or
- * <code>TIMESTAMP</code> value
+ * column does not store an SQL {@code TIME} or
+ * {@code TIMESTAMP} value
*/
public java.sql.Time getTime(String columnName, Calendar cal) throws SQLException {
throw new UnsupportedOperationException();
@@ -4031,22 +4039,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a <code>java.sql.Timestamp</code>
- * object, using the given <code>Calendar</code> object to construct an
+ * of this {@code CachedRowSetImpl} object as a {@code java.sql.Timestamp}
+ * object, using the given {@code Calendar} object to construct an
* appropriate millisecond value for the date.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in the rowset
- * @param cal the <code>java.util.Calendar</code> object to use in
+ * @param cal the {@code java.util.Calendar} object to use in
* constructing the date
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>TIME</code> or
- * <code>TIMESTAMP</code> value
+ * column does not store an SQL {@code TIME} or
+ * {@code TIMESTAMP} value
*/
public java.sql.Timestamp getTimestamp(int columnIndex, Calendar cal) throws SQLException {
throw new UnsupportedOperationException();
@@ -4054,22 +4062,22 @@
/**
* Retrieves the value of the designated column in the current row
- * of this <code>CachedRowSetImpl</code> object as a
- * <code>java.sql.Timestamp</code> object, using the given
- * <code>Calendar</code> object to construct an appropriate
+ * of this {@code CachedRowSetImpl} object as a
+ * {@code java.sql.Timestamp} object, using the given
+ * {@code Calendar} object to construct an appropriate
* millisecond value for the date.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param cal the <code>java.util.Calendar</code> object to use in
+ * @param cal the {@code java.util.Calendar} object to use in
* constructing the date
- * @return the column value; if the value is SQL <code>NULL</code>,
- * the result is <code>null</code>
+ * @return the column value; if the value is SQL {@code NULL},
+ * the result is {@code null}
* @throws SQLException if (1) the given column name is not the name of
* a column in this rowset, (2) the cursor is not on one of
* this rowset's rows or its insert row, or (3) the designated
- * column does not store an SQL <code>DATE</code>,
- * <code>TIME</code>, or <code>TIMESTAMP</code> value
+ * column does not store an SQL {@code DATE},
+ * {@code TIME}, or {@code TIMESTAMP} value
*/
public java.sql.Timestamp getTimestamp(String columnName, Calendar cal) throws SQLException {
throw new UnsupportedOperationException();
@@ -4080,13 +4088,13 @@
*/
/**
- * Retrieves the <code>Connection</code> object passed to this
- * <code>CachedRowSetImpl</code> object. This connection may be
+ * Retrieves the {@code Connection} object passed to this
+ * {@code CachedRowSetImpl} object. This connection may be
* used to populate this rowset with data or to write data back
* to its underlying data source.
*
- * @return the <code>Connection</code> object passed to this rowset;
- * may be <code>null</code> if there is no connection
+ * @return the {@code Connection} object passed to this rowset;
+ * may be {@code null} if there is no connection
* @throws SQLException if an error occurs
*/
public Connection getConnection() throws SQLException{
@@ -4094,10 +4102,10 @@
}
/**
- * Sets the metadata for this <code>CachedRowSetImpl</code> object
- * with the given <code>RowSetMetaData</code> object.
- *
- * @param md a <code>RowSetMetaData</code> object instance containing
+ * Sets the metadata for this {@code CachedRowSetImpl} object
+ * with the given {@code RowSetMetaData} object.
+ *
+ * @param md a {@code RowSetMetaData} object instance containing
* metadata about the columsn in the rowset
* @throws SQLException if invalid meta data is supplied to the
* rowset
@@ -4108,17 +4116,17 @@
/**
* Returns a result set containing the original value of the rowset. The
- * original value is the state of the <code>CachedRowSetImpl</code> after the
+ * original value is the state of the {@code CachedRowSetImpl} after the
* last population or synchronization (whichever occurred most recently) with
* the data source.
* <p>
* The cursor is positioned before the first row in the result set.
- * Only rows contained in the result set returned by <code>getOriginal()</code>
+ * Only rows contained in the result set returned by {@code getOriginal()}
* are said to have an original value.
*
* @return the original result set of the rowset
* @throws SQLException if an error occurs produce the
- * <code>ResultSet</code> object
+ * {@code ResultSet} object
*/
public ResultSet getOriginal() throws SQLException {
throw new UnsupportedOperationException();
@@ -4127,7 +4135,7 @@
/**
* Returns a result set containing the original value of the current
* row only.
- * The original value is the state of the <code>CachedRowSetImpl</code> after
+ * The original value is the state of the {@code CachedRowSetImpl} after
* the last population or synchronization (whichever occurred most recently)
* with the data source.
*
@@ -4153,7 +4161,7 @@
/**
* Marks all rows in this rowset as being original rows. Any updates
* made to the rows become the original values for the rowset.
- * Calls to the method <code>setOriginal</code> connot be reversed.
+ * Calls to the method {@code setOriginal} connot be reversed.
*
* @throws SQLException if an error occurs
*/
@@ -4165,8 +4173,8 @@
* Returns an identifier for the object (table) that was used to create this
* rowset.
*
- * @return a <code>String</code> object that identifies the table from
- * which this <code>CachedRowSetImpl</code> object was derived
+ * @return a {@code String} object that identifies the table from
+ * which this {@code CachedRowSetImpl} object was derived
* @throws SQLException if an error occurs
*/
public String getTableName() throws SQLException {
@@ -4177,8 +4185,8 @@
* Sets the identifier for the table from which this rowset was derived
* to the given table name.
*
- * @param tabName a <code>String</code> object that identifies the
- * table from which this <code>CachedRowSetImpl</code> object
+ * @param tabName a {@code String} object that identifies the
+ * table from which this {@code CachedRowSetImpl} object
* was derived
* @throws SQLException if an error occurs
*/
@@ -4188,7 +4196,7 @@
/**
* Returns the columns that make a key to uniquely identify a
- * row in this <code>CachedRowSetImpl</code> object.
+ * row in this {@code CachedRowSetImpl} object.
*
* @return an array of column numbers that constitutes a primary
* key for this rowset. This array should be empty
@@ -4203,16 +4211,16 @@
/**
- * Sets this <code>CachedRowSetImpl</code> object's
- * <code>keyCols</code> field with the given array of column
+ * Sets this {@code CachedRowSetImpl} object's
+ * {@code keyCols} field with the given array of column
* numbers, which forms a key for uniquely identifying a row
* in this rowset.
*
- * @param keys an array of <code>int</code> indicating the
+ * @param keys an array of {@code int} indicating the
* columns that form a primary key for this
- * <code>CachedRowSetImpl</code> object; every
+ * {@code CachedRowSetImpl} object; every
* element in the array must be greater than
- * <code>0</code> and less than or equal to the number
+ * {@code 0} and less than or equal to the number
* of columns in this rowset
* @throws SQLException if any of the numbers in the
* given array is not valid for this rowset
@@ -4224,8 +4232,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4236,14 +4244,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param ref the new column <code>java.sql.Ref</code> value
+ * @param ref the new column {@code java.sql.Ref} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateRef(int columnIndex, java.sql.Ref ref) throws SQLException {
throw new UnsupportedOperationException();
@@ -4251,8 +4259,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4263,13 +4271,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param ref the new column <code>java.sql.Ref</code> value
+ * @param ref the new column {@code java.sql.Ref} value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateRef(String columnName, java.sql.Ref ref) throws SQLException {
throw new UnsupportedOperationException();
@@ -4277,8 +4285,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4289,14 +4297,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param c the new column <code>Clob value
+ * @param c the new column {@code Clob} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateClob(int columnIndex, Clob c) throws SQLException {
throw new UnsupportedOperationException();
@@ -4304,8 +4312,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>double</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code double} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4316,13 +4324,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param c the new column <code>Clob</code>value
+ * @param c the new column {@code Clob}value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateClob(String columnName, Clob c) throws SQLException {
throw new UnsupportedOperationException();
@@ -4330,8 +4338,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.sql.Blob</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.sql.Blob} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4342,14 +4350,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param b the new column <code>Blob</code> value
+ * @param b the new column {@code Blob} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBlob(int columnIndex, Blob b) throws SQLException {
throw new UnsupportedOperationException();
@@ -4357,8 +4365,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.sql.Blob </code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.sql.Blob } value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4369,13 +4377,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param b the new column <code>Blob</code> value
+ * @param b the new column {@code Blob} value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateBlob(String columnName, Blob b) throws SQLException {
throw new UnsupportedOperationException();
@@ -4383,8 +4391,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.sql.Array</code> values.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.sql.Array} values.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4395,14 +4403,14 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnIndex the first column is <code>1</code>, the second
- * is <code>2</code>, and so on; must be <code>1</code> or larger
+ * @param columnIndex the first column is {@code 1}, the second
+ * is {@code 2}, and so on; must be {@code 1} or larger
* and equal to or less than the number of columns in this rowset
- * @param a the new column <code>Array</code> value
+ * @param a the new column {@code Array} value
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) this rowset is
- * <code>ResultSet.CONCUR_READ_ONLY</code>
+ * {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateArray(int columnIndex, Array a) throws SQLException {
throw new UnsupportedOperationException();
@@ -4410,8 +4418,8 @@
/**
* Sets the designated column in either the current row or the insert
- * row of this <code>CachedRowSetImpl</code> object with the given
- * <code>java.sql.Array</code> value.
+ * row of this {@code CachedRowSetImpl} object with the given
+ * {@code java.sql.Array} value.
*
* This method updates a column value in either the current row or
* the insert row of this rowset, but it does not update the
@@ -4422,13 +4430,13 @@
* and the database. Both of these methods must be called before the
* cursor moves to another row.
*
- * @param columnName a <code>String</code> object that must match the
+ * @param columnName a {@code String} object that must match the
* SQL name of a column in this rowset, ignoring case
- * @param a the new column <code>Array</code> value
+ * @param a the new column {@code Array} value
* @throws SQLException if (1) the given column name does not match the
* name of a column in this rowset, (2) the cursor is not on
* one of this rowset's rows or its insert row, or (3) this
- * rowset is <code>ResultSet.CONCUR_READ_ONLY</code>
+ * rowset is {@code ResultSet.CONCUR_READ_ONLY}
*/
public void updateArray(String columnName, Array a) throws SQLException {
throw new UnsupportedOperationException();
@@ -4437,7 +4445,7 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
+ * {@code CachedRowSetImpl} object as a {@code java.net.URL} object
* in the Java programming language.
*
* @return a java.net.URL object containing the resource reference described by
@@ -4445,7 +4453,7 @@
* @throws SQLException if (1) the given column index is out of bounds,
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>DATALINK</code> value.
+ * SQL {@code DATALINK} value.
* @see #getURL(String)
*/
public java.net.URL getURL(int columnIndex) throws SQLException {
@@ -4454,7 +4462,7 @@
/**
* Retrieves the value of the designated column in this
- * <code>CachedRowSetImpl</code> object as a <code>java.net.URL</code> object
+ * {@code CachedRowSetImpl} object as a {@code java.net.URL} object
* in the Java programming language.
*
* @return a java.net.URL object containing the resource reference described by
@@ -4463,7 +4471,7 @@
* in this rowset, or
* (2) the cursor is not on one of this rowset's rows or its
* insert row, or (3) the designated column does not store an
- * SQL <code>DATALINK</code> value.
+ * SQL {@code DATALINK} value.
* @see #getURL(int)
*/
public java.net.URL getURL(String columnName) throws SQLException {
@@ -4472,20 +4480,20 @@
}
/**
- * The first warning reported by calls on this <code>CachedRowSetImpl</code>
- * object is returned. Subsequent <code>CachedRowSetImpl</code> warnings will
- * be chained to this <code>SQLWarning</code>. All <code>RowSetWarnings</code>
+ * The first warning reported by calls on this {@code CachedRowSetImpl}
+ * object is returned. Subsequent {@code CachedRowSetImpl} warnings will
+ * be chained to this {@code SQLWarning}. All {@code RowSetWarnings}
* warnings are generated in the disconnected environment and remain a
- * seperate warning chain to that provided by the <code>getWarnings</code>
+ * seperate warning chain to that provided by the {@code getWarnings}
* method.
*
* <P>The warning chain is automatically cleared each time a new
* row is read.
*
* <P><B>Note:</B> This warning chain only covers warnings caused
- * by <code>CachedRowSet</code> (and their child interface)
- * methods. All <code>SQLWarnings</code> can be obtained using the
- * <code>getWarnings</code> method which tracks warnings generated
+ * by {@code CachedRowSet} (and their child interface)
+ * methods. All {@code SQLWarnings} can be obtained using the
+ * {@code getWarnings} method which tracks warnings generated
* by the underlying JDBC driver.
* @return the first SQLWarning or null
*
@@ -4495,7 +4503,7 @@
}
/**
- * Commits all changes performed by the <code>acceptChanges()</code>
+ * Commits all changes performed by the {@code acceptChanges()}
* methods
*
* @see java.sql.Connection#commit
@@ -4505,7 +4513,7 @@
}
/**
- * Rolls back all changes performed by the <code>acceptChanges()</code>
+ * Rolls back all changes performed by the {@code acceptChanges()}
* methods
*
* @see java.sql.Connection#rollback
@@ -4515,8 +4523,8 @@
}
/**
- * Rolls back all changes performed by the <code>acceptChanges()</code>
- * to the last <code>Savepoint</code> transaction marker.
+ * Rolls back all changes performed by the {@code acceptChanges()}
+ * to the last {@code Savepoint} transaction marker.
*
* @see java.sql.Connection#rollback(Savepoint)
*/
@@ -4526,7 +4534,7 @@
/**
* Unsets the designated parameter to the given int array.
- * This was set using <code>setMatchColumn</code>
+ * This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -4536,7 +4544,7 @@
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
* parameter index is out of bounds or if the columnIdx is
- * not the same as set using <code>setMatchColumn(int [])</code>
+ * not the same as set using {@code setMatchColumn(int [])}
*/
public void unsetMatchColumn(int[] columnIdxes) throws SQLException {
throw new UnsupportedOperationException();
@@ -4544,7 +4552,7 @@
/**
* Unsets the designated parameter to the given String array.
- * This was set using <code>setMatchColumn</code>
+ * This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -4554,18 +4562,18 @@
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
* parameter index is out of bounds or if the columnName is
- * not the same as set using <code>setMatchColumn(String [])</code>
+ * not the same as set using {@code setMatchColumn(String [])}
*/
public void unsetMatchColumn(String[] columnIdxes) throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Retrieves the column name as <code>String</code> array
- * that was set using <code>setMatchColumn(String [])</code>
+ * Retrieves the column name as {@code String} array
+ * that was set using {@code setMatchColumn(String [])}
* for this rowset.
*
- * @return a <code>String</code> array object that contains the column names
+ * @return a {@code String} array object that contains the column names
* for the rowset which has this the match columns
*
* @throws SQLException if an error occurs or column name is not set
@@ -4575,10 +4583,10 @@
}
/**
- * Retrieves the column id as <code>int</code> array that was set using
- * <code>setMatchColumn(int [])</code> for this rowset.
- *
- * @return a <code>int</code> array object that contains the column ids
+ * Retrieves the column id as {@code int} array that was set using
+ * {@code setMatchColumn(int [])} for this rowset.
+ *
+ * @return a {@code int} array object that contains the column ids
* for the rowset which has this as the match columns.
*
* @throws SQLException if an error occurs or column index is not set
@@ -4590,17 +4598,17 @@
/**
* Sets the designated parameter to the given int array.
* This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumnIndexes</code> is called.
+ * command when the method {@code getMatchColumnIndexes} is called.
*
* @param columnIdxes the indexes into this rowset
* object's internal representation of parameter values; the
* first parameter is 0, the second is 1, and so on; must be
- * <code>0</code> or greater
+ * {@code 0} or greater
* @throws SQLException if an error occurs or the
* parameter index is out of bounds
*/
@@ -4611,12 +4619,12 @@
/**
* Sets the designated parameter to the given String array.
* This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumn</code> is called.
+ * command when the method {@code getMatchColumn} is called.
*
* @param columnNames the name of the column into this rowset
* object's internal representation of parameter values
@@ -4629,19 +4637,19 @@
/**
- * Sets the designated parameter to the given <code>int</code>
+ * Sets the designated parameter to the given {@code int}
* object. This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumn</code> is called.
+ * command when the method {@code getMatchColumn} is called.
*
* @param columnIdx the index into this rowset
* object's internal representation of parameter values; the
* first parameter is 0, the second is 1, and so on; must be
- * <code>0</code> or greater
+ * {@code 0} or greater
* @throws SQLException if an error occurs or the
* parameter index is out of bounds
*/
@@ -4650,14 +4658,14 @@
}
/**
- * Sets the designated parameter to the given <code>String</code>
+ * Sets the designated parameter to the given {@code String}
* object. This forms the basis of the join for the
- * <code>JoinRowSet</code> as the column which will form the basis of the
+ * {@code JoinRowSet} as the column which will form the basis of the
* join.
* <P>
* The parameter value set by this method is stored internally and
* will be supplied as the appropriate parameter in this rowset's
- * command when the method <code>getMatchColumn</code> is called.
+ * command when the method {@code getMatchColumn} is called.
*
* @param columnName the name of the column into this rowset
* object's internal representation of parameter values
@@ -4669,8 +4677,8 @@
}
/**
- * Unsets the designated parameter to the given <code>int</code>
- * object. This was set using <code>setMatchColumn</code>
+ * Unsets the designated parameter to the given {@code int}
+ * object. This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -4680,15 +4688,15 @@
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
* parameter index is out of bounds or if the columnIdx is
- * not the same as set using <code>setMatchColumn(int)</code>
+ * not the same as set using {@code setMatchColumn(int)}
*/
public void unsetMatchColumn(int columnIdx) throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Unsets the designated parameter to the given <code>String</code>
- * object. This was set using <code>setMatchColumn</code>
+ * Unsets the designated parameter to the given {@code String}
+ * object. This was set using {@code setMatchColumn}
* as the column which will form the basis of the join.
* <P>
* The parameter value unset by this method should be same
@@ -4698,7 +4706,7 @@
* object's internal representation of parameter values
* @throws SQLException if an error occurs or the
* parameter index is out of bounds or if the columnName is
- * not the same as set using <code>setMatchColumn(String)</code>
+ * not the same as set using {@code setMatchColumn(String)}
*/
public void unsetMatchColumn(String columnName) throws SQLException {
throw new UnsupportedOperationException();
@@ -4706,48 +4714,48 @@
/**
* Notifies registered listeners that a RowSet object in the given RowSetEvent
- * object has populated a number of additional rows. The <code>numRows</code> parameter
- * ensures that this event will only be fired every <code>numRow</code>.
+ * object has populated a number of additional rows. The {@code numRows} parameter
+ * ensures that this event will only be fired every {@code numRow}.
* <p>
* The source of the event can be retrieved with the method event.getSource.
*
- * @param event a <code>RowSetEvent</code> object that contains the
- * <code>RowSet</code> object that is the source of the events
+ * @param event a {@code RowSetEvent} object that contains the
+ * {@code RowSet} object that is the source of the events
* @param numRows when populating, the number of rows interval on which the
- * <code>CachedRowSet</code> populated should fire; the default value
- * is zero; cannot be less than <code>fetchSize</code> or zero
+ * {@code CachedRowSet} populated should fire; the default value
+ * is zero; cannot be less than {@code fetchSize} or zero
*/
public void rowSetPopulated(RowSetEvent event, int numRows) throws SQLException {
throw new UnsupportedOperationException();
}
/**
- * Populates this <code>CachedRowSet</code> object with data from
- * the given <code>ResultSet</code> object. While related to the <code>populate(ResultSet)</code>
+ * Populates this {@code CachedRowSet} object with data from
+ * the given {@code ResultSet} object. While related to the {@code populate(ResultSet)}
* method, an additional parameter is provided to allow starting position within
- * the <code>ResultSet</code> from where to populate the CachedRowSet
+ * the {@code ResultSet} from where to populate the CachedRowSet
* instance.
*
- * This method is an alternative to the method <code>execute</code>
- * for filling the rowset with data. The method <code>populate</code>
+ * This method is an alternative to the method {@code execute}
+ * for filling the rowset with data. The method {@code populate}
* does not require that the properties needed by the method
- * <code>execute</code>, such as the <code>command</code> property,
- * be set. This is true because the method <code>populate</code>
- * is given the <code>ResultSet</code> object from
+ * {@code execute}, such as the {@code command} property,
+ * be set. This is true because the method {@code populate}
+ * is given the {@code ResultSet} object from
* which to get data and thus does not need to use the properties
* required for setting up a connection and executing this
- * <code>CachedRowSetImpl</code> object's command.
+ * {@code CachedRowSetImpl} object's command.
* <P>
* After populating this rowset with data, the method
- * <code>populate</code> sets the rowset's metadata and
- * then sends a <code>RowSetChangedEvent</code> object
+ * {@code populate} sets the rowset's metadata and
+ * then sends a {@code RowSetChangedEvent} object
* to all registered listeners prior to returning.
*
- * @param data the <code>ResultSet</code> object containing the data
- * to be read into this <code>CachedRowSetImpl</code> object
+ * @param data the {@code ResultSet} object containing the data
+ * to be read into this {@code CachedRowSetImpl} object
* @param start the integer specifing the position in the
- * <code>ResultSet</code> object to popultate the
- * <code>CachedRowSetImpl</code> object.
+ * {@code ResultSet} object to popultate the
+ * {@code CachedRowSetImpl} object.
* @throws SQLException if an error occurs; or the max row setting is
* violated while populating the RowSet.Also id the start position
* is negative.
@@ -4759,7 +4767,7 @@
}
/**
- * The nextPage gets the next page, that is a <code>CachedRowSetImpl</code> object
+ * The nextPage gets the next page, that is a {@code CachedRowSetImpl} object
* containing the number of rows specified by page size.
* @return boolean value true indicating whether there are more pages to come and
* false indicating that this is the last page.
@@ -4796,7 +4804,7 @@
* @return boolean value true if it retrieves the previous page, flase if it
* is on the first page.
* @throws SQLException if it is called before populate is called or ResultSet
- * is of type <code>ResultSet.TYPE_FORWARD_ONLY</code> or if an error
+ * is of type {@code ResultSet.TYPE_FORWARD_ONLY} or if an error
* occurs.
*/
public boolean previousPage() throws SQLException {
@@ -4807,7 +4815,7 @@
* Updates the designated column with a character stream value, which will
* have the specified number of bytes. The driver does the necessary conversion
* from Java character format to the national character set in the database.
- * It is intended for use when updating NCHAR,NVARCHAR and LONGNVARCHAR columns.
+ * It is intended for use when updating NCHAR, NVARCHAR and LONGNVARCHAR columns.
* The updater methods are used to update column values in the current row or
* the insert row. The updater methods do not update the underlying database;
* instead the updateRow or insertRow methods are called to update the database.
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java Thu Jun 25 07:13:27 2015 +0000
@@ -36,24 +36,24 @@
import javax.sql.rowset.spi.*;
/**
- * An implementation of the <code>XmlWriter</code> interface, which writes a
- * <code>WebRowSet</code> object to an output stream as an XML document.
+ * An implementation of the {@code XmlWriter} interface, which writes a
+ * {@code WebRowSet} object to an output stream as an XML document.
*/
public class WebRowSetXmlWriter implements XmlWriter, Serializable {
/**
- * The <code>java.io.Writer</code> object to which this <code>WebRowSetXmlWriter</code>
- * object will write when its <code>writeXML</code> method is called. The value
- * for this field is set with the <code>java.io.Writer</code> object given
- * as the second argument to the <code>writeXML</code> method.
+ * The {@code java.io.Writer} object to which this {@code WebRowSetXmlWriter}
+ * object will write when its {@code writeXML} method is called. The value
+ * for this field is set with the {@code java.io.Writer} object given
+ * as the second argument to the {@code writeXML} method.
*/
private transient java.io.Writer writer;
/**
- * The <code>java.util.Stack</code> object that this <code>WebRowSetXmlWriter</code>
+ * The {@code java.util.Stack} object that this {@code WebRowSetXmlWriter}
* object will use for storing the tags to be used for writing the calling
- * <code>WebRowSet</code> object as an XML document.
+ * {@code WebRowSet} object as an XML document.
*/
private java.util.Stack<String> stack;
@@ -69,24 +69,24 @@
}
/**
- * Writes the given <code>WebRowSet</code> object as an XML document
- * using the given <code>java.io.Writer</code> object. The XML document
- * will include the <code>WebRowSet</code> object's data, metadata, and
+ * Writes the given {@code WebRowSet} object as an XML document
+ * using the given {@code java.io.Writer} object. The XML document
+ * will include the {@code WebRowSet} object's data, metadata, and
* properties. If a data value has been updated, that information is also
* included.
* <P>
- * This method is called by the <code>XmlWriter</code> object that is
- * referenced in the calling <code>WebRowSet</code> object's
- * <code>xmlWriter</code> field. The <code>XmlWriter.writeXML</code>
+ * This method is called by the {@code XmlWriter} object that is
+ * referenced in the calling {@code WebRowSet} object's
+ * {@code xmlWriter} field. The {@code XmlWriter.writeXML}
* method passes to this method the arguments that were supplied to it.
*
- * @param caller the <code>WebRowSet</code> object to be written; must
- * be a rowset for which this <code>WebRowSetXmlWriter</code> object
+ * @param caller the {@code WebRowSet} object to be written; must
+ * be a rowset for which this {@code WebRowSetXmlWriter} object
* is the writer
- * @param wrt the <code>java.io.Writer</code> object to which
- * <code>caller</code> will be written
+ * @param wrt the {@code java.io.Writer} object to which
+ * {@code caller} will be written
* @exception SQLException if a database access error occurs or
- * this <code>WebRowSetXmlWriter</code> object is not the writer
+ * this {@code WebRowSetXmlWriter} object is not the writer
* for the given rowset
* @see XmlWriter#writeXML
*/
@@ -100,26 +100,26 @@
}
/**
- * Writes the given <code>WebRowSet</code> object as an XML document
- * using the given <code>java.io.OutputStream</code> object. The XML document
- * will include the <code>WebRowSet</code> object's data, metadata, and
+ * Writes the given {@code WebRowSet} object as an XML document
+ * using the given {@code java.io.OutputStream} object. The XML document
+ * will include the {@code WebRowSet} object's data, metadata, and
* properties. If a data value has been updated, that information is also
* included.
* <P>
- * Using stream is a faster way than using <code>java.io.Writer<code/>
+ * Using stream is a faster way than using {@code java.io.Writer}
*
- * This method is called by the <code>XmlWriter</code> object that is
- * referenced in the calling <code>WebRowSet</code> object's
- * <code>xmlWriter</code> field. The <code>XmlWriter.writeXML</code>
+ * This method is called by the {@code XmlWriter} object that is
+ * referenced in the calling {@code WebRowSet} object's
+ * {@code xmlWriter} field. The {@code XmlWriter.writeXML}
* method passes to this method the arguments that were supplied to it.
*
- * @param caller the <code>WebRowSet</code> object to be written; must
- * be a rowset for which this <code>WebRowSetXmlWriter</code> object
+ * @param caller the {@code WebRowSet} object to be written; must
+ * be a rowset for which this {@code WebRowSetXmlWriter} object
* is the writer
- * @param oStream the <code>java.io.OutputStream</code> object to which
- * <code>caller</code> will be written
+ * @param oStream the {@code java.io.OutputStream} object to which
+ * {@code caller} will be written
* @throws SQLException if a database access error occurs or
- * this <code>WebRowSetXmlWriter</code> object is not the writer
+ * this {@code WebRowSetXmlWriter} object is not the writer
* for the given rowset
* @see XmlWriter#writeXML
*/
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -76,7 +76,7 @@
* the <code>RowSet</code> object for which this <code>RowSetMetaDataImpl</code>
* was created. To be valid, a column number must be greater than
* <code>0</code> and less than or equal to the number of columns in a row.
- * @throws <code>SQLException</code> with the message "Invalid column index"
+ * @throws SQLException with the message "Invalid column index"
* if the given column number is out of the range of valid column
* numbers for the <code>RowSet</code> object
*/
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/XalanXPathAPI.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/XalanXPathAPI.java Thu Jun 25 07:13:27 2015 +0000
@@ -167,6 +167,13 @@
private synchronized static void fixupFunctionTable() {
installed = false;
+ if (new FunctionTable().functionAvailable("here")) {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Here function already registered");
+ }
+ installed = true;
+ return;
+ }
if (log.isLoggable(java.util.logging.Level.FINE)) {
log.log(java.util.logging.Level.FINE, "Registering Here function");
}
--- a/jdk/src/jdk.dev/share/classes/sun/tools/native2ascii/resources/MsgNative2ascii_ja.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.native2ascii.resources;
-
-import java.util.ListResourceBundle;
-
-public class MsgNative2ascii_ja extends ListResourceBundle {
-
- public Object[][] getContents() {
- Object[][] temp = new Object[][] {
- {"err.bad.arg", "-encoding\u306B\u306F\u5F15\u6570\u304C\u5FC5\u8981\u3067\u3059"},
- {"err.cannot.read", "{0}\u3092\u8AAD\u307F\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},
- {"err.cannot.write", "{0}\u3092\u66F8\u304D\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002"},
- {"usage", "\u4F7F\u7528\u65B9\u6CD5: native2ascii [-reverse] [-encoding encoding] [inputfile [outputfile]]"},
- };
-
- return temp;
- }
-}
--- a/jdk/src/jdk.dev/share/classes/sun/tools/native2ascii/resources/MsgNative2ascii_zh_CN.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tools.native2ascii.resources;
-
-import java.util.ListResourceBundle;
-
-public class MsgNative2ascii_zh_CN extends ListResourceBundle {
-
- public Object[][] getContents() {
- Object[][] temp = new Object[][] {
- {"err.bad.arg", "-encoding \u9700\u8981\u53C2\u6570"},
- {"err.cannot.read", "\u65E0\u6CD5\u8BFB\u53D6{0}\u3002"},
- {"err.cannot.write", "\u65E0\u6CD5\u5199\u5165{0}\u3002"},
- {"usage", "\u7528\u6CD5: native2ascii [-reverse] [-encoding encoding] [inputfile [outputfile]]"},
- };
-
- return temp;
- }
-}
--- a/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSigner.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSigner.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -35,9 +35,11 @@
*
* @since 1.5
* @author Vincent Ryan
+ * @deprecated This package has been deprecated.
*/
@jdk.Exported
+@Deprecated
public abstract class ContentSigner {
/**
--- a/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSignerParameters.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSignerParameters.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -34,8 +34,10 @@
*
* @since 1.5
* @author Vincent Ryan
+ * @deprecated This package has been deprecated.
*/
@jdk.Exported
+@Deprecated
public interface ContentSignerParameters {
/**
--- a/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/package-info.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/package-info.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -29,7 +29,10 @@
* Clients may override the default signing mechanism of the <tt>jarsigner</tt>
* tool by supplying an alternative implementation of
* {@link com.sun.jarsigner.ContentSigner}.
+ *
+ * This package has been deprecated.
*/
@jdk.Exported
+@Deprecated
package com.sun.jarsigner;
--- a/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 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
@@ -75,7 +75,7 @@
* @author Roland Schemers
* @author Jan Luehe
*/
-
+@SuppressWarnings("deprecation")
public class Main {
// for i18n
@@ -396,9 +396,15 @@
} else if (collator.compare(flags, "-altsigner") ==0) {
if (++n == args.length) usageNoArg();
altSignerClass = args[n];
+ System.err.println(
+ rb.getString("This.option.is.deprecated") +
+ "-altsigner");
} else if (collator.compare(flags, "-altsignerpath") ==0) {
if (++n == args.length) usageNoArg();
altSignerClasspath = args[n];
+ System.err.println(
+ rb.getString("This.option.is.deprecated") +
+ "-altsignerpath");
} else if (collator.compare(flags, "-sectionsonly") ==0) {
signManifest = false;
} else if (collator.compare(flags, "-internalsf") ==0) {
@@ -2306,6 +2312,7 @@
* @param args The command-line arguments to jarsigner.
* @param zipFile The original source Zip file.
*/
+ @SuppressWarnings("deprecation")
public Block generateBlock(PrivateKey privateKey,
String sigalg,
X509Certificate[] certChain,
@@ -2331,6 +2338,7 @@
/*
* Construct a new signature block.
*/
+ @SuppressWarnings("deprecation")
Block(SignatureFile sfg, PrivateKey privateKey, String sigalg,
X509Certificate[] certChain, boolean externalSF, String tsaUrl,
X509Certificate tsaCert, String tSAPolicyID, String tSADigestAlg,
@@ -2451,6 +2459,7 @@
/*
* This object encapsulates the parameters used to perform content signing.
*/
+@SuppressWarnings("deprecation")
class JarSignerParameters implements ContentSignerParameters {
private String[] args;
--- a/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java Thu Jun 25 07:13:27 2015 +0000
@@ -44,6 +44,7 @@
{"signerClass.is.not.a.signing.mechanism", "{0} is not a signing mechanism"},
{"jarsigner.error.", "jarsigner error: "},
{"Illegal.option.", "Illegal option: "},
+ {"This.option.is.deprecated", "This option is deprecated: "},
{".keystore.must.be.NONE.if.storetype.is.{0}",
"-keystore must be NONE if -storetype is {0}"},
{".keypass.can.not.be.specified.if.storetype.is.{0}",
@@ -91,9 +92,11 @@
{".tsadigestalg.algorithm.of.digest.data.in.timestamping.request",
"[-tsadigestalg <algorithm>] algorithm of digest data in timestamping request"},
{".altsigner.class.class.name.of.an.alternative.signing.mechanism",
- "[-altsigner <class>] class name of an alternative signing mechanism"},
+ "[-altsigner <class>] class name of an alternative signing mechanism\n" +
+ " (This option has been deprecated.)"},
{".altsignerpath.pathlist.location.of.an.alternative.signing.mechanism",
- "[-altsignerpath <pathlist>] location of an alternative signing mechanism"},
+ "[-altsignerpath <pathlist>] location of an alternative signing mechanism\n" +
+ " (This option has been deprecated.)"},
{".internalsf.include.the.SF.file.inside.the.signature.block",
"[-internalsf] include the .SF file inside the signature block"},
{".sectionsonly.don.t.compute.hash.of.entire.manifest",
--- a/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 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
@@ -45,7 +45,7 @@
*
* @author Vincent Ryan
*/
-
+@SuppressWarnings("deprecation")
public final class TimestampedSigner extends ContentSigner {
/*
--- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java Thu Jun 25 07:13:27 2015 +0000
@@ -37,7 +37,6 @@
/**
* Replaces the default connector.
*
- * @return the default {@link LaunchingConnector}
* @throws java.lang.IllegalArgumentException if the given
* connector is not a member of the list returned by
* {@link #launchingConnectors}
--- a/jdk/src/jdk.jdwp.agent/share/native/libjdwp/eventFilter.c Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jdwp.agent/share/native/libjdwp/eventFilter.c Thu Jun 25 07:13:27 2015 +0000
@@ -518,8 +518,8 @@
case JDWP_REQUEST_MODIFIER(SourceNameMatch): {
char* desiredNamePattern = filter->u.SourceNameOnly.sourceNamePattern;
- if (!searchAllSourceNames(env, clazz,
- desiredNamePattern) == 1) {
+ if (searchAllSourceNames(env, clazz,
+ desiredNamePattern) != 1) {
/* The name isn't in the SDE; try the sourceName in the ref
* type
*/
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/HostIdentifier.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/HostIdentifier.java Thu Jun 25 07:13:27 2015 +0000
@@ -81,16 +81,15 @@
* valid HostIdentifier strings:
*
* <ul>
- * <li><p>< null > - transformed into "//localhost"</p></li>
- * <li><p>localhost - transformed into "//localhost"</p></li>
- * <li><p>hostname - transformed into "//hostname"</p></li>
- * <li><p>hostname:port - transformed into "//hostname:port"</p></li>
- * <li><p>proto:hostname - transformed into "proto://hostname"</p></li>
- * <li><p>proto:hostname:port - transformed into
- * "proto://hostname:port"</p></li>
- * <li><p>proto://hostname:port</p></li>
+ * <li>{@code <null>} - transformed into "//localhost"</li>
+ * <li>localhost - transformed into "//localhost"</li>
+ * <li>hostname - transformed into "//hostname"</li>
+ * <li>hostname:port - transformed into "//hostname:port"</li>
+ * <li>proto:hostname - transformed into "proto://hostname"</li>
+ * <li>proto:hostname:port - transformed into
+ * "proto://hostname:port"</li>
+ * <li>proto://hostname:port</li>
* </ul>
- * </p>
*
* @see URI
* @see VmIdentifier
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/MonitoredVm.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/MonitoredVm.java Thu Jun 25 07:13:27 2015 +0000
@@ -74,9 +74,10 @@
*
* @param patternString a string containing a pattern as described in
* {@link java.util.regex.Pattern}.
- * @return List<Monitor> - a List of {@link Monitor} objects that can be used to
+ * @return {@code List<Monitor>} - a List of {@link Monitor}
+ * objects that can be used to
* monitor the instrumentation objects whose names match
- * the given pattern. If no instrumentation objects have`
+ * the given pattern. If no instrumentation objects have
* names matching the given pattern, then an empty List
* is returned.
* @throws MonitorException Thrown if an error occurs while communicating
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/VmIdentifier.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/VmIdentifier.java Thu Jun 25 07:13:27 2015 +0000
@@ -39,86 +39,85 @@
* [<I>protocol</I>:][<I>//</I>]<I><B>lvmid</B></I>[<I>@hostname</I>][<I>:port</I>][<I>/servername</I>]
* </pre>
* The only required component of this string is the Local Virtual Machine
- * Identifier, or <tt>lvmid</tt>, which uniquely identifies the target
+ * Identifier, or {@code lvmid}, which uniquely identifies the target
* Java Virtual Machine on a host. The optional components of the VmIdentifier
* include:
* <ul>
- * <li><p><tt>protocol</tt> - The communications protocol. A VmIdentifier
- * omitting the protocol must be resolved against a HostIdentifier
- * using {@link HostIdentifier#resolve}.
- * </p></li>
- * <li><p><tt>hostname</tt> - A hostname or IP address indicating the target
- * host. A VmIdentifier omitting the protocol must be resolved
- * against a HostIdentifier using {@link HostIdentifier#resolve}.
- * </p></li>
- * <li><p><tt>port</tt> - The port for the communications protocol.
- * Treatment of the <tt>port</tt> parameter is implementation
- * (protocol) specific. A VmIdentifier omitting the protocol should
- * be resolved against a HostIdentifier using
- * {@link HostIdentifier#resolve}.
- * </p></li>
- * <li><p><tt>servername</tt> - The treatment of the Path, Query, and
- * Fragment components of the VmIdentifier are implementation
- * (protocol) dependent. A VmIdentifier omitting the protocol should
- * be resolved against a HostIdentifier using
- * {@link HostIdentifier#resolve}.
- * </p></li>
+ * <li>{@code protocol} - The communications protocol. A VmIdentifier
+ * omitting the protocol must be resolved against a HostIdentifier
+ * using {@link HostIdentifier#resolve}.
+ * </li>
+ * <li>{@code hostname} - A hostname or IP address indicating the target
+ * host. A VmIdentifier omitting the protocol must be resolved
+ * against a HostIdentifier using {@link HostIdentifier#resolve}.
+ * </li>
+ * <li>{@code port} - The port for the communications protocol.
+ * Treatment of the {@code port} parameter is implementation
+ * (protocol) specific. A VmIdentifier omitting the protocol should
+ * be resolved against a HostIdentifier using
+ * {@link HostIdentifier#resolve}.
+ * </li>
+ * <li>{@code servername} - The treatment of the Path, Query, and
+ * Fragment components of the VmIdentifier are implementation
+ * (protocol) dependent. A VmIdentifier omitting the protocol should
+ * be resolved against a HostIdentifier using
+ * {@link HostIdentifier#resolve}.
+ * </li>
* </ul>
* <p>
* All VmIdentifier instances are constructed as absolute, hierarchical URIs.
* The constructors will accept relative (and even some malformed,
* though convenient) URI strings. Such strings are transformed into
* legitimate, absolute URI strings.
- * </p>
* <p>
* With the exception of <em>file:</em> based VmIdentifier strings, all
- * VmIdentifier strings must include a <tt>lvmid</tt>. Attempting to construct
- * a non-file based VmIdentifier that doesn't include a <tt>lvmid</tt>
- * component will result in a <tt>MonitorException</tt>.
- * </p>
+ * VmIdentifier strings must include a {@code lvmid}. Attempting to construct
+ * a non-file based VmIdentifier that doesn't include a {@code lvmid}
+ * component will result in a {@code MonitorException}.
* <p>
* Here are some examples of VmIdentifier strings.
* <ul>
- * <li><p>Relative URIs</p></li>
+ * <li>Relative URIs
* <ul>
- * <li><p><em>1234</em> - Specifies the Java Virtual Machine
- * identified by lvmid <em>1234</em> on an unnamed host.
- * This string is transformed into the absolute form
- * <em>//1234</em>, which must be resolved against a
- * HostIdentifier.
- * </p></li>
- * <li><p><em>1234@hostname</em> - Specifies the Java Virtual
- * Machine identified by lvmid <em>1234</em> on host
- * <em>hostname</em> with an unnamed protocol.
- * This string is transformed into the absolute form
- * <em>//1234@hostname</em>, which must be resolved against
- * a HostIdentifier.
- * </p></li>
- * <li><p><em>1234@hostname:2099</em> - Specifies the Java Virtual
- * Machine identified by lvmid <em>1234</em> on host
- * <em>hostname</em> with an unnamed protocol, but with
- * port <em>2099</em>. This string is transformed into
- * the absolute form <em>//1234@hostname:2099</em>, which
- * must be resolved against a HostIdentifier.
- * </p></li>
+ * <li><em>1234</em> - Specifies the Java Virtual Machine
+ * identified by lvmid <em>1234</em> on an unnamed host.
+ * This string is transformed into the absolute form
+ * <em>//1234</em>, which must be resolved against a
+ * HostIdentifier.
+ * </li>
+ * <li><em>1234@hostname</em> - Specifies the Java Virtual
+ * Machine identified by lvmid <em>1234</em> on host
+ * <em>hostname</em> with an unnamed protocol.
+ * This string is transformed into the absolute form
+ * <em>//1234@hostname</em>, which must be resolved against
+ * a HostIdentifier.
+ * </li>
+ * <li><em>1234@hostname:2099</em> - Specifies the Java Virtual
+ * Machine identified by lvmid <em>1234</em> on host
+ * <em>hostname</em> with an unnamed protocol, but with
+ * port <em>2099</em>. This string is transformed into
+ * the absolute form <em>//1234@hostname:2099</em>, which
+ * must be resolved against a HostIdentifier.
+ * </li>
* </ul>
- * <li><p>Absolute URIs</p></li>
+ * </li>
+ * <li>Absolute URIs
* <ul>
- * <li><p><em>rmi://1234@hostname:2099/remoteobjectname</em> -
- * Specifies the Java Virtual Machine identified by lvmid
- * <em>1234</em> on host <em>hostname</em> accessed
- * using the <em>rmi:</em> protocol through the rmi remote
- * object named <em>remoteobjectname</em> as registered with
- * the <em>rmiserver</em> on port <em>2099</em> on host
- * <em>hostname</em>.
- * </p></li>
- * <li><p><em>file:/path/file</em> - Identifies a Java Virtual Machine
- * through accessing a special file based protocol to use as
- * the communications mechanism.
- * </p></li>
+ * <li><em>rmi://1234@hostname:2099/remoteobjectname</em> -
+ * Specifies the Java Virtual Machine identified by lvmid
+ * <em>1234</em> on host <em>hostname</em> accessed
+ * using the <em>rmi:</em> protocol through the rmi remote
+ * object named <em>remoteobjectname</em> as registered with
+ * the <em>rmiserver</em> on port <em>2099</em> on host
+ * <em>hostname</em>.
+ * </li>
+ * <li><em>file:/path/file</em> - Identifies a Java Virtual Machine
+ * through accessing a special file based protocol to use as
+ * the communications mechanism.
+ * </li>
* </ul>
+ * </li>
* </ul>
- * </p>
*
* @see URI
* @see HostIdentifier
@@ -236,16 +235,14 @@
* missing components will have result in the HostIdentifier assigning
* assumed defaults that allow the VmIdentifier to be resolved according
* to those defaults.
- * </p>
* <p>
- * For example, a VmIdentifier that specifies only a <tt>lvmid</tt>
+ * For example, a VmIdentifier that specifies only a {@code lvmid}
* will result in a HostIdentifier for <em>localhost</em> utilizing
* the default local protocol, <em>local:</em>. A VmIdentifier that
- * specifies both a <tt>vmid</tt> and a <tt>hostname</tt> will result
+ * specifies both a {@code vmid} and a {@code hostname} will result
* in a HostIdentifier for the specified host with the default remote
* protocol, <em>rmi:</em>, using the protocol defaults for the
- * <tt>port</tt> and <tt>servername</tt> components.
- * </p>
+ * {@code port} and {@code servername} components.
*
* @return HostIdentifier - the host identifier for the host containing
* the Java Virtual Machine represented by this
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBuffer.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBuffer.java Thu Jun 25 07:13:27 2015 +0000
@@ -108,7 +108,8 @@
*
* @param patternString a string containing a pattern as described in
* {@link java.util.regex.Pattern}.
- * @return List<Monitor> - a List of {@link Monitor} objects that can be used to
+ * @return {@code List<Monitor>} - a List of {@link Monitor}
+ * objects that can be used to
* monitor the instrumentation objects whose names match
* the given pattern. If no instrumentation objects have`
* names matching the given pattern, then an empty List
--- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -266,7 +266,8 @@
*
* @param patternString a string containing a pattern as described in
* {@link java.util.regex.Pattern}.
- * @return List<Monitor> - a List of {@link Monitor} objects that can be used to
+ * @return {@code List<Monitor>} - a List of {@link Monitor}
+ * objects that can be used to
* monitor the instrumentation objects whose names match
* the given pattern. If no instrumentation objects have`
* names matching the given pattern, then an empty List
--- a/jdk/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java Thu Jun 25 07:13:27 2015 +0000
@@ -580,7 +580,7 @@
* Serializes only the domain name string, for compactness and to avoid
* any implementation dependency.
*
- * @serialdata The domain name string.
+ * @serialData The domain name string.
*/
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException {
--- a/jdk/src/linux/doc/man/ja/native2ascii.1 Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-'\" t
-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
-.\" Title: native2ascii
-.\" Language: English
-.\" Date: 2013年11月21日
-.\" SectDesc: 国際化ツール
-.\" Software: JDK 8
-.\" Arch: 汎用
-.\"
-.\" 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.
-.\"
-.pl 99999
-.TH "native2ascii" "1" "2013年11月21日" "JDK 8" "国際化ツール"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-.SH "NAME"
-native2ascii \- サポートされている任意の文字エンコーディングの文字を含むファイルを、ASCIIおよびUnicodeでエスケープされたファイルに変換して(またはその逆)、ローカライズ可能なアプリケーションを作成します。
-.SH "概要"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-\fInative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ]
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\fIinputfile\fR
-.RS 4
-ASCIIに変換するエンコードされたファイル。
-.RE
-.PP
-\fIoutputfile\fR
-.RS 4
-変換されたASCIIファイル。
-.RE
-.SH "説明"
-.PP
-\fInative2ascii\fRコマンドは、ASCIIキャラクタ・セットに含まれないすべての文字にUnicodeエスケープ(\fI\eu\fR\fIxxxx\fR)表記法を使用して、Java Runtime Environment (JRE)でサポートされているエンコードされたファイルを、ASCIIでエンコードされたファイルに変換します。このプロセスは、ISO\-8859\-1文字セットに含まれない文字が含まれているプロパティ・ファイルで必要です。このツールは、その逆の変換を実行することもできます。
-.PP
-\fIoutputfile\fR値を省略した場合、標準出力に出力されます。さらに、\fIinputfile\fR値を省略した場合、標準入力から入力されます。
-.SH "オプション"
-.PP
-\-reverse
-.RS 4
-逆の処理を行います。つまり、ISO\-8859\-1でUnicodeエスケープを使用してエンコードされたファイルを、JREでサポートされる文字エンコーディングのファイルに変換します。
-.RE
-.PP
-\-encoding \fIencoding_name\fR
-.RS 4
-変換処理で使用する文字エンコーディングの名前を指定します。このオプションが存在しない場合は、デフォルトの文字エンコーディング(\fIjava\&.nio\&.charset\&.Charset\&.defaultCharset\fRメソッドで定義された)が使用されます。\fIencoding_name\fR文字列は、JREでサポートされている文字エンコーディングの名前にする必要があります。http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.htmlにある
-「サポートされているエンコーディング」を参照してください
-.RE
-.PP
-\-J\fIoption\fR
-.RS 4
-Java仮想マシン(JVM)に\fIoption\fRを渡します。optionには、Javaアプリケーション起動ツールのリファレンス・ページに記載されているオプションを1つ指定します。たとえば、\fI\-J\-Xms48m\fRと指定すると、スタートアップ・メモリーは48MBに設定されます。java(1)を参照してください。
-.RE
-.br
-'pl 8.5i
-'bp
--- a/jdk/src/linux/doc/man/native2ascii.1 Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-'\" t
-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
-.\"
-.\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-.\"
-.\" This code is free software; you can redistribute it and/or modify it
-.\" under the terms of the GNU General Public License version 2 only, as
-.\" published by the Free Software Foundation.
-.\"
-.\" This code is distributed in the hope that it will be useful, but WITHOUT
-.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-.\" version 2 for more details (a copy is included in the LICENSE file that
-.\" accompanied this code).
-.\"
-.\" You should have received a copy of the GNU General Public License version
-.\" 2 along with this work; if not, write to the Free Software Foundation,
-.\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-.\"
-.\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-.\" or visit www.oracle.com if you need additional information or have any
-.\" questions.
-.\"
-.\" Arch: generic
-.\" Software: JDK 8
-.\" Date: 21 November 2013
-.\" SectDesc: Internationalization Tools
-.\" Title: native2ascii.1
-.\"
-.if n .pl 99999
-.TH native2ascii 1 "21 November 2013" "JDK 8" "Internationalization Tools"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-
-.SH NAME
-native2ascii \- Creates localizable applications by converting a file with characters in any supported character encoding to one with ASCII and/or Unicode escapes or vice versa\&.
-.SH SYNOPSIS
-.sp
-.nf
-
-\fBnative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ]
-.fi
-.sp
-.TP
-\fIinputfile\fR
-The encoded file to be converted to ASCII\&.
-.TP
-\fIoutputfile\fR
-The converted ASCII file\&.
-.SH DESCRIPTION
-The \f3native2ascii\fR command converts encoded files supported by the Java Runtime Environment (JRE) to files encoded in ASCII, using Unicode escapes (\f3\eu\fR\fIxxxx\fR) notation for all characters that are not part of the ASCII character set\&. This process is required for properties files that contain characters not in ISO-8859-1 character sets\&. The tool can also perform the reverse conversion\&.
-.PP
-If the \f3outputfile\fR value is omitted, then standard output is used for output\&. If, in addition, the \f3inputfile\fR value is omitted, then standard input is used for input\&.
-.SH OPTIONS
-.TP
--reverse
-.br
-Perform the reverse operation: Converts a file encoded in ISO-8859-1 with Unicode escapes to a file in any character encoding supported by the JRE\&.
-.TP
--encoding \fIencoding_name\fR
-.br
-Specifies the name of the character encoding to be used by the conversion procedure\&. If this option is not present, then the default character encoding (as determined by the \f3java\&.nio\&.charset\&.Charset\&.defaultCharset\fR method) is used\&. The \f3encoding_name\fR string must be the name of a character encoding that is supported by the JRE\&. See Supported Encodings at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.html
-.TP
--J\fIoption\fR
-.br
-Passes \f3option\fR to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java application launcher\&. For example, \f3-J-Xms48m\fR sets the startup memory to 48 MB\&. See java(1)\&.
-.RE
-.br
-'pl 8.5i
-'bp
--- a/jdk/src/solaris/doc/sun/man/man1/ja/native2ascii.1 Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-'\" t
-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
-.\" Title: native2ascii
-.\" Language: English
-.\" Date: 2013年11月21日
-.\" SectDesc: 国際化ツール
-.\" Software: JDK 8
-.\" Arch: 汎用
-.\"
-.\" 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.
-.\"
-.pl 99999
-.TH "native2ascii" "1" "2013年11月21日" "JDK 8" "国際化ツール"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-.SH "NAME"
-native2ascii \- サポートされている任意の文字エンコーディングの文字を含むファイルを、ASCIIおよびUnicodeでエスケープされたファイルに変換して(またはその逆)、ローカライズ可能なアプリケーションを作成します。
-.SH "概要"
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-\fInative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ]
-.fi
-.if n \{\
-.RE
-.\}
-.PP
-\fIinputfile\fR
-.RS 4
-ASCIIに変換するエンコードされたファイル。
-.RE
-.PP
-\fIoutputfile\fR
-.RS 4
-変換されたASCIIファイル。
-.RE
-.SH "説明"
-.PP
-\fInative2ascii\fRコマンドは、ASCIIキャラクタ・セットに含まれないすべての文字にUnicodeエスケープ(\fI\eu\fR\fIxxxx\fR)表記法を使用して、Java Runtime Environment (JRE)でサポートされているエンコードされたファイルを、ASCIIでエンコードされたファイルに変換します。このプロセスは、ISO\-8859\-1文字セットに含まれない文字が含まれているプロパティ・ファイルで必要です。このツールは、その逆の変換を実行することもできます。
-.PP
-\fIoutputfile\fR値を省略した場合、標準出力に出力されます。さらに、\fIinputfile\fR値を省略した場合、標準入力から入力されます。
-.SH "オプション"
-.PP
-\-reverse
-.RS 4
-逆の処理を行います。つまり、ISO\-8859\-1でUnicodeエスケープを使用してエンコードされたファイルを、JREでサポートされる文字エンコーディングのファイルに変換します。
-.RE
-.PP
-\-encoding \fIencoding_name\fR
-.RS 4
-変換処理で使用する文字エンコーディングの名前を指定します。このオプションが存在しない場合は、デフォルトの文字エンコーディング(\fIjava\&.nio\&.charset\&.Charset\&.defaultCharset\fRメソッドで定義された)が使用されます。\fIencoding_name\fR文字列は、JREでサポートされている文字エンコーディングの名前にする必要があります。http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.htmlにある
-「サポートされているエンコーディング」を参照してください
-.RE
-.PP
-\-J\fIoption\fR
-.RS 4
-Java仮想マシン(JVM)に\fIoption\fRを渡します。optionには、Javaアプリケーション起動ツールのリファレンス・ページに記載されているオプションを1つ指定します。たとえば、\fI\-J\-Xms48m\fRと指定すると、スタートアップ・メモリーは48MBに設定されます。java(1)を参照してください。
-.RE
-.br
-'pl 8.5i
-'bp
--- a/jdk/src/solaris/doc/sun/man/man1/native2ascii.1 Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-'\" t
-.\" Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
-.\"
-.\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-.\"
-.\" This code is free software; you can redistribute it and/or modify it
-.\" under the terms of the GNU General Public License version 2 only, as
-.\" published by the Free Software Foundation.
-.\"
-.\" This code is distributed in the hope that it will be useful, but WITHOUT
-.\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-.\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-.\" version 2 for more details (a copy is included in the LICENSE file that
-.\" accompanied this code).
-.\"
-.\" You should have received a copy of the GNU General Public License version
-.\" 2 along with this work; if not, write to the Free Software Foundation,
-.\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-.\"
-.\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-.\" or visit www.oracle.com if you need additional information or have any
-.\" questions.
-.\"
-.\" Arch: generic
-.\" Software: JDK 8
-.\" Date: 21 November 2013
-.\" SectDesc: Internationalization Tools
-.\" Title: native2ascii.1
-.\"
-.if n .pl 99999
-.TH native2ascii 1 "21 November 2013" "JDK 8" "Internationalization Tools"
-.\" -----------------------------------------------------------------
-.\" * Define some portability stuff
-.\" -----------------------------------------------------------------
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.\" http://bugs.debian.org/507673
-.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
-.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.ie \n(.g .ds Aq \(aq
-.el .ds Aq '
-.\" -----------------------------------------------------------------
-.\" * set default formatting
-.\" -----------------------------------------------------------------
-.\" disable hyphenation
-.nh
-.\" disable justification (adjust text to left margin only)
-.ad l
-.\" -----------------------------------------------------------------
-.\" * MAIN CONTENT STARTS HERE *
-.\" -----------------------------------------------------------------
-
-.SH NAME
-native2ascii \- Creates localizable applications by converting a file with characters in any supported character encoding to one with ASCII and/or Unicode escapes or vice versa\&.
-.SH SYNOPSIS
-.sp
-.nf
-
-\fBnative2ascii\fR [ \fIinputfile\fR ] [ \fIoutputfile\fR ]
-.fi
-.sp
-.TP
-\fIinputfile\fR
-The encoded file to be converted to ASCII\&.
-.TP
-\fIoutputfile\fR
-The converted ASCII file\&.
-.SH DESCRIPTION
-The \f3native2ascii\fR command converts encoded files supported by the Java Runtime Environment (JRE) to files encoded in ASCII, using Unicode escapes (\f3\eu\fR\fIxxxx\fR) notation for all characters that are not part of the ASCII character set\&. This process is required for properties files that contain characters not in ISO-8859-1 character sets\&. The tool can also perform the reverse conversion\&.
-.PP
-If the \f3outputfile\fR value is omitted, then standard output is used for output\&. If, in addition, the \f3inputfile\fR value is omitted, then standard input is used for input\&.
-.SH OPTIONS
-.TP
--reverse
-.br
-Perform the reverse operation: Converts a file encoded in ISO-8859-1 with Unicode escapes to a file in any character encoding supported by the JRE\&.
-.TP
--encoding \fIencoding_name\fR
-.br
-Specifies the name of the character encoding to be used by the conversion procedure\&. If this option is not present, then the default character encoding (as determined by the \f3java\&.nio\&.charset\&.Charset\&.defaultCharset\fR method) is used\&. The \f3encoding_name\fR string must be the name of a character encoding that is supported by the JRE\&. See Supported Encodings at http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/intl/encoding\&.doc\&.html
-.TP
--J\fIoption\fR
-.br
-Passes \f3option\fR to the Java Virtual Machine (JVM), where option is one of the options described on the reference page for the Java application launcher\&. For example, \f3-J-Xms48m\fR sets the startup memory to 48 MB\&. See java(1)\&.
-.RE
-.br
-'pl 8.5i
-'bp
--- a/jdk/test/ProblemList.txt Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/ProblemList.txt Thu Jun 25 07:13:27 2015 +0000
@@ -123,9 +123,6 @@
# 8029891
java/lang/ClassLoader/deadlock/GetResource.java generic-all
-# 8080428
-java/lang/invoke/8022701/MHIllegalAccess.java generic-all
-
############################################################################
# jdk_instrument
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 7130985
+ * @summary Four helper classes missing in Sun JDK
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @run main CorbaExceptionsCompileTest
+ */
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.rmi.RemoteException;
+import org.omg.CORBA.ORBPackage.InvalidName;
+import org.omg.CORBA.TypeCodePackage.BadKind;
+import org.omg.CORBA.TypeCodePackage.Bounds;
+
+import jdk.testlibrary.FileUtils;
+import jdk.testlibrary.JDKToolLauncher;
+
+public class CorbaExceptionsCompileTest implements CorbaExceptionsTest {
+
+ public CorbaExceptionsCompileTest() {
+ super();
+ }
+
+ public void testExceptionInvalidName()
+ throws java.rmi.RemoteException, InvalidName {}
+
+ public void testExceptionBounds()
+ throws java.rmi.RemoteException, Bounds {}
+
+ public void testExceptionBadKind()
+ throws java.rmi.RemoteException, BadKind {}
+
+ public void testExceptionCorba_Bounds()
+ throws java.rmi.RemoteException, org.omg.CORBA.Bounds {}
+
+ public static void main(String[] args) throws Exception {
+ final File f = new File(
+ CorbaExceptionsCompileTest.class.getProtectionDomain()
+ .getCodeSource().getLocation().getPath());
+ System.out.println(f.getCanonicalPath());
+ ProcessBuilder pb = new ProcessBuilder("ls", "-l");
+ pb.directory(f);
+ Process p = pb.start();
+ p.waitFor();
+ if (p.exitValue() == 0) {
+ try (BufferedReader br = new BufferedReader(
+ new InputStreamReader(p.getInputStream()))) {
+ StringBuilder builder = new StringBuilder();
+ String line = null;
+ while ( (line = br.readLine()) != null) {
+ builder.append(line + "\n");
+ }
+ String result = builder.toString();
+ System.out.println(result);
+ }
+ }
+
+ Path outDir = Paths.get("CorbaExceptionsCompileTest-compiled");
+ outDir = Files.createDirectory(outDir).toAbsolutePath();
+ JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("rmic");
+ launcher.addToolArg("-classpath").addToolArg(f.getCanonicalPath())
+ .addToolArg("-d").addToolArg(outDir.toString())
+ .addToolArg("-iiop").addToolArg("CorbaExceptionsCompileTest");
+
+ pb = new ProcessBuilder(launcher.getCommand());
+ pb.directory(f);
+ System.out.println("Working Directory: " + pb.directory());
+ System.out.println("CorbaExceptionsCompileTest.class exists: "
+ + new File(f, "CorbaExceptionsCompileTest.class").exists());
+
+ p = pb.start();
+ p.waitFor();
+ if (p.exitValue() != 0) {
+ try (BufferedReader br = new BufferedReader(
+ new InputStreamReader(p.getInputStream()))) {
+ StringBuilder builder = new StringBuilder();
+ String line = null;
+ while ( (line = br.readLine()) != null) {
+ builder.append(line + "\n");
+ }
+ String result = builder.toString();
+ System.out.println(result);
+ throw new RuntimeException(launcher.getCommand() +
+ " -iiop CorbaExceptionsCompileTest failed with status: "
+ + p.exitValue());
+ }
+ }
+
+ if (Files.exists(outDir))
+ FileUtils.deleteFileTreeWithRetry(outDir);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.rmi.Remote;
+import org.omg.CORBA.ORBPackage.InvalidName;
+import org.omg.CORBA.TypeCodePackage.BadKind;
+import org.omg.CORBA.TypeCodePackage.Bounds;
+
+public interface CorbaExceptionsTest extends Remote {
+ public void testExceptionInvalidName() throws java.rmi.RemoteException, InvalidName;
+ public void testExceptionBounds() throws java.rmi.RemoteException, Bounds;
+ public void testExceptionBadKind() throws java.rmi.RemoteException, BadKind;
+ public void testExceptionCorba_Bounds() throws java.rmi.RemoteException, org.omg.CORBA.Bounds;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/ScrollPane/bug8077409Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @bug 8077409
+ @summary Drawing deviates when validate() is invoked on java.awt.ScrollPane
+ @author mikhail.cherkasov@oracle.com
+ @run main bug8077409Test
+*/
+
+
+import java.awt.*;
+import java.awt.event.*;
+
+public class bug8077409Test extends Frame {
+ ScrollPane pane;
+ MyCanvas myCanvas;
+
+ class MyCanvas extends Canvas {
+ public Dimension getPreferredSize() {
+ return new Dimension(400, 800);
+ }
+
+ public void paint(Graphics g) {
+ g.setColor(Color.BLACK);
+ g.drawLine(0, 0, 399, 0);
+ g.setColor(Color.RED);
+ g.drawLine(0, 1, 399, 1);
+ g.setColor(Color.BLUE);
+ g.drawLine(0, 2, 399, 2);
+ g.setColor(Color.GREEN);
+ g.drawLine(0, 3, 399, 3);
+ }
+
+ }
+
+ public bug8077409Test() {
+ super();
+ setLayout(new BorderLayout());
+ pane = new ScrollPane();
+
+ myCanvas = new MyCanvas();
+ pane.add(myCanvas);
+
+ add(pane, BorderLayout.CENTER);
+ setSize(320, 480);
+
+ }
+
+ @Override
+ protected void processKeyEvent(KeyEvent e) {
+ super.processKeyEvent(e);
+
+ }
+
+ public static void main(String[] args) throws AWTException, InterruptedException {
+ final bug8077409Test obj = new bug8077409Test();
+ obj.setVisible(true);
+ Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
+ @Override
+ public void eventDispatched(AWTEvent e) {
+ KeyEvent keyEvent = (KeyEvent) e;
+ if(keyEvent.getID() == KeyEvent.KEY_RELEASED) {
+ if (keyEvent.getKeyCode() == KeyEvent.VK_1) {
+ System.out.println(obj.pane.toString());
+ System.out.println("obj.myCanvas.pos: " + obj.myCanvas.getBounds());
+ System.out.println(obj.myCanvas.toString());
+ } else if (keyEvent.getKeyCode() == KeyEvent.VK_2) {
+ obj.repaint();
+ } else if (keyEvent.getKeyCode() == KeyEvent.VK_DOWN) {
+ Point scrollPosition = obj.pane.getScrollPosition();
+ scrollPosition.translate(0, 1);
+ obj.pane.setScrollPosition(scrollPosition);
+ } else if (keyEvent.getKeyCode() == KeyEvent.VK_UP) {
+ Point scrollPosition = obj.pane.getScrollPosition();
+ scrollPosition.translate(0, -1);
+ obj.pane.setScrollPosition(scrollPosition);
+ } else if (keyEvent.getKeyCode() == KeyEvent.VK_SPACE) {
+ obj.pane.validate();
+ }
+ }
+ }
+ }, AWTEvent.KEY_EVENT_MASK);
+ Point scrollPosition = obj.pane.getScrollPosition();
+ scrollPosition.translate(0, 1);
+ obj.pane.setScrollPosition(scrollPosition);
+
+ int y = obj.pane.getComponent(0).getLocation().y;
+ obj.pane.validate();
+ if(y != obj.pane.getComponent(0).getLocation().y){
+ throw new RuntimeException("Wrong position of component in ScrollPane");
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/event/MouseWheelEvent/WheelModifier/WheelModifier.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @bug 8041470
+ @summary JButtons stay pressed after they have lost focus if you use the mouse wheel
+ @author Anton Nashatyrev
+*/
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.concurrent.CountDownLatch;
+
+public class WheelModifier {
+
+ JFrame f;
+ JButton fb;
+
+ CountDownLatch pressSema = new CountDownLatch(1);
+ CountDownLatch exitSema = new CountDownLatch(1);
+ CountDownLatch releaseSema = new CountDownLatch(1);
+ volatile CountDownLatch wheelSema;
+
+ void createGui() {
+ f = new JFrame("frame");
+ fb = new JButton("frame_button");
+ fb.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ System.out.println("WheelModifier.mouseReleased: " + e);
+ releaseSema.countDown();
+ }
+
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ System.out.println("WheelModifier.mouseEntered: " + e);
+
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ System.out.println("WheelModifier.mouseExited: " + e);
+ exitSema.countDown();
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ System.out.println("WheelModifier.mousePressed: " + e);
+ pressSema.countDown();
+ }
+
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ System.out.println("WheelModifier.mouseDragged: " + e);
+ }
+ });
+
+ Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
+ @Override
+ public void eventDispatched(AWTEvent event) {
+ System.out.println("WheelModifier.mouseWheel: " + event);
+ wheelSema.countDown();
+ }
+ }, MouseEvent.MOUSE_WHEEL_EVENT_MASK);
+
+ f.setLayout(new FlowLayout());
+ f.add(fb);
+ f.setSize(200, 200);
+ f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ f.setVisible(true);
+ }
+
+ void run() throws Exception {
+ Robot r = new Robot();
+ r.waitForIdle();
+ System.out.println("# Started");
+
+ Point sLoc = fb.getLocationOnScreen();
+ Dimension bSize = fb.getSize();
+ r.mouseMove(sLoc.x + bSize.width / 2, sLoc.y + bSize.height / 2);
+ r.mousePress(MouseEvent.BUTTON1_MASK);
+ pressSema.await();
+ System.out.println("# Pressed");
+
+ r.mouseMove(sLoc.x + bSize.width / 2, sLoc.y + bSize.height * 2);
+ exitSema.await();
+ System.out.println("# Exited");
+
+ wheelSema = new CountDownLatch(1);
+ r.mouseWheel(1);
+ wheelSema.await();
+ System.out.println("# Wheeled 1");
+
+ wheelSema = new CountDownLatch(1);
+ r.mouseWheel(-1);
+ wheelSema.await();
+ System.out.println("# Wheeled 2");
+
+ r.mouseRelease(MouseEvent.BUTTON1_MASK);
+ releaseSema.await();
+ System.out.println("# Released!");
+ }
+
+ public static void main(String[] args) throws Exception {
+ WheelModifier test = new WheelModifier();
+
+ SwingUtilities.invokeAndWait(() -> test.createGui());
+ test.run();
+
+ System.out.println("Done.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/image/DrawImage/IncorrectClipXorModeSurface2Surface.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.awt.image.VolatileImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+import static java.awt.geom.Rectangle2D.Double;
+
+/**
+ * @test
+ * @bug 8061831
+ * @summary Tests drawing volatile image to volatile image using different
+ * clips + xor mode. Results of the blit compatibleImage to
+ * compatibleImage is used for comparison.
+ */
+public final class IncorrectClipXorModeSurface2Surface {
+
+ private static int[] SIZES = {2, 10, 100};
+ private static final Shape[] SHAPES = {
+ new Rectangle(0, 0, 0, 0),
+ new Rectangle(0, 0, 1, 1),
+ new Rectangle(0, 1, 1, 1),
+ new Rectangle(1, 0, 1, 1),
+ new Rectangle(1, 1, 1, 1),
+
+ new Double(0, 0, 0.5, 0.5),
+ new Double(0, 0.5, 0.5, 0.5),
+ new Double(0.5, 0, 0.5, 0.5),
+ new Double(0.5, 0.5, 0.5, 0.5),
+ new Double(0.25, 0.25, 0.5, 0.5),
+ new Double(0, 0.25, 1, 0.5),
+ new Double(0.25, 0, 0.5, 1),
+
+ new Double(.10, .10, .20, .20),
+ new Double(.75, .75, .20, .20),
+ new Double(.75, .10, .20, .20),
+ new Double(.10, .75, .20, .20),
+ };
+
+ public static void main(final String[] args) throws IOException {
+ GraphicsEnvironment ge = GraphicsEnvironment
+ .getLocalGraphicsEnvironment();
+ GraphicsConfiguration gc = ge.getDefaultScreenDevice()
+ .getDefaultConfiguration();
+ AffineTransform at;
+ for (int size : SIZES) {
+ at = AffineTransform.getScaleInstance(size, size);
+ for (Shape clip : SHAPES) {
+ clip = at.createTransformedShape(clip);
+ for (Shape to : SHAPES) {
+ to = at.createTransformedShape(to);
+ // Prepare test images
+ BufferedImage snapshot;
+ VolatileImage source = getVolatileImage(gc, size);
+ VolatileImage target = getVolatileImage(gc, size);
+ int attempt = 0;
+ while (true) {
+ if (++attempt > 10) {
+ throw new RuntimeException("Too many attempts: " + attempt);
+ }
+ // Prepare source images
+ source.validate(gc);
+ Graphics2D g2d = source.createGraphics();
+ g2d.setColor(Color.RED);
+ g2d.fillRect(0, 0, size, size);
+ g2d.dispose();
+ if (source.validate(gc) != VolatileImage.IMAGE_OK) {
+ continue;
+ }
+ // Prepare target images
+ target.validate(gc);
+ g2d = target.createGraphics();
+ g2d.setColor(Color.GREEN);
+ g2d.fillRect(0, 0, size, size);
+ g2d.dispose();
+ if (target.validate(gc) != VolatileImage.IMAGE_OK) {
+ continue;
+ }
+
+ draw(clip, to, source, target);
+ snapshot = target.getSnapshot();
+ if (source.contentsLost() || target.contentsLost()) {
+ continue;
+ }
+ break;
+ }
+ // Prepare gold images
+ BufferedImage goldS = getSourceGold(gc, size);
+ BufferedImage goldT = getTargetGold(gc, size);
+ draw(clip, to, goldS, goldT);
+ validate(snapshot, goldT);
+ source.flush();
+ target.flush();
+ }
+ }
+ }
+ }
+
+ private static void draw(Shape clip, Shape shape, Image from, Image to) {
+ Graphics2D g2d = (Graphics2D) to.getGraphics();
+ g2d.setXORMode(Color.BLACK);
+ g2d.setClip(clip);
+ Rectangle toBounds = shape.getBounds();
+ g2d.drawImage(from, toBounds.x, toBounds.y, toBounds.width,
+ toBounds.height, null);
+ g2d.dispose();
+ }
+
+ private static BufferedImage getSourceGold(GraphicsConfiguration gc,
+ int size) {
+ final BufferedImage bi = gc.createCompatibleImage(size, size);
+ Graphics2D g2d = bi.createGraphics();
+ g2d.setColor(Color.RED);
+ g2d.fillRect(0, 0, size, size);
+ g2d.dispose();
+ return bi;
+ }
+
+ private static BufferedImage getTargetGold(GraphicsConfiguration gc,
+ int size) {
+ BufferedImage image = gc.createCompatibleImage(size, size);
+ Graphics2D g2d = image.createGraphics();
+ g2d.setColor(Color.GREEN);
+ g2d.fillRect(0, 0, size, size);
+ g2d.dispose();
+ return image;
+ }
+
+ private static VolatileImage getVolatileImage(GraphicsConfiguration gc,
+ int size) {
+ return gc.createCompatibleVolatileImage(size, size);
+ }
+
+ private static void validate(BufferedImage bi, BufferedImage goldbi)
+ throws IOException {
+ for (int x = 0; x < bi.getWidth(); ++x) {
+ for (int y = 0; y < bi.getHeight(); ++y) {
+ if (goldbi.getRGB(x, y) != bi.getRGB(x, y)) {
+ ImageIO.write(bi, "png", new File("actual.png"));
+ ImageIO.write(goldbi, "png", new File("expected.png"));
+ throw new RuntimeException("Test failed.");
+ }
+ }
+ }
+ }
+}
--- a/jdk/test/java/beans/Introspector/4058433/TestBeanProperty.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/beans/Introspector/4058433/TestBeanProperty.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -20,12 +20,14 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
import java.beans.BeanProperty;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyDescriptor;
import java.util.Arrays;
-/*
+
+/**
* @test
* @bug 4058433
* @summary Tests the BeanProperty annotation
@@ -34,7 +36,10 @@
*/
public class TestBeanProperty {
public static void main(String[] args) throws Exception {
- Class<?>[] types = {B.class, BL.class, BLF.class, E.class, H.class, P.class, VU.class, D.class, EV.class, EVL.class, EVX.class};
+ Class<?>[] types =
+ {B.class, BL.class, BLF.class, E.class, H.class, P.class,
+ VU.class, D.class, EVD.class, EVE.class, EV.class, EVL.class,
+ EVX.class};
for (Class<?> type : types) {
PropertyDescriptor pd = BeanUtils.getPropertyDescriptor(type, "value");
if (((B.class == type) || (BLF.class == type)) && pd.isBound()) {
@@ -77,6 +82,14 @@
BeanUtils.reportPropertyDescriptor(pd);
throw new Error("enumerationValues from another package");
}
+ if (EVD.class == type && !isEV(pd)) {
+ BeanUtils.reportPropertyDescriptor(pd);
+ throw new Error("EV:"+ pd.getValue("enumerationValues"));
+ }
+ if (EVE.class == type && !isEV(pd)) {
+ BeanUtils.reportPropertyDescriptor(pd);
+ throw new Error("EV:"+ pd.getValue("enumerationValues"));
+ }
}
}
@@ -219,6 +232,34 @@
}
}
+ public static class EVD {
+
+ private int value;
+
+ public int getValue() {
+ return value;
+ }
+
+ @BeanProperty()
+ public void setValue(int value) {
+ this.value = value;
+ }
+ }
+
+ public static class EVE {
+
+ private int value;
+
+ public int getValue() {
+ return value;
+ }
+
+ @BeanProperty(enumerationValues = {})
+ public void setValue(int value) {
+ this.value = value;
+ }
+ }
+
public static class EV {
private int value;
--- a/jdk/test/java/beans/Introspector/4058433/TestSwingContainer.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/beans/Introspector/4058433/TestSwingContainer.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -20,24 +20,31 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.util.Objects;
import javax.swing.SwingContainer;
-/*
+
+/**
* @test
* @bug 4058433
* @summary Tests the SwingContainer annotation
* @author Sergey Malenkov
*/
public class TestSwingContainer {
+
public static void main(String[] args) throws Exception {
test(X.class, null, null);
- test(T.class, true, null);
- test(D.class, true, "method");
- test(F.class, false, null);
- test(A.class, false, "method");
+ test(H.class, true, "");
+ test(G.class, true, "");
+ test(F.class, true, "method");
+ test(E.class, false, "");
+ test(D.class, false, "");
+ test(C.class, true, "");
+ test(B.class, false, "method");
+ test(A.class, true, "method");
}
private static void test(Class<?> type, Object iC, Object cD) throws Exception {
@@ -50,7 +57,7 @@
private static void test(BeanDescriptor bd, String name, Object expected) {
Object value = bd.getValue(name);
- System.out.println(name + " = " + value);
+ System.out.println("\t" + name + " = " + value);
if (!Objects.equals(value, expected)) {
throw new Error(name + ": expected = " + expected + "; actual = " + value);
}
@@ -60,18 +67,34 @@
}
@SwingContainer()
- public static class T {
+ public static class H {
+ }
+
+ @SwingContainer(delegate = "")
+ public static class G {
}
@SwingContainer(delegate = "method")
- public static class D {
+ public static class F {
}
@SwingContainer(false)
- public static class F {
+ public static class E {
+ }
+
+ @SwingContainer(value = false, delegate = "")
+ public static class D {
+ }
+
+ @SwingContainer(value = true, delegate = "")
+ public static class C {
}
@SwingContainer(value = false, delegate = "method")
+ public static class B {
+ }
+
+ @SwingContainer(value = true, delegate = "method")
public static class A {
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/io/FilePermission/FilePermissionCollection.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for FilePermissionCollection subclass
+ */
+
+import java.io.FilePermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+
+public class FilePermissionCollection {
+
+ public static void main(String[] args) throws Exception {
+
+ int testFail = 0;
+
+ FilePermission perm = new FilePermission("/tmp/foo", "read");
+ PermissionCollection perms = perm.newPermissionCollection();
+
+ // test 1
+ System.out.println
+ ("test 1: add throws IllegalArgExc for wrong perm type");
+ try {
+ perms.add(new SecurityPermission("createAccessControlContext"));
+ System.err.println("Expected IllegalArgumentException");
+ testFail++;
+ } catch (IllegalArgumentException iae) {}
+
+ // test 2
+ System.out.println("test 2: implies returns false for wrong perm type");
+ if (perms.implies(new SecurityPermission("getPolicy"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 3
+ System.out.println("test 3: implies returns true for match on " +
+ "name and action");
+ perms.add(new FilePermission("/tmp/foo", "read"));
+ if (!perms.implies(new FilePermission("/tmp/foo", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 4
+ System.out.println("test 4: implies returns false for match on " +
+ "name but not action");
+ if (perms.implies(new FilePermission("/tmp/foo", "write"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 5
+ System.out.println("test 5: implies returns true for match on " +
+ "name and subset of actions");
+ perms.add(new FilePermission("/tmp/bar", "read, write"));
+ if (!perms.implies(new FilePermission("/tmp/bar", "write"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 6
+ System.out.println("test 6: implies returns true for aggregate " +
+ "match on name and action");
+ perms.add(new FilePermission("/tmp/baz", "read"));
+ perms.add(new FilePermission("/tmp/baz", "write"));
+ if (!perms.implies(new FilePermission("/tmp/baz", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+ if (!perms.implies(new FilePermission("/tmp/baz", "write,read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 7
+ System.out.println("test 7: implies returns true for wildcard " +
+ "and match on action");
+ perms.add(new FilePermission("/usr/tmp/*", "read"));
+ if (!perms.implies(new FilePermission("/usr/tmp/foo", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 8
+ System.out.println
+ ("test 8: implies returns false for non-match on wildcard");
+ if (perms.implies(new FilePermission("/usr/tmp/bar/foo", "read"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 9
+ System.out.println
+ ("test 9: implies returns true for deep wildcard match");
+ perms.add(new FilePermission("/usr/tmp/-", "read"));
+ if (!perms.implies(new FilePermission("/usr/tmp/bar/foo", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 10
+ System.out.println("test 10: implies returns true for relative match");
+ perms.add(new FilePermission(".", "read"));
+ if (!perms.implies(new FilePermission(System.getProperty("user.dir"),
+ "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 11
+ System.out.println("test 11: implies returns true for all " +
+ "wildcard and match on action");
+ perms.add(new FilePermission("<<ALL FILES>>", "read"));
+ if (!perms.implies(new FilePermission("/tmp/foobar", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 12
+ System.out.println("test 12: implies returns false for wildcard " +
+ "and non-match on action");
+ if (perms.implies(new FilePermission("/tmp/foobar", "write"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 13
+ System.out.println("test 13: elements returns correct number of perms");
+ int numPerms = 0;
+ Enumeration<Permission> e = perms.elements();
+ while (e.hasMoreElements()) {
+ numPerms++;
+ System.out.println(e.nextElement());
+ }
+ // the two "/tmp/baz" entries were combined into one
+ if (numPerms != 7) {
+ System.err.println("Expected 7, got " + numPerms);
+ testFail++;
+ }
+
+ if (testFail > 0) {
+ throw new Exception(testFail + " test(s) failed");
+ }
+ }
+}
--- a/jdk/test/java/lang/ProcessHandle/OnExitTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/ProcessHandle/OnExitTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -26,21 +26,17 @@
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
-import java.util.Arrays;
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.stream.Collectors;
-import jdk.testlibrary.Platform;
import org.testng.annotations.Test;
import org.testng.Assert;
import org.testng.TestNG;
/*
* @test
- * @library /lib/testlibrary
* @summary Functions of Process.onExit and ProcessHandle.onExit
* @author Roger Riggs
*/
--- a/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Thu Jun 25 07:13:27 2015 +0000
@@ -48,20 +48,21 @@
UnixCommands.ensureCommandsAvailable("cat");
Process p = runtime.exec(UnixCommands.cat() + " /dev/zero");
- long initMemory = usedMemory();
- boolean growing = false;
+ long prev = usedMemory();
+ int growing = 0;
for (int i = 1; i < 10; i++) {
Thread.sleep(100);
long used = usedMemory();
- if (used != initMemory) {
- System.out.printf("consuming memory: i: %d, initial: %d, used: %d, delta: %d%n",
- i, initMemory, used, used - initMemory);
+ if (used != prev) {
+ System.out.printf("consuming memory: i: %d, prev: %d, used: %d, delta: %d%n",
+ i, prev, used, used - prev);
}
- if (used > initMemory + THRESHOLD)
- growing = true;
+ if (used > prev + THRESHOLD)
+ growing += 1;
+ prev = used;
}
- if (growing)
- throw new Exception("Process consumes memory.");
+ if (growing > 2)
+ throw new Exception("Process consumes memory: growing " + growing);
}
}
--- a/jdk/test/java/lang/SecurityManager/CheckPackageAccess.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/SecurityManager/CheckPackageAccess.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -29,12 +29,9 @@
* @run main/othervm CheckPackageAccess
*/
-import java.security.Security;
import java.util.Collections;
-import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
-import java.util.StringTokenizer;
/*
* The main benefit of this test is to catch merge errors or other types
@@ -44,60 +41,12 @@
*/
public class CheckPackageAccess {
- /*
- * This array should be updated whenever new packages are added to the
- * package.access property in the java.security file
- * NOTE: it should be in the same order as the java.security file
- */
- private static final String[] packages = {
- "sun.",
- "com.sun.xml.internal.",
- "com.sun.imageio.",
- "com.sun.istack.internal.",
- "com.sun.jmx.",
- "com.sun.media.sound.",
- "com.sun.naming.internal.",
- "com.sun.proxy.",
- "com.sun.corba.se.",
- "com.sun.org.apache.bcel.internal.",
- "com.sun.org.apache.regexp.internal.",
- "com.sun.org.apache.xerces.internal.",
- "com.sun.org.apache.xpath.internal.",
- "com.sun.org.apache.xalan.internal.extensions.",
- "com.sun.org.apache.xalan.internal.lib.",
- "com.sun.org.apache.xalan.internal.res.",
- "com.sun.org.apache.xalan.internal.templates.",
- "com.sun.org.apache.xalan.internal.utils.",
- "com.sun.org.apache.xalan.internal.xslt.",
- "com.sun.org.apache.xalan.internal.xsltc.cmdline.",
- "com.sun.org.apache.xalan.internal.xsltc.compiler.",
- "com.sun.org.apache.xalan.internal.xsltc.trax.",
- "com.sun.org.apache.xalan.internal.xsltc.util.",
- "com.sun.org.apache.xml.internal.res.",
- "com.sun.org.apache.xml.internal.security.",
- "com.sun.org.apache.xml.internal.serializer.utils.",
- "com.sun.org.apache.xml.internal.utils.",
- "com.sun.org.glassfish.",
- "com.sun.tools.script.",
- "com.oracle.xmlns.internal.",
- "com.oracle.webservices.internal.",
- "org.jcp.xml.dsig.internal.",
- "jdk.internal.",
- "jdk.nashorn.internal.",
- "jdk.nashorn.tools.",
- "jdk.tools.jimage.",
- "com.sun.activation.registries."
- };
+ public static void main(String[] args) throws Exception {
+ // get expected list of restricted packages
+ List<String> pkgs = RestrictedPackages.expected();
- public static void main(String[] args) throws Exception {
- List<String> pkgs = new ArrayList<>(Arrays.asList(packages));
- String osName = System.getProperty("os.name");
- if (osName.contains("OS X")) {
- pkgs.add("apple."); // add apple package for OS X
- }
-
- List<String> jspkgs =
- getPackages(Security.getProperty("package.access"));
+ // get actual list of restricted packages
+ List<String> jspkgs = RestrictedPackages.actual();
if (!isOpenJDKOnly()) {
String lastPkg = pkgs.get(pkgs.size() - 1);
@@ -127,7 +76,7 @@
}
System.setSecurityManager(new SecurityManager());
SecurityManager sm = System.getSecurityManager();
- for (String pkg : packages) {
+ for (String pkg : pkgs) {
String subpkg = pkg + "foo";
try {
sm.checkPackageAccess(pkg);
@@ -153,18 +102,6 @@
System.out.println("Test passed");
}
- private static List<String> getPackages(String p) {
- List<String> packages = new ArrayList<>();
- if (p != null && !p.equals("")) {
- StringTokenizer tok = new StringTokenizer(p, ",");
- while (tok.hasMoreElements()) {
- String s = tok.nextToken().trim();
- packages.add(s);
- }
- }
- return packages;
- }
-
private static boolean isOpenJDKOnly() {
String prop = System.getProperty("java.runtime.name");
return prop != null && prop.startsWith("OpenJDK");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/SecurityManager/CheckPackageMatching.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,545 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8072692
+ * @summary Check the matching implemented by SecurityManager.checkPackageAccess
+ * @run main/othervm CheckPackageMatching
+ */
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+/*
+ * The purpose of this test is not to verify the content of the package
+ * access list - but to ensure that the matching implemented by the
+ * SecurityManager is correct. This is why we have our own pattern matching
+ * algorithm here.
+ */
+public class CheckPackageMatching {
+
+ /**
+ * The restricted packages listed in the package.access property of the
+ * java.security file.
+ */
+ private static final String[] packages =
+ RestrictedPackages.actual().toArray(new String[0]);
+
+ private static final boolean OPEN_JDK = isOpenJDKOnly();
+
+ /**
+ * PackageMatcher implements a state machine that matches package
+ * names against packages parsed from the package access list.
+ */
+ private static abstract class PackageMatcher {
+ // For each state, chars[state] contains the chars that matches.
+ private final char[][] chars;
+ // For each state, states[state][i] contains the next state to go
+ // to when chars[state][i] matches the current character.
+ private final int[][] states;
+
+ // Some markers. We're making the assumption that 0
+ // cannot be a valid character for a package name.
+ //
+ // We use 0 for marking that we expect an end of string in
+ // char[state][i].
+ private static final char END_OF_STRING = 0;
+ // This special state value indicates that we expect the string to end
+ // there.
+ private static final int END_STATE = -1;
+ // This special state value indicates that we can accept any character
+ // from now on.
+ private static final int WILDCARD_STATE = Integer.MIN_VALUE;
+
+ // Create the data for a new state machine to match package names from
+ // the array of package names passed as argument.
+ // Each package name in the array is expected to end with '.'
+ // For each package in packages we're going to compile state data
+ // that will match the regexp:
+ // ^packages[i].substring(0, packages[i].length()-1).replace(".","\\.")$|^packages[i].replace(".","\\.").*
+ //
+ // Let's say the package array is:
+ //
+ // String[] packages = { "sun.", "com.sun.jmx.", "com.sun.proxy.",
+ // "apple." };
+ //
+ // then the state machine will need data that looks like:
+ //
+ // char[][] chars = {
+ // { 'a', 'c', 's' }, { 'p' }, { 'p' }, { 'l' }, { 'e' }, { 0, '.' },
+ // { 'o' }, { 'm' }, { '.' }, { 's' }, { 'u' }, { 'n' }, { '.' },
+ // { 'j', 'p'},
+ // { 'm' }, { 'x' }, { 0, '.' },
+ // { 'r' }, { 'o' }, { 'x' }, { 'y' }, { 0, '.' },
+ // { 'u' }, { 'n' }, { 0, '.' }
+ // }
+ // int[][] states = {
+ // { 1, 6, 22 }, { 2 }, { 3 }, { 4 }, { 5 },
+ // { END_STATE, WILDCARD_STATE },
+ // { 7 }, { 8 }, { 9 }, { 10 }, { 11 }, { 12 }, { 13 }, { 14, 17 },
+ // { 15 }, { 16 }, { END_STATE, WILDCARD_STATE },
+ // { 18 }, { 19 }, { 20 }, { 21 }, { END_STATE, WILDCARD_STATE },
+ // { 23 }, { 24 }, { END_STATE, WILDCARD_STATE }
+ // }
+ //
+ // The machine will start by loading the chars and states for state 0
+ // chars[0] => { 'a', 'c', 's' } states[0] => { 1, 6, 22 }
+ // then it examines the char at index 0 in the candidate name.
+ // if the char matches one of the characters in chars[0], then it goes
+ // to the corresponding state in states[0]. For instance - if the first
+ // char in the candidate name is 's', which corresponds to chars[0][2] -
+ // then it will proceed with the next char in the candidate name and go
+ // to state 22 (as indicated by states[0][2]) - where it will load the
+ // chars and states for states 22: chars[22] = { 'u' },
+ // states[22] = { 23 } etc... until the candidate char at the current
+ // index matches no char in chars[states] => the candidate name doesn't
+ // match - or until it finds a success termination condition: the
+ // candidate chars are exhausted and states[state][0] is END_STATE, or
+ // the candidate chars are not exhausted - and
+ // states[state][chars[state]] is WILDCARD_STATE indicating a '.*' like
+ // regexp.
+ //
+ // [Note that the chars in chars[i] are sorted]
+ //
+ // The compile(...) method is reponsible for building the state machine
+ // data and is called only once in the constructor.
+ //
+ // The matches(String candidate) method will tell whether the candidate
+ // matches by implementing the algorithm described above.
+ //
+ PackageMatcher(String[] packages) {
+ final boolean[] selected = new boolean[packages.length];
+ Arrays.fill(selected, true);
+ final ArrayList<char[]> charList = new ArrayList<>();
+ final ArrayList<int[]> stateList = new ArrayList<>();
+ compile(0, 0, packages, selected, charList, stateList);
+ chars = charList.toArray(new char[0][0]);
+ states = stateList.toArray(new int[0][0]);
+ }
+
+ /**
+ * Compiles the state machine data (recursive).
+ *
+ * @param step The index of the character which we're looking at in
+ * this step.
+ * @param state The current state (starts at 0).
+ * @param pkgs The list of packages from which the automaton is built.
+ * @param selected Indicates which packages we're looking at in this
+ step.
+ * @param charList The list from which we will build
+ {@code char[][] chars;}
+ * @param stateList The list from which we will build
+ {@code int[][] states;}
+ * @return the next available state.
+ */
+ private int compile(int step, int state, String[] pkgs,
+ boolean[] selected, ArrayList<char[]> charList,
+ ArrayList<int[]> stateList) {
+ final char[] next = new char[pkgs.length];
+ final int[] nexti = new int[pkgs.length];
+ int j = 0;
+ char min = Character.MAX_VALUE; char max = 0;
+ for (int i = 0; i < pkgs.length; i++) {
+ if (!selected[i]) continue;
+ final String p = pkgs[i];
+ final int len = p.length();
+ if (step > len) {
+ selected[i] = false;
+ continue;
+ }
+ if (len - 1 == step) {
+ boolean unknown = true;
+ for (int k = 0; k < j ; k++) {
+ if (next[k] == END_OF_STRING) {
+ unknown = false;
+ break;
+ }
+ }
+ if (unknown) {
+ next[j] = END_OF_STRING;
+ j++;
+ }
+ nexti[i] = END_STATE;
+ }
+ final char c = p.charAt(step);
+ nexti[i] = len - 1 == step ? END_STATE : c;
+ boolean unknown = j == 0 || c < min || c > max;
+ if (!unknown) {
+ if (c != min || c != max) {
+ unknown = true;
+ for (int k = 0; k < j ; k++) {
+ if (next[k] == c) {
+ unknown = false;
+ break;
+ }
+ }
+ }
+ }
+ if (unknown) {
+ min = min > c ? c : min;
+ max = max < c ? c : max;
+ next[j] = c;
+ j++;
+ }
+ }
+ final char[] nc = new char[j];
+ final int[] nst = new int[j];
+ System.arraycopy(next, 0, nc, 0, nc.length);
+ Arrays.sort(nc);
+ final boolean ns[] = new boolean[pkgs.length];
+
+ charList.ensureCapacity(state + 1);
+ stateList.ensureCapacity(state + 1);
+ charList.add(state, nc);
+ stateList.add(state, nst);
+ state = state + 1;
+ for (int k = 0; k < nc.length; k++) {
+ int selectedCount = 0;
+ boolean endStateFound = false;
+ boolean wildcardFound = false;
+ for (int l = 0; l < nexti.length; l++) {
+ if (!(ns[l] = selected[l])) {
+ continue;
+ }
+ ns[l] = nexti[l] == nc[k] || nexti[l] == END_STATE
+ && nc[k] == '.';
+ endStateFound = endStateFound || nc[k] == END_OF_STRING
+ && nexti[l] == END_STATE;
+ wildcardFound = wildcardFound || nc[k] == '.'
+ && nexti[l] == END_STATE;
+ if (ns[l]) {
+ selectedCount++;
+ }
+ }
+ nst[k] = (endStateFound ? END_STATE
+ : wildcardFound ? WILDCARD_STATE : state);
+ if (selectedCount == 0 || wildcardFound) {
+ continue;
+ }
+ state = compile(step + 1, state, pkgs, ns, charList, stateList);
+ }
+ return state;
+ }
+
+ /**
+ * Matches 'pkg' against the list of package names compiled in the
+ * state machine data.
+ *
+ * @param pkg The package name to match. Must not end with '.'.
+ * @return true if the package name matches, false otherwise.
+ */
+ public boolean matches(String pkg) {
+ int state = 0;
+ int i;
+ final int len = pkg.length();
+ next: for (i = 0; i <= len; i++) {
+ if (state == WILDCARD_STATE) {
+ return true; // all characters will match.
+ }
+ if (state == END_STATE) {
+ return i == len;
+ }
+ final char[] ch = chars[state];
+ final int[] st = states[state];
+ if (i == len) {
+ // matches only if we have exhausted the string.
+ return st[0] == END_STATE;
+ }
+ if (st[0] == END_STATE && st.length == 1) {
+ // matches only if we have exhausted the string.
+ return i == len;
+ }
+ final char c = pkg.charAt(i); // look at next char...
+ for (int j = st[0] == END_STATE ? 1 : 0; j < ch.length; j++) {
+ final char n = ch[j];
+ if (c == n) { // found a match
+ state = st[j]; // get the next state.
+ continue next; // go to next state
+ } else if (c < n) {
+ break; // chars are sorted. we won't find it. no match.
+ }
+ }
+ break; // no match
+ }
+ return false;
+ }
+ }
+
+ private static final class TestPackageMatcher extends PackageMatcher {
+ private final List<String> list;
+
+ TestPackageMatcher(String[] packages) {
+ super(packages);
+ this.list = Collections.unmodifiableList(Arrays.asList(packages));
+ }
+
+ @Override
+ public boolean matches(String pkg) {
+ final boolean match1 = super.matches(pkg);
+ boolean match2 = false;
+ String p2 = pkg + ".";
+ for (String p : list) {
+ if (pkg.startsWith(p) || p2.equals(p)) {
+ match2 = true;
+ break;
+ }
+ }
+ if (match1 != match2) {
+ System.err.println("Test Bug: PackageMatcher.matches(\"" +
+ pkg + "\") returned " + match1);
+ System.err.println("Package Access List is: " + list);
+ throw new Error("Test Bug: PackageMatcher.matches(\"" +
+ pkg + "\") returned " + match1);
+ }
+ return match1;
+ }
+ }
+
+ private static void smokeTest() {
+ // these checks should pass.
+ System.getSecurityManager().checkPackageAccess("com.sun.blah");
+ System.getSecurityManager().checkPackageAccess("com.sun.jm");
+ System.getSecurityManager().checkPackageAccess("com.sun.jmxa");
+ System.getSecurityManager().checkPackageAccess("jmx");
+ List<String> actual = Arrays.asList(packages);
+ for (String p : actual) {
+ if (!actual.contains(p)) {
+ System.err.println("Warning: '" + p + " not in package.access");
+ }
+ }
+ if (!actual.contains("sun.")) {
+ throw new Error("package.access does not contain 'sun.'");
+ }
+ }
+
+ // This is a sanity test for our own test code.
+ private static void testTheTest(String[] pkgs, char[][] chars,
+ int[][] states) {
+
+ PackageMatcher m = new TestPackageMatcher(pkgs);
+ String unexpected = "";
+ if (!Arrays.deepEquals(chars, m.chars)) {
+ System.err.println("Char arrays differ");
+ if (chars.length != m.chars.length) {
+ System.err.println("Char array lengths differ: expected="
+ + chars.length + " actual=" + m.chars.length);
+ }
+ System.err.println(Arrays.deepToString(m.chars).replace((char)0,
+ '0'));
+ unexpected = "chars[]";
+ }
+ if (!Arrays.deepEquals(states, m.states)) {
+ System.err.println("State arrays differ");
+ if (states.length != m.states.length) {
+ System.err.println("Char array lengths differ: expected="
+ + states.length + " actual=" + m.states.length);
+ }
+ System.err.println(Arrays.deepToString(m.states));
+ if (unexpected.length() > 0) {
+ unexpected = unexpected + " and ";
+ }
+ unexpected = unexpected + "states[]";
+ }
+
+ if (unexpected.length() > 0) {
+ throw new Error("Unexpected "+unexpected+" in PackageMatcher");
+ }
+
+ testMatches(m, pkgs);
+ }
+
+ // This is a sanity test for our own test code.
+ private static void testTheTest() {
+ final String[] packages2 = { "sun.", "com.sun.jmx.",
+ "com.sun.proxy.", "apple." };
+
+ final int END_STATE = PackageMatcher.END_STATE;
+ final int WILDCARD_STATE = PackageMatcher.WILDCARD_STATE;
+
+ final char[][] chars2 = {
+ { 'a', 'c', 's' }, { 'p' }, { 'p' }, { 'l' }, { 'e' }, { 0, '.' },
+ { 'o' }, { 'm' }, { '.' }, { 's' }, { 'u' }, { 'n' }, { '.' },
+ { 'j', 'p'},
+ { 'm' }, { 'x' }, { 0, '.' },
+ { 'r' }, { 'o' }, { 'x' }, { 'y' }, { 0, '.' },
+ { 'u' }, { 'n' }, { 0, '.' }
+ };
+
+ final int[][] states2 = {
+ { 1, 6, 22 }, { 2 }, { 3 }, { 4 }, { 5 },
+ { END_STATE, WILDCARD_STATE },
+ { 7 }, { 8 }, { 9 }, { 10 }, { 11 }, { 12 }, { 13 }, { 14, 17 },
+ { 15 }, { 16 }, { END_STATE, WILDCARD_STATE },
+ { 18 }, { 19 }, { 20 }, { 21 }, { END_STATE, WILDCARD_STATE },
+ { 23 }, { 24 }, { END_STATE, WILDCARD_STATE }
+ };
+
+ testTheTest(packages2, chars2, states2);
+
+ final String[] packages3 = { "sun.", "com.sun.pro.",
+ "com.sun.proxy.", "apple." };
+
+ final char[][] chars3 = {
+ { 'a', 'c', 's' }, { 'p' }, { 'p' }, { 'l' }, { 'e' }, { 0, '.' },
+ { 'o' }, { 'm' }, { '.' }, { 's' }, { 'u' }, { 'n' }, { '.' },
+ { 'p' }, { 'r' }, { 'o' }, { 0, '.', 'x' },
+ { 'y' }, { 0, '.' },
+ { 'u' }, { 'n' }, { 0, '.' }
+ };
+
+ final int[][] states3 = {
+ { 1, 6, 19 }, { 2 }, { 3 }, { 4 }, { 5 },
+ { END_STATE, WILDCARD_STATE },
+ { 7 }, { 8 }, { 9 }, { 10 }, { 11 }, { 12 }, { 13 }, { 14 },
+ { 15 }, { 16 }, { END_STATE, WILDCARD_STATE, 17 },
+ { 18 }, { END_STATE, WILDCARD_STATE },
+ { 20 }, { 21 }, { END_STATE, WILDCARD_STATE }
+ };
+
+ testTheTest(packages3, chars3, states3);
+ }
+
+ private static volatile boolean sanityTesting = false;
+
+ public static void main(String[] args) {
+ System.setSecurityManager(new SecurityManager());
+
+ // Some smoke tests.
+ smokeTest();
+ System.out.println("Smoke tests passed.");
+
+ // Test our own pattern matching algorithm. Here we actually test
+ // the PackageMatcher class from our own test code.
+ sanityTesting = true;
+ try {
+ testTheTest();
+ System.out.println("Sanity tests passed.");
+ } finally {
+ sanityTesting = false;
+ }
+
+ // Now test the package matching in the security manager.
+ PackageMatcher matcher = new TestPackageMatcher(packages);
+
+ // These should not match.
+ for (String pkg : new String[] {"gloups.machin", "su",
+ "org.jcp.xml.dsig.interna",
+ "com.sun.jm", "com.sun.jmxa"}) {
+ testMatch(matcher, pkg, false, true);
+ }
+
+ // These should match.
+ for (String pkg : Arrays.asList(
+ new String[] {"sun.gloups.machin", "sun", "sun.com",
+ "com.sun.jmx", "com.sun.jmx.a",
+ "org.jcp.xml.dsig.internal",
+ "org.jcp.xml.dsig.internal.foo"})) {
+ testMatch(matcher, pkg, true, true);
+ }
+
+ // Derive a list of packages that should match or not match from
+ // the list in 'packages' - and check that the security manager
+ // throws the appropriate exception.
+ testMatches(matcher, packages);
+ }
+
+ private static void testMatches(PackageMatcher matcher, String[] pkgs) {
+ Collection<String> pkglist = Arrays.asList(pkgs);
+ PackageMatcher ref = new TestPackageMatcher(packages);
+
+ for (String pkg : pkgs) {
+ String candidate = pkg + "toto";
+ boolean expected = true;
+ testMatch(matcher, candidate, expected,
+ ref.matches(candidate) == expected);
+ }
+
+ for (String pkg : pkgs) {
+ String candidate = pkg.substring(0, pkg.length() - 1);
+ boolean expected = pkglist.contains(candidate + ".");
+ testMatch(matcher, candidate, expected,
+ ref.matches(candidate) == expected);
+ }
+
+ for (String pkg : pkgs) {
+ if (!OPEN_JDK && pkg.equals("com.sun.media.sound.")) {
+ // don't test com.sun.media.sound since there is an entry
+ // for com.sun.media in non OpenJDK builds. Otherwise,
+ // the test for this package will fail unexpectedly.
+ continue;
+ }
+ String candidate = pkg.substring(0, pkg.length() - 2);
+ boolean expected = pkglist.contains(candidate + ".");
+ testMatch(matcher, candidate, expected,
+ ref.matches(candidate) == expected);
+ }
+ }
+
+ private static void testMatch(PackageMatcher matcher, String candidate,
+ boolean expected, boolean testSecurityManager)
+ {
+ final boolean m = matcher.matches(candidate);
+ if (m != expected) {
+ final String msg = "\"" + candidate + "\": " +
+ (m ? "matches" : "does not match");
+ throw new Error("PackageMatcher does not give expected results: "
+ + msg);
+ }
+
+ if (sanityTesting) {
+ testSecurityManager = false;
+ }
+
+ if (testSecurityManager) {
+ System.out.println("Access to " + candidate + " should be " +
+ (expected ? "rejected" : "granted"));
+ final String errormsg = "\"" + candidate + "\" : " +
+ (expected ? "granted" : "not granted");
+ try {
+ System.getSecurityManager().checkPackageAccess(candidate);
+ if (expected) {
+ System.err.println(errormsg);
+ throw new Error("Expected exception not thrown: " +
+ errormsg);
+ }
+ } catch (SecurityException x) {
+ if (!expected) {
+ System.err.println(errormsg);
+ throw new Error(errormsg + " - unexpected exception: " +
+ x, x);
+ } else {
+ System.out.println("Got expected exception: " + x);
+ }
+ }
+ }
+ }
+
+ private static boolean isOpenJDKOnly() {
+ String prop = System.getProperty("java.runtime.name");
+ return prop != null && prop.startsWith("OpenJDK");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/SecurityManager/RestrictedPackages.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.Security;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * A collection of utility methods and constants for testing the package
+ * access and package definition security checks.
+ */
+final class RestrictedPackages {
+
+ /*
+ * The expected list of restricted packages.
+ *
+ * This array should be updated whenever new packages are added to the
+ * package.access property in the java.security file
+ * NOTE: it should be in the same order as the java.security file
+ */
+ static final String[] EXPECTED = {
+ "sun.",
+ "com.sun.xml.internal.",
+ "com.sun.imageio.",
+ "com.sun.istack.internal.",
+ "com.sun.jmx.",
+ "com.sun.media.sound.",
+ "com.sun.naming.internal.",
+ "com.sun.proxy.",
+ "com.sun.corba.se.",
+ "com.sun.org.apache.bcel.internal.",
+ "com.sun.org.apache.regexp.internal.",
+ "com.sun.org.apache.xerces.internal.",
+ "com.sun.org.apache.xpath.internal.",
+ "com.sun.org.apache.xalan.internal.extensions.",
+ "com.sun.org.apache.xalan.internal.lib.",
+ "com.sun.org.apache.xalan.internal.res.",
+ "com.sun.org.apache.xalan.internal.templates.",
+ "com.sun.org.apache.xalan.internal.utils.",
+ "com.sun.org.apache.xalan.internal.xslt.",
+ "com.sun.org.apache.xalan.internal.xsltc.cmdline.",
+ "com.sun.org.apache.xalan.internal.xsltc.compiler.",
+ "com.sun.org.apache.xalan.internal.xsltc.trax.",
+ "com.sun.org.apache.xalan.internal.xsltc.util.",
+ "com.sun.org.apache.xml.internal.res.",
+ "com.sun.org.apache.xml.internal.security.",
+ "com.sun.org.apache.xml.internal.serializer.utils.",
+ "com.sun.org.apache.xml.internal.utils.",
+ "com.sun.org.glassfish.",
+ "com.sun.tools.script.",
+ "com.oracle.xmlns.internal.",
+ "com.oracle.webservices.internal.",
+ "org.jcp.xml.dsig.internal.",
+ "jdk.internal.",
+ "jdk.nashorn.internal.",
+ "jdk.nashorn.tools.",
+ "jdk.tools.jimage.",
+ "com.sun.activation.registries."
+ };
+
+ /*
+ * A non-exhaustive list of restricted packages.
+ *
+ * Contrary to what is in the EXPECTED list, this list does not need
+ * to be exhaustive.
+ */
+ static final String[] EXPECTED_NONEXHAUSTIVE = {
+ "sun.",
+ "com.sun.xml.internal.",
+ "com.sun.imageio.",
+ "com.sun.istack.internal.",
+ "com.sun.jmx.",
+ "com.sun.proxy.",
+ "com.sun.org.apache.bcel.internal.",
+ "com.sun.org.apache.regexp.internal.",
+ "com.sun.org.apache.xerces.internal.",
+ "com.sun.org.apache.xpath.internal.",
+ "com.sun.org.apache.xalan.internal.extensions.",
+ "com.sun.org.apache.xalan.internal.lib.",
+ "com.sun.org.apache.xalan.internal.res.",
+ "com.sun.org.apache.xalan.internal.templates.",
+ "com.sun.org.apache.xalan.internal.utils.",
+ "com.sun.org.apache.xalan.internal.xslt.",
+ "com.sun.org.apache.xalan.internal.xsltc.cmdline.",
+ "com.sun.org.apache.xalan.internal.xsltc.compiler.",
+ "com.sun.org.apache.xalan.internal.xsltc.trax.",
+ "com.sun.org.apache.xalan.internal.xsltc.util.",
+ "com.sun.org.apache.xml.internal.res.",
+ "com.sun.org.apache.xml.internal.serializer.utils.",
+ "com.sun.org.apache.xml.internal.utils.",
+ "com.sun.org.apache.xml.internal.security.",
+ "com.sun.org.glassfish.",
+ "org.jcp.xml.dsig.internal."
+ };
+
+ private static final String OS_NAME = System.getProperty("os.name");
+
+ /**
+ * Returns a list of expected restricted packages, including any
+ * OS specific packages. The returned list is mutable.
+ */
+ static List<String> expected() {
+ List<String> pkgs = new ArrayList<>(Arrays.asList(EXPECTED));
+ if (OS_NAME.contains("OS X")) {
+ pkgs.add("apple."); // add apple package for OS X
+ }
+ return pkgs;
+ }
+
+ /**
+ * Returns a list of actual restricted packages. The returned list
+ * is mutable.
+ */
+ static List<String> actual() {
+ String prop = Security.getProperty("package.access");
+ List<String> packages = new ArrayList<>();
+ if (prop != null && !prop.equals("")) {
+ StringTokenizer tok = new StringTokenizer(prop, ",");
+ while (tok.hasMoreElements()) {
+ String s = tok.nextToken().trim();
+ packages.add(s);
+ }
+ }
+ return packages;
+ }
+
+ private RestrictedPackages() { }
+}
--- a/jdk/test/java/lang/annotation/TypeAnnotationReflection.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/annotation/TypeAnnotationReflection.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8004698 8007073 8022343
+ * @bug 8004698 8007073 8022343 8054304 8058595
* @summary Unit test for type annotations
*/
@@ -200,6 +200,17 @@
check(annos.length == 1);
check(annos[0].annotationType().equals(TypeAnno.class));
check(((TypeAnno)annos[0]).value().equals("M Runnable"));
+
+ // Check that AnnotatedTypeVariable.getAnnotatedBounds() returns jlO for a naked
+ // type variable (i.e no bounds, no annotations)
+ Method m4 = TestClassTypeVarAndField.class.getDeclaredMethod("foo4", (Class<?>[])null);
+ AnnotatedType ret4 = m4.getAnnotatedReturnType();
+ AnnotatedType[] annotatedBounds4 = ((AnnotatedTypeVariable)ret4).getAnnotatedBounds();
+ check(annotatedBounds4.length == 1);
+
+ annos = annotatedBounds4[0].getAnnotations();
+ check(annos.length == 0);
+ check(annotatedBounds4[0].getType().equals(Object.class));
}
private static void testFields() throws Exception {
@@ -231,7 +242,7 @@
private static void testClassTypeVar() throws Exception {
TypeVariable[] typeVars = TestClassTypeVarAndField.class.getTypeParameters();
Annotation[] annos;
- check(typeVars.length == 2);
+ check(typeVars.length == 3);
// First TypeVar
AnnotatedType[] annotatedBounds = typeVars[0].getAnnotatedBounds();
@@ -262,6 +273,14 @@
check(annos.length == 1);
check(annos[0].annotationType().equals(TypeAnno2.class));
check(((TypeAnno2)annos[0]).value().equals("EEBound"));
+
+ // third Typevar V declared without explicit bounds should see jlO as its bound.
+ annotatedBounds = typeVars[2].getAnnotatedBounds();
+ check(annotatedBounds.length == 1);
+
+ annos = annotatedBounds[0].getAnnotations();
+ check(annos.length == 0);
+ check(annotatedBounds[0].getType().equals(Object.class));
}
private static void testMethodTypeVar() throws Exception {
@@ -282,7 +301,7 @@
// Second method
m2 = TestClassTypeVarAndField.class.getDeclaredMethod("foo3", (Class<?>[])null);
t = m2.getTypeParameters();
- check(t.length == 1);
+ check(t.length == 2);
annos = t[0].getAnnotations();
check(annos.length == 1);
check(annos[0].annotationType().equals(TypeAnno.class));
@@ -293,6 +312,14 @@
annos = annotatedBounds2[0].getAnnotations();
check(annos.length == 0);
+
+ // for the naked type variable L of foo3, we should see jlO as its bound.
+ annotatedBounds2 = t[1].getAnnotatedBounds();
+ check(annotatedBounds2.length == 1);
+ check(annotatedBounds2[0].getType().equals(Object.class));
+
+ annos = annotatedBounds2[0].getAnnotations();
+ check(annos.length == 0);
}
private static void testParameterizedType() {
@@ -357,9 +384,24 @@
w = (AnnotatedWildcardType)((AnnotatedParameterizedType)f
.getAnnotatedType()).getAnnotatedActualTypeArguments()[0];
t = w.getAnnotatedUpperBounds();
- check(t.length == 0);
+ check(t.length == 1);
+ check(t[0].getType().equals(Object.class));
+ annos = t[0].getAnnotations();
+ check(annos.length == 0);
t = w.getAnnotatedLowerBounds();
check(t.length == 1);
+
+ // for an unbounded wildcard, we should see jlO as its upperbound and null type as its lower bound.
+ f = TestWildcardType.class.getDeclaredField("f3");
+ w = (AnnotatedWildcardType)((AnnotatedParameterizedType)f
+ .getAnnotatedType()).getAnnotatedActualTypeArguments()[0];
+ t = w.getAnnotatedUpperBounds();
+ check(t.length == 1);
+ check(t[0].getType().equals(Object.class));
+ annos = t[0].getAnnotations();
+ check(annos.length == 0);
+ t = w.getAnnotatedLowerBounds();
+ check(t.length == 0);
}
private static void testParameterTypes() throws Exception {
@@ -515,6 +557,7 @@
public <T> List<? super T> foo() { return null;}
public Class<@TypeAnno("1") ? extends @TypeAnno("2") Annotation> f1;
public Class<@TypeAnno("3") ? super @TypeAnno("4") Annotation> f2;
+ public Class<@TypeAnno("5") ?> f3;
}
abstract class TestParameterizedType implements @TypeAnno("M") Map<@TypeAnno("S")String, @TypeAnno("I") @TypeAnno2("I2")Integer> {
@@ -555,14 +598,15 @@
abstract class TestClassTypeVarAndField <T extends @TypeAnno("Object1") Object
& @TypeAnno("Runnable1") @TypeAnno2("Runnable2") Runnable,
- @TypeAnno("EE")EE extends @TypeAnno2("EEBound") Runnable > {
+ @TypeAnno("EE")EE extends @TypeAnno2("EEBound") Runnable, V > {
@TypeAnno("T1 field") @TypeAnno2("T2 field") T field1;
T field2;
@TypeAnno("Object field") Object field3;
public @TypeAnno("t1") @TypeAnno2("t2") T foo(){ return null; }
public <M extends @TypeAnno("M Runnable") Runnable> M foo2() {return null;}
- public <@TypeAnno("K") K extends Cloneable> K foo3() {return null;}
+ public <@TypeAnno("K") K extends Cloneable, L> K foo3() {return null;}
+ public <L> L foo4() {return null;}
}
@Target(ElementType.TYPE_USE)
--- a/jdk/test/java/lang/invoke/8022701/InvokeSeveralWays.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/8022701/InvokeSeveralWays.java Thu Jun 25 07:13:27 2015 +0000
@@ -38,12 +38,19 @@
failures++;
} catch (InvocationTargetException e) {
Throwable c = e.getCause();
- if (expected.isInstance(c))
- System.out.println("EXPECTED: " + expected.getName() + ", "+ c);
- else {
- failures++;
- System.out.println("FAIL: Unexpected wrapped exception " + c);
- e.printStackTrace(System.out);
+ if (BootstrapMethodError.class.isInstance(c)) {
+ c = c.getCause();
+ if (expected.isInstance(c))
+ System.out.println("EXPECTED: " + expected.getName() + ", "+ c);
+ else {
+ failures++;
+ System.out.println("FAIL: Unexpected wrapped exception " + c);
+ e.printStackTrace(System.out);
+ }
+ } else {
+ failures++;
+ System.out.println("FAIL: Exception from MethodHandle invocation not wrapped in BootstrapMethodError " + c);
+ e.printStackTrace(System.out);
}
} catch (Throwable e) {
failures++;
@@ -74,14 +81,19 @@
Invoker.invoke();
System.out.println("FAIL: No exception throw, probably failed to load modified bytecodes for MethodSupplier");
failures++;
- } catch (Throwable e) {
- if (expected.isInstance(e))
- System.out.println("EXPECTED: " + expected.getName() + ", "+ e);
+ } catch (BootstrapMethodError e) {
+ Throwable c = e.getCause();
+ if (expected.isInstance(c))
+ System.out.println("EXPECTED: " + expected.getName() + ", "+ c);
else {
+ failures++;
+ System.out.println("FAIL: Unexpected exception has been caught " + c);
+ e.printStackTrace(System.out);
+ }
+ } catch (Throwable e) {
failures++;
- System.out.println("FAIL: Unexpected exception has been caught " + e);
+ System.out.println("FAIL: Exception from MethodHandle invocation not wrapped in BootstrapMethodError " + e);
e.printStackTrace(System.out);
- }
}
System.out.println();
try {
--- a/jdk/test/java/lang/invoke/LFCaching/LFCachingTestCase.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/LFCaching/LFCachingTestCase.java Thu Jun 25 07:13:27 2015 +0000
@@ -77,7 +77,7 @@
}
} catch (IllegalAccessException | IllegalArgumentException |
SecurityException | InvocationTargetException ex) {
- throw new Error("Unexpected exception: ", ex);
+ throw new Error("Unexpected exception", ex);
}
}
}
--- a/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,8 @@
/*
* @test LFGarbageCollectedTest
* @bug 8046703
+ * @key randomness
+ * @ignore 8078602
* @summary Test verifies that lambda forms are garbage collected
* @author kshefov
* @library /lib/testlibrary/jsr292 /lib/testlibrary
@@ -72,7 +74,7 @@
try {
adapter = testCase.getTestCaseMH(data, TestMethods.Kind.ONE);
} catch (NoSuchMethodException ex) {
- throw new Error("Unexpected exception: ", ex);
+ throw new Error("Unexpected exception", ex);
}
mtype = adapter.type();
Object lambdaForm = INTERNAL_FORM.invoke(adapter);
@@ -93,7 +95,7 @@
collectLambdaForm();
} catch (IllegalAccessException | IllegalArgumentException |
InvocationTargetException ex) {
- throw new Error("Unexpected exception: ", ex);
+ throw new Error("Unexpected exception", ex);
}
}
--- a/jdk/test/java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
/*
* @test LFMultiThreadCachingTest
* @bug 8046703
+ * @key randomness
* @summary Test verifies that lambda forms are cached when run with multiple threads
* @author kshefov
* @library /lib/testlibrary/jsr292 /lib/testlibrary
@@ -35,18 +36,23 @@
*/
import java.lang.invoke.MethodHandle;
+import java.util.Collections;
import java.util.EnumSet;
+import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
+import com.oracle.testlibrary.jsr292.CodeCacheOverflowProcessor;
/**
* Multiple threaded lambda forms caching test class.
*/
public final class LFMultiThreadCachingTest extends LFCachingTestCase {
+
private static final TestMethods.Kind[] KINDS;
+
static {
EnumSet<TestMethods.Kind> set = EnumSet.complementOf(EnumSet.of(TestMethods.Kind.EXCEPT));
KINDS = set.toArray(new TestMethods.Kind[set.size()]);
@@ -72,21 +78,55 @@
ConcurrentLinkedQueue<MethodHandle> adapters = new ConcurrentLinkedQueue<>();
CyclicBarrier begin = new CyclicBarrier(CORES);
CountDownLatch end = new CountDownLatch(CORES);
+ final Map<Thread, Throwable> threadUncaughtExceptions
+ = Collections.synchronizedMap(new HashMap<Thread, Throwable>(CORES));
+ Thread.UncaughtExceptionHandler exHandler = (t, e) -> {
+ threadUncaughtExceptions.put(t, e);
+ };
for (int i = 0; i < CORES; ++i) {
TestMethods.Kind kind = KINDS[i % KINDS.length];
- new Thread(() -> {
+ Thread t = new Thread(() -> {
try {
begin.await();
adapters.add(getTestMethod().getTestCaseMH(data, kind));
- } catch (InterruptedException | BrokenBarrierException | IllegalAccessException | NoSuchMethodException ex) {
- throw new Error("Unexpected exception: ", ex);
+ } catch (InterruptedException | BrokenBarrierException
+ | IllegalAccessException | NoSuchMethodException ex) {
+ throw new Error("Unexpected exception", ex);
} finally {
end.countDown();
}
- }).start();
+ });
+ t.setUncaughtExceptionHandler(exHandler);
+ t.start();
}
try {
end.await();
+ boolean vmeThrown = false;
+ boolean nonVmeThrown = false;
+ Throwable vme = null;
+ for (Map.Entry<Thread,
+ Throwable> entry : threadUncaughtExceptions.entrySet()) {
+ Thread t = entry.getKey();
+ Throwable e = entry.getValue();
+ System.err.printf("%nA thread with name \"%s\" of %d threads"
+ + " has thrown exception:%n", t.getName(), CORES);
+ e.printStackTrace();
+ if (CodeCacheOverflowProcessor.isThrowableCausedByVME(e)) {
+ vmeThrown = true;
+ vme = e;
+ } else {
+ nonVmeThrown = true;
+ }
+ if (nonVmeThrown) {
+ throw new Error("One ore more threads have"
+ + " thrown unexpected exceptions. See log.");
+ }
+ if (vmeThrown) {
+ throw new Error("One ore more threads have"
+ + " thrown VirtualMachineError caused by"
+ + " code cache overflow. See log.", vme);
+ }
+ }
} catch (InterruptedException ex) {
throw new Error("Unexpected exception: ", ex);
}
--- a/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
/*
* @test LFSingleThreadCachingTest
* @bug 8046703
+ * @key randomness
* @summary Test verifies that lambda forms are cached when run with single thread
* @author kshefov
* @library /lib/testlibrary/jsr292 /lib/testlibrary
@@ -62,7 +63,7 @@
adapter1 = getTestMethod().getTestCaseMH(data, TestMethods.Kind.ONE);
adapter2 = getTestMethod().getTestCaseMH(data, TestMethods.Kind.TWO);
} catch (NoSuchMethodException | IllegalAccessException ex) {
- throw new Error("Unexpected exception: ", ex);
+ throw new Error("Unexpected exception", ex);
}
checkLFCaching(adapter1, adapter2);
}
--- a/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
*/
import com.oracle.testlibrary.jsr292.Helper;
-import com.sun.management.HotSpotDiagnosticMXBean;
+import com.oracle.testlibrary.jsr292.CodeCacheOverflowProcessor;
import java.lang.invoke.MethodHandle;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
@@ -44,8 +44,6 @@
*/
public abstract class LambdaFormTestCase {
- private static final double ITERATIONS_TO_CODE_CACHE_SIZE_RATIO
- = 45 / (128.0 * 1024 * 1024);
private static final long TIMEOUT = Helper.IS_THOROUGH ? 0L : (long) (Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT) * 0.9);
/**
@@ -72,7 +70,7 @@
REF_FIELD = Reference.class.getDeclaredField("referent");
REF_FIELD.setAccessible(true);
} catch (Exception ex) {
- throw new Error("Unexpected exception: ", ex);
+ throw new Error("Unexpected exception", ex);
}
gcInfo = ManagementFactory.getGarbageCollectorMXBeans();
@@ -101,28 +99,6 @@
long iterations = Math.max(1, Helper.TEST_LIMIT / testCaseNum);
System.out.printf("Number of iterations according to -DtestLimit is %d (%d cases)%n",
iterations, iterations * testCaseNum);
- HotSpotDiagnosticMXBean hsDiagBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
- long codeCacheSize = Long.parseLong(
- hsDiagBean.getVMOption("ReservedCodeCacheSize").getValue());
- System.out.printf("Code cache size is %d bytes%n", codeCacheSize);
- long iterationsByCodeCacheSize = (long) (codeCacheSize
- * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
- long nonProfiledCodeCacheSize = Long.parseLong(
- hsDiagBean.getVMOption("NonProfiledCodeHeapSize").getValue());
- System.out.printf("Non-profiled code cache size is %d bytes%n", nonProfiledCodeCacheSize);
- long iterationsByNonProfiledCodeCacheSize = (long) (nonProfiledCodeCacheSize
- * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO);
- System.out.printf("Number of iterations limited by code cache size is %d (%d cases)%n",
- iterationsByCodeCacheSize, iterationsByCodeCacheSize * testCaseNum);
- System.out.printf("Number of iterations limited by non-profiled code cache size is %d (%d cases)%n",
- iterationsByNonProfiledCodeCacheSize, iterationsByNonProfiledCodeCacheSize * testCaseNum);
- iterations = Math.min(iterationsByCodeCacheSize,
- Math.min(iterations, iterationsByNonProfiledCodeCacheSize));
- if (iterations == 0) {
- System.out.println("Warning: code cache size is too small to provide at"
- + " least one iteration! Test will try to do one iteration.");
- iterations = 1;
- }
System.out.printf("Number of iterations is set to %d (%d cases)%n",
iterations, iterations * testCaseNum);
System.out.flush();
@@ -141,22 +117,27 @@
for (TestMethods testMethod : testMethods) {
LambdaFormTestCase testCase = ctor.apply(testMethod);
try {
- System.err.printf("Tested LF caching feature with MethodHandles.%s method.%n",
+ System.err.printf("Tested LF caching feature"
+ + " with MethodHandles.%s method.%n",
testCase.getTestMethod().name);
- testCase.doTest();
+ Throwable t = CodeCacheOverflowProcessor
+ .runMHTest(testCase::doTest);
+ if (t != null) {
+ return false;
+ }
System.err.println("PASSED");
- } catch (OutOfMemoryError e) {
+ } catch (OutOfMemoryError oome) {
// Don't swallow OOME so a heap dump can be created.
System.err.println("FAILED");
- throw e;
+ throw oome;
} catch (Throwable t) {
t.printStackTrace();
System.err.printf("FAILED. Caused by %s%n", t.getMessage());
passed = false;
failCounter++;
}
- testCounter++;
- }
+ testCounter++;
+ }
doneIterations++;
return true;
}
@@ -205,8 +186,8 @@
* @param testMethods list of test methods
*/
public static void runTests(Function<TestMethods, LambdaFormTestCase> ctor, Collection<TestMethods> testMethods) {
- LambdaFormTestCase.TestRun run =
- new LambdaFormTestCase.TestRun(ctor, testMethods);
+ LambdaFormTestCase.TestRun run
+ = new LambdaFormTestCase.TestRun(ctor, testMethods);
TimeLimitedRunner runner = new TimeLimitedRunner(TIMEOUT, 4.0d, run::doIteration);
try {
runner.call();
--- a/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
package test.java.lang.invoke.MethodHandles;
import com.oracle.testlibrary.jsr292.Helper;
+import com.oracle.testlibrary.jsr292.CodeCacheOverflowProcessor;
import jdk.testlibrary.Asserts;
import jdk.testlibrary.TimeLimitedRunner;
import jdk.testlibrary.Utils;
@@ -35,7 +36,6 @@
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;
-import java.util.concurrent.TimeUnit;
/* @test
* @library /lib/testlibrary/jsr292 /lib/testlibrary/
@@ -91,6 +91,10 @@
}
public static void main(String[] args) throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(CatchExceptionTest::test);
+ }
+
+ public static void test() throws Throwable {
System.out.println("classes = " + ARGS_CLASSES);
TestFactory factory = new TestFactory();
@@ -116,7 +120,6 @@
return Helper.getParams(ARGS_CLASSES, isVararg, argsCount);
}
-
private List<Class<?>> getCatcherParams() {
int catchArgc = 1 + this.argsCount - dropped;
List<Class<?>> result = new ArrayList<>(
--- a/jdk/test/java/lang/invoke/MethodHandlesTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/MethodHandlesTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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
@@ -23,6 +23,7 @@
/* @test
* @summary unit tests for java.lang.invoke.MethodHandles
+ * @library /lib/testlibrary /lib/testlibrary/jsr292
* @compile MethodHandlesTest.java remote/RemoteExample.java
* @run junit/othervm/timeout=2500 -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies -esa test.java.lang.invoke.MethodHandlesTest
*/
@@ -36,6 +37,7 @@
import java.util.*;
import org.junit.*;
import static org.junit.Assert.*;
+import com.oracle.testlibrary.jsr292.CodeCacheOverflowProcessor;
/**
@@ -499,6 +501,10 @@
@Test
public void testFindStatic() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindStatic0);
+ }
+
+ public void testFindStatic0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findStatic");
testFindStatic(PubExample.class, void.class, "s0");
@@ -586,6 +592,10 @@
@Test
public void testFindVirtual() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindVirtual0);
+ }
+
+ public void testFindVirtual0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findVirtual");
testFindVirtual(Example.class, void.class, "v0");
@@ -616,6 +626,10 @@
@Test
public void testFindVirtualClone() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindVirtualClone0);
+ }
+
+ public void testFindVirtualClone0() throws Throwable {
// test some ad hoc system methods
testFindVirtual(false, PUBLIC, Object.class, Object.class, "clone");
testFindVirtual(true, PUBLIC, Object[].class, Object.class, "clone");
@@ -699,6 +713,10 @@
@Test
public void testFindSpecial() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindSpecial0);
+ }
+
+ public void testFindSpecial0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findSpecial");
testFindSpecial(SubExample.class, Example.class, void.class, "v0");
@@ -775,6 +793,10 @@
@Test
public void testFindConstructor() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindConstructor0);
+ }
+
+ public void testFindConstructor0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findConstructor");
testFindConstructor(true, EXAMPLE, Example.class);
@@ -818,6 +840,10 @@
@Test
public void testBind() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testBind0);
+ }
+
+ public void testBind0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("bind");
testBind(Example.class, void.class, "v0");
@@ -879,6 +905,10 @@
@Test
public void testUnreflect() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testUnreflect0);
+ }
+
+ public void testUnreflect0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("unreflect");
testUnreflect(Example.class, true, void.class, "s0");
@@ -985,6 +1015,10 @@
@Test
public void testUnreflectSpecial() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testUnreflectSpecial0);
+ }
+
+ public void testUnreflectSpecial0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("unreflectSpecial");
testUnreflectSpecial(Example.class, Example.class, void.class, "v0");
@@ -1077,23 +1111,38 @@
@Test
public void testUnreflectGetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testUnreflectGetter0);
+ }
+
+ public void testUnreflectGetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("unreflectGetter");
testGetter(TEST_UNREFLECT);
}
+
@Test
public void testFindGetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindGetter0);
+ }
+
+ public void testFindGetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findGetter");
testGetter(TEST_FIND_FIELD);
testGetter(TEST_FIND_FIELD | TEST_BOUND);
}
+
@Test
public void testFindStaticGetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindStaticGetter0);
+ }
+
+ public void testFindStaticGetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findStaticGetter");
testGetter(TEST_FIND_STATIC);
}
+
public void testGetter(int testMode) throws Throwable {
Lookup lookup = PRIVATE; // FIXME: test more lookups than this one
for (Object[] c : HasFields.CASES) {
@@ -1287,26 +1336,40 @@
}
}
-
@Test
public void testUnreflectSetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testUnreflectSetter0);
+ }
+
+ public void testUnreflectSetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("unreflectSetter");
testSetter(TEST_UNREFLECT);
}
+
@Test
public void testFindSetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindSetter0);
+ }
+
+ public void testFindSetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findSetter");
testSetter(TEST_FIND_FIELD);
testSetter(TEST_FIND_FIELD | TEST_BOUND);
}
+
@Test
public void testFindStaticSetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFindStaticSetter0);
+ }
+
+ public void testFindStaticSetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("findStaticSetter");
testSetter(TEST_FIND_STATIC);
}
+
public void testSetter(int testMode) throws Throwable {
Lookup lookup = PRIVATE; // FIXME: test more lookups than this one
startTest("unreflectSetter");
@@ -1329,6 +1392,10 @@
@Test
public void testArrayElementGetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testArrayElementGetter0);
+ }
+
+ public void testArrayElementGetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("arrayElementGetter");
testArrayElementGetterSetter(false);
@@ -1336,6 +1403,10 @@
@Test
public void testArrayElementSetter() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testArrayElementSetter0);
+ }
+
+ public void testArrayElementSetter0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("arrayElementSetter");
testArrayElementGetterSetter(true);
@@ -1349,6 +1420,10 @@
@Test
public void testArrayElementErrors() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testArrayElementErrors0);
+ }
+
+ public void testArrayElementErrors0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("arrayElementErrors");
testArrayElementGetterSetter(false, TEST_ARRAY_NPE);
@@ -1528,6 +1603,10 @@
@Test
public void testConvertArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testConvertArguments0);
+ }
+
+ public void testConvertArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("convertArguments");
testConvert(Callee.ofType(1), null, "id", int.class);
@@ -1591,6 +1670,10 @@
@Test
public void testVarargsCollector() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testVarargsCollector0);
+ }
+
+ public void testVarargsCollector0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("varargsCollector");
MethodHandle vac0 = PRIVATE.findStatic(MethodHandlesTest.class, "called",
@@ -1605,8 +1688,12 @@
}
}
- @Test // SLOW
+ @Test // SLOW
public void testPermuteArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testPermuteArguments0);
+ }
+
+ public void testPermuteArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("permuteArguments");
testPermuteArguments(4, Integer.class, 2, long.class, 6);
@@ -1744,8 +1831,12 @@
}
- @Test // SLOW
+ @Test // SLOW
public void testSpreadArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testSpreadArguments0);
+ }
+
+ public void testSpreadArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("spreadArguments");
for (Class<?> argType : new Class<?>[]{Object.class, Integer.class, int.class}) {
@@ -1838,8 +1929,12 @@
}
}
- @Test // SLOW
+ @Test // SLOW
public void testAsCollector() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testAsCollector0);
+ }
+
+ public void testAsCollector0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("asCollector");
for (Class<?> argType : new Class<?>[]{Object.class, Integer.class, int.class}) {
@@ -1880,8 +1975,12 @@
assertArrayEquals(collectedArgs, returnValue);
}
- @Test // SLOW
+ @Test // SLOW
public void testInsertArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testInsertArguments0);
+ }
+
+ public void testInsertArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("insertArguments");
for (int nargs = 0; nargs < 50; nargs++) {
@@ -1923,6 +2022,10 @@
@Test
public void testFilterReturnValue() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFilterReturnValue0);
+ }
+
+ public void testFilterReturnValue0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("filterReturnValue");
Class<?> classOfVCList = varargsList(1).invokeWithArguments(0).getClass();
@@ -1972,6 +2075,10 @@
@Test
public void testFilterArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFilterArguments0);
+ }
+
+ public void testFilterArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("filterArguments");
for (int nargs = 1; nargs <= 6; nargs++) {
@@ -2004,6 +2111,10 @@
@Test
public void testCollectArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testCollectArguments0);
+ }
+
+ public void testCollectArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("collectArguments");
testFoldOrCollectArguments(true);
@@ -2011,6 +2122,10 @@
@Test
public void testFoldArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testFoldArguments0);
+ }
+
+ public void testFoldArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("foldArguments");
testFoldOrCollectArguments(false);
@@ -2112,6 +2227,10 @@
@Test
public void testDropArguments() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testDropArguments0);
+ }
+
+ public void testDropArguments0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("dropArguments");
for (int nargs = 0; nargs <= 4; nargs++) {
@@ -2143,6 +2262,10 @@
@Test // SLOW
public void testInvokers() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testInvokers0);
+ }
+
+ public void testInvokers0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("exactInvoker, genericInvoker, varargsInvoker, dynamicInvoker");
// exactInvoker, genericInvoker, varargsInvoker[0..N], dynamicInvoker
@@ -2344,6 +2467,10 @@
@Test
public void testGuardWithTest() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testGuardWithTest0);
+ }
+
+ public void testGuardWithTest0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("guardWithTest");
for (int nargs = 0; nargs <= 50; nargs++) {
@@ -2415,6 +2542,10 @@
@Test
public void testThrowException() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testThrowException0);
+ }
+
+ public void testThrowException0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("throwException");
testThrowException(int.class, new ClassCastException("testing"));
@@ -2446,6 +2577,10 @@
@Test
public void testInterfaceCast() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testInterfaceCast0);
+ }
+
+ public void testInterfaceCast0() throws Throwable {
//if (CAN_SKIP_WORKING) return;
startTest("interfaceCast");
assert( (((Object)"foo") instanceof CharSequence));
@@ -2543,6 +2678,10 @@
@Test // SLOW
public void testCastFailure() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testCastFailure0);
+ }
+
+ public void testCastFailure0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("testCastFailure");
testCastFailure("cast/argument", 11000);
@@ -2655,6 +2794,10 @@
@Test
public void testUserClassInSignature() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testUserClassInSignature0);
+ }
+
+ public void testUserClassInSignature0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("testUserClassInSignature");
Lookup lookup = MethodHandles.lookup();
@@ -2706,6 +2849,10 @@
@Test
public void testAsInterfaceInstance() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testAsInterfaceInstance0);
+ }
+
+ public void testAsInterfaceInstance0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("asInterfaceInstance");
Lookup lookup = MethodHandles.lookup();
@@ -2869,6 +3016,10 @@
@Test
public void testRunnableProxy() throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(this::testRunnableProxy0);
+ }
+
+ public void testRunnableProxy0() throws Throwable {
if (CAN_SKIP_WORKING) return;
startTest("testRunnableProxy");
MethodHandles.Lookup lookup = MethodHandles.lookup();
--- a/jdk/test/java/lang/invoke/TestCatchExceptionWithVarargs.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/TestCatchExceptionWithVarargs.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -24,9 +24,12 @@
/*
* @test
* @bug 8019184
+ * @library /lib/testlibrary /lib/testlibrary/jsr292
* @summary MethodHandles.catchException() fails when methods have 8 args + varargs
+ * @run main TestCatchExceptionWithVarargs
*/
+import com.oracle.testlibrary.jsr292.CodeCacheOverflowProcessor;
import java.util.*;
import java.lang.invoke.*;
@@ -68,6 +71,11 @@
}
public static void main(String[] args) throws Throwable {
+ CodeCacheOverflowProcessor
+ .runMHTest(TestCatchExceptionWithVarargs::test);
+ }
+
+ public static void test() throws Throwable {
List<Class<?>> ptypes = new LinkedList<>();
ptypes.add(Object[].class);
--- a/jdk/test/java/lang/invoke/VarargsArrayTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/lang/invoke/VarargsArrayTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,14 +24,14 @@
package java.lang.invoke;
import sun.invoke.util.Wrapper;
-
import java.util.Arrays;
import java.util.Collections;
+import com.oracle.testlibrary.jsr292.CodeCacheOverflowProcessor;
/* @test
* @summary unit tests for varargs array methods: MethodHandleInfo.varargsArray(int),
* MethodHandleInfo.varargsArray(Class,int) & MethodHandleInfo.varargsList(int)
- *
+ * @library /lib/testlibrary /lib/testlibrary/jsr292
* @run main/bootclasspath java.lang.invoke.VarargsArrayTest
* @run main/bootclasspath -DVarargsArrayTest.MAX_ARITY=255 -DVarargsArrayTest.START_ARITY=250
* java.lang.invoke.VarargsArrayTest
@@ -47,6 +47,10 @@
private static final boolean EXHAUSTIVE = Boolean.getBoolean(CLASS.getSimpleName()+".EXHAUSTIVE");
public static void main(String[] args) throws Throwable {
+ CodeCacheOverflowProcessor.runMHTest(VarargsArrayTest::test);
+ }
+
+ public static void test() throws Throwable {
testVarargsArray();
testVarargsReferenceArray();
testVarargsPrimitiveArray();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SocketPermission/SocketPermissionCollection.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for PermissionCollection subclasses
+ */
+
+import java.net.SocketPermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+
+public class SocketPermissionCollection {
+
+ public static void main(String[] args) throws Exception {
+
+ int testFail = 0;
+
+ SocketPermission perm = new SocketPermission("www.example.com",
+ "connect");
+ PermissionCollection perms = perm.newPermissionCollection();
+
+ // test 1
+ System.out.println
+ ("test 1: add throws IllegalArgExc for wrong perm type");
+ try {
+ perms.add(new SecurityPermission("createAccessControlContext"));
+ System.err.println("Expected IllegalArgumentException");
+ testFail++;
+ } catch (IllegalArgumentException iae) {}
+
+ // test 2
+ System.out.println("test 2: implies returns false for wrong perm type");
+ if (perms.implies(new SecurityPermission("getPolicy"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 3
+ System.out.println
+ ("test 3: implies returns true for match on name and action");
+ perms.add(new SocketPermission("www.example.com", "connect"));
+ if (!perms.implies(new SocketPermission("www.example.com", "connect"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 4
+ System.out.println
+ ("test 4: implies returns false for match on name but not action");
+ if (perms.implies(new SocketPermission("www.example.com", "accept"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 5
+ System.out.println("test 5: implies returns true for match on " +
+ "name and subset of actions");
+ perms.add(new SocketPermission("www.example.org", "accept, connect"));
+ if (!perms.implies(new SocketPermission("www.example.org", "connect"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 6
+ System.out.println("test 6: implies returns true for aggregate " +
+ "match on name and action");
+ perms.add(new SocketPermission("www.example.us", "accept"));
+ perms.add(new SocketPermission("www.example.us", "connect"));
+ if (!perms.implies(new SocketPermission("www.example.us", "accept"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+ if (!perms.implies(new SocketPermission("www.example.us",
+ "connect,accept"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 7
+ System.out.println("test 7: implies returns true for wildcard " +
+ "and match on action");
+ perms.add(new SocketPermission("*.example.edu", "resolve"));
+ if (!perms.implies(new SocketPermission("foo.example.edu", "resolve"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 8
+ System.out.println("test 8: implies returns false for non-match " +
+ "on wildcard");
+ if (perms.implies(new SocketPermission("foo.example.edu", "connect"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 9
+ System.out.println("test 9: implies returns true for matching " +
+ "port range and action");
+ perms.add(new SocketPermission("204.160.241.0:1024-65535", "connect"));
+ if (!perms.implies(new SocketPermission("204.160.241.0:1025", "connect"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 13
+ System.out.println("test 13: elements returns correct number of perms");
+ int numPerms = 0;
+ Enumeration<Permission> e = perms.elements();
+ while (e.hasMoreElements()) {
+ numPerms++;
+ System.out.println(e.nextElement());
+ }
+ // the two "/tmp/baz" entries were combined into one
+ if (numPerms != 5) {
+ System.err.println("Expected 5, got " + numPerms);
+ testFail++;
+ }
+
+ if (testFail > 0) {
+ throw new Exception(testFail + " test(s) failed");
+ }
+ }
+}
--- a/jdk/test/java/nio/channels/DatagramChannel/EmptyBuffer.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/nio/channels/DatagramChannel/EmptyBuffer.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 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
@@ -27,39 +27,50 @@
* @author Mike McCloskey
*/
-import java.io.*;
-import java.net.*;
-import java.nio.*;
-import java.nio.channels.*;
-import java.nio.charset.*;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.channels.ClosedByInterruptException;
+import java.nio.channels.DatagramChannel;
public class EmptyBuffer {
- static PrintStream log = System.err;
+ private static final PrintStream log = System.err;
public static void main(String[] args) throws Exception {
test();
}
- static void test() throws Exception {
- Server server = new Server();
+ private static void test() throws Exception {
+ DatagramChannel dc = DatagramChannel.open();
+ InetAddress localHost = InetAddress.getLocalHost();
+ dc.bind(new InetSocketAddress(localHost, 0));
+
+ Server server = new Server(dc.getLocalAddress());
Thread serverThread = new Thread(server);
serverThread.start();
- DatagramChannel dc = DatagramChannel.open();
+
try {
+ InetSocketAddress isa = new InetSocketAddress(localHost, server.port());
+ dc.connect(isa);
+
ByteBuffer bb = ByteBuffer.allocateDirect(12);
bb.order(ByteOrder.BIG_ENDIAN);
bb.putInt(1).putLong(1);
bb.flip();
- InetAddress address = InetAddress.getLocalHost();
- InetSocketAddress isa = new InetSocketAddress(address, server.port());
- dc.connect(isa);
+
dc.write(bb);
bb.rewind();
dc.write(bb);
bb.rewind();
dc.write(bb);
+
Thread.sleep(2000);
+
serverThread.interrupt();
server.throwException();
} finally {
@@ -67,12 +78,14 @@
}
}
- public static class Server implements Runnable {
- final DatagramChannel dc;
- Exception e = null;
+ private static class Server implements Runnable {
+ private final DatagramChannel dc;
+ private final SocketAddress clientAddress;
+ private Exception e = null;
- Server() throws IOException {
+ Server(SocketAddress clientAddress) throws IOException {
this.dc = DatagramChannel.open().bind(new InetSocketAddress(0));
+ this.clientAddress = clientAddress;
}
int port() {
@@ -94,30 +107,37 @@
log.println();
}
+ @Override
public void run() {
- SocketAddress sa = null;
- int numberReceived = 0;
try {
ByteBuffer bb = ByteBuffer.allocateDirect(12);
bb.clear();
// Only one clear. The buffer will be full after
// the first receive, but it should still block
// and receive and discard the next two
+ int numberReceived = 0;
while (!Thread.interrupted()) {
+ SocketAddress sa;
try {
sa = dc.receive(bb);
} catch (ClosedByInterruptException cbie) {
// Expected
log.println("Took expected exit");
+ // Verify that enough packets were received
+ if (numberReceived != 3)
+ throw new RuntimeException("Failed: Too few datagrams");
break;
}
if (sa != null) {
log.println("Client: " + sa);
- showBuffer("RECV", bb);
+ // Check client address so as not to count stray packets
+ if (sa.equals(clientAddress)) {
+ showBuffer("RECV", bb);
+ numberReceived++;
+ }
+ if (numberReceived > 3)
+ throw new RuntimeException("Failed: Too many datagrams");
sa = null;
- numberReceived++;
- if (numberReceived > 3)
- throw new RuntimeException("Test failed");
}
}
} catch (Exception ex) {
@@ -127,5 +147,4 @@
}
}
}
-
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/BasicPermission/BasicPermissionCollection.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for BasicPermissionCollection subclass
+ */
+
+import java.security.BasicPermission;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+
+public class BasicPermissionCollection {
+
+ public static void main(String[] args) throws Exception {
+
+ int testFail = 0;
+
+ TestPermission perm = new TestPermission("foo");
+ PermissionCollection perms = perm.newPermissionCollection();
+
+ // test 1
+ System.out.println("test 1: add throws IllegalArgumentExc");
+ try {
+ perms.add(new SecurityPermission("createAccessControlContext"));
+ System.err.println("Expected IllegalArgumentException");
+ testFail++;
+ } catch (IllegalArgumentException iae) {}
+
+ // test 2
+ System.out.println("test 2: implies returns false for wrong class");
+ if (perms.implies(new SecurityPermission("getPolicy"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 3
+ System.out.println("test 3: implies returns true for match on name");
+ perms.add(new TestPermission("foo"));
+ if (!perms.implies(new TestPermission("foo"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 4
+ System.out.println("test 4: implies returns true for wildcard match");
+ perms.add(new TestPermission("bar.*"));
+ if (!perms.implies(new TestPermission("bar.foo"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 5
+ System.out.println
+ ("test 5: implies returns false for invalid wildcard");
+ perms.add(new TestPermission("baz*"));
+ if (perms.implies(new TestPermission("baz.foo"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 6
+ System.out.println
+ ("test 6: implies returns true for deep wildcard match");
+ if (!perms.implies(new TestPermission("bar.foo.baz"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 7
+ System.out.println
+ ("test 7: implies returns true for all wildcard match");
+ perms.add(new TestPermission("*"));
+ if (!perms.implies(new TestPermission("yes"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 8
+ System.out.println("test 8: elements returns correct number of perms");
+ int numPerms = 0;
+ Enumeration<Permission> e = perms.elements();
+ while (e.hasMoreElements()) {
+ numPerms++;
+ System.out.println(e.nextElement());
+ }
+ if (numPerms != 4) {
+ System.err.println("Expected 4, got " + numPerms);
+ testFail++;
+ }
+
+ if (testFail > 0) {
+ throw new Exception(testFail + " test(s) failed");
+ }
+ }
+
+ private static class TestPermission extends BasicPermission {
+ TestPermission(String name) {
+ super(name);
+ }
+ }
+}
--- a/jdk/test/java/security/PermissionCollection/Concurrent.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/security/PermissionCollection/Concurrent.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 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
@@ -104,13 +104,11 @@
System.out.println(perm[perm.length-1] + " implies " + result);
}
- synchronized (pc) {
- Enumeration en = pc.elements();
- while (en.hasMoreElements()) {
- Object obj = en.nextElement();
- if (debug) {
- System.out.println(obj);
- }
+ Enumeration en = pc.elements();
+ while (en.hasMoreElements()) {
+ Object obj = en.nextElement();
+ if (debug) {
+ System.out.println(obj);
}
}
}
@@ -151,13 +149,11 @@
}
}
- synchronized (pc) {
- Enumeration en = pc.elements();
- while (en.hasMoreElements()) {
- Object obj = en.nextElement();
- if (debug) {
- System.out.println(obj);
- }
+ Enumeration en = pc.elements();
+ while (en.hasMoreElements()) {
+ Object obj = en.nextElement();
+ if (debug) {
+ System.out.println(obj);
}
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/SecureClassLoader/DefineClass.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.net.URL;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.security.SecureClassLoader;
+import java.security.cert.Certificate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.List;
+import java.util.PropertyPermission;
+
+/*
+ * @test
+ * @bug 6826789
+ * @summary Make sure equivalent ProtectionDomains are granted the same
+ * permissions when the CodeSource URLs are different but resolve
+ * to the same ip address after name service resolution.
+ * @run main/othervm/java.security.policy=DefineClass.policy DefineClass
+ */
+
+public class DefineClass {
+
+ // permissions that are expected to be granted by the policy file
+ private final static Permission[] GRANTED_PERMS = new Permission[] {
+ new PropertyPermission("user.home", "read"),
+ new PropertyPermission("user.name", "read")
+ };
+
+ // Base64 encoded bytes of a simple class: "public class Foo {}"
+ private final static String FOO_CLASS =
+ "yv66vgAAADQADQoAAwAKBwALBwAMAQAGPGluaXQ+AQADKClWAQAEQ29kZQEA" +
+ "D0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUBAAhGb28uamF2YQwABAAF" +
+ "AQADRm9vAQAQamF2YS9sYW5nL09iamVjdAAhAAIAAwAAAAAAAQABAAQABQAB" +
+ "AAYAAAAdAAEAAQAAAAUqtwABsQAAAAEABwAAAAYAAQAAAAEAAQAIAAAAAgAJ";
+
+ // Base64 encoded bytes of a simple class: "public class Bar {}"
+ private final static String BAR_CLASS =
+ "yv66vgAAADQADQoAAwAKBwALBwAMAQAGPGluaXQ+AQADKClWAQAEQ29kZQEA" +
+ "D0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUBAAhCYXIuamF2YQwABAAF" +
+ "AQADQmFyAQAQamF2YS9sYW5nL09iamVjdAAhAAIAAwAAAAAAAQABAAQABQAB" +
+ "AAYAAAAdAAEAAQAAAAUqtwABsQAAAAEABwAAAAYAAQAAAAEAAQAIAAAAAgAJ";
+
+ public static void main(String[] args) throws Exception {
+
+ MySecureClassLoader scl = new MySecureClassLoader();
+ Policy p = Policy.getPolicy();
+ ArrayList<Permission> perms1 = getPermissions(scl, p,
+ "http://localhost/",
+ "Foo", FOO_CLASS);
+ checkPerms(perms1, GRANTED_PERMS);
+ ArrayList<Permission> perms2 = getPermissions(scl, p,
+ "http://127.0.0.1/",
+ "Bar", BAR_CLASS);
+ checkPerms(perms2, GRANTED_PERMS);
+ assert(perms1.equals(perms2));
+ }
+
+ // returns the permissions granted to the codebase URL
+ private static ArrayList<Permission> getPermissions(MySecureClassLoader scl,
+ Policy p, String url,
+ String className,
+ String classBytes)
+ throws IOException {
+ CodeSource cs = new CodeSource(new URL(url), (Certificate[])null);
+ Base64.Decoder bd = Base64.getDecoder();
+ byte[] bytes = bd.decode(classBytes);
+ Class<?> c = scl.defineMyClass(className, bytes, cs);
+ ProtectionDomain pd = c.getProtectionDomain();
+ return Collections.list(p.getPermissions(pd).elements());
+ }
+
+ private static void checkPerms(List<Permission> perms,
+ Permission... grantedPerms)
+ throws Exception
+ {
+ if (!perms.containsAll(Arrays.asList(grantedPerms))) {
+ throw new Exception("Granted permissions not correct");
+ }
+ }
+
+ // A SecureClassLoader that allows the test to define its own classes
+ private static class MySecureClassLoader extends SecureClassLoader {
+ Class<?> defineMyClass(String name, byte[] b, CodeSource cs) {
+ return super.defineClass(name, b, 0, b.length, cs);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/SecureClassLoader/DefineClass.policy Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,11 @@
+grant {
+ permission java.lang.RuntimePermission "createClassLoader";
+ permission java.lang.RuntimePermission "getProtectionDomain";
+ permission java.security.SecurityPermission "getPolicy";
+};
+grant codebase "http://localhost/" {
+ permission java.util.PropertyPermission "user.home", "read";
+};
+grant codebase "http://127.0.0.1/" {
+ permission java.util.PropertyPermission "user.name", "read";
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DateFormat/LocaleDateFormats.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8080774
+ * @run testng/othervm -Djava.locale.providers=JRE,CLDR LocaleDateFormats
+ * @summary This file contains tests for JRE locales date formats
+ */
+
+import java.text.DateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class LocaleDateFormats {
+
+ @Test(dataProvider = "dateFormats")
+ public void testDateFormat(Locale loc, int style, int year, int month, int date, String expectedString) {
+ Calendar cal = Calendar.getInstance(loc);
+ cal.set(year, month-1, date);
+ // Create date formatter based on requested style and test locale
+ DateFormat df = DateFormat.getDateInstance(style, loc);
+ // Test the date format
+ assertEquals(df.format(cal.getTime()), expectedString);
+ }
+
+ @DataProvider(name = "dateFormats" )
+ private Object[][] dateFormats() {
+ return new Object[][] {
+ //8080774
+ //Locale, Format type, year, month, date, expected result
+ {localeEnSG, DateFormat.SHORT, 2015, 5, 6, "6/5/15"},
+ {localeEnSG, DateFormat.MEDIUM, 2015, 5, 6, "6 May, 2015"},
+ {localeEnSG, DateFormat.LONG, 2015, 5, 6, "6 May, 2015"},
+ {localeEnSG, DateFormat.FULL, 2015, 5, 6, "Wednesday, 6 May, 2015"}
+ };
+ }
+ // en_SG Locale instance
+ private static final Locale localeEnSG = new Locale("en", "SG");
+}
--- a/jdk/test/java/util/Arrays/ParallelPrefix.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/java/util/Arrays/ParallelPrefix.java Thu Jun 25 07:13:27 2015 +0000
@@ -26,6 +26,7 @@
* @summary unit test for Arrays.ParallelPrefix().
* @author Tristan Yan
* @run testng ParallelPrefix
+ * @key intermittent
*/
import java.util.Arrays;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Arrays/SortingIntBenchmarkTestJMH.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,708 @@
+/*
+ * Copyright 2015 Goldman Sachs.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@State(Scope.Thread)
+@BenchmarkMode(Mode.Throughput)
+@OutputTimeUnit(TimeUnit.SECONDS)
+public class SortingIntBenchmarkTestJMH {
+ private static final int QUICKSORT_THRESHOLD = 286;
+ private static final int MAX_RUN_COUNT = 67;
+ private static final int INSERTION_SORT_THRESHOLD = 47;
+ public static final int MAX_VALUE = 1_000_000;
+
+ @Param({"pairFlipZeroPairFlip", "pairFlipOneHundredPairFlip"
+ , "zeroHi", "hiZeroLow", "hiFlatLow", "identical",
+ "randomDups", "randomNoDups", "sortedReversedSorted", "pairFlip", "endLessThan"})
+
+ public String listType;
+
+ private int[] array;
+ private static final int LIST_SIZE = 10_000_000;
+ public static final int NUMBER_OF_ITERATIONS = 10;
+
+ @Setup
+ public void setUp() {
+ Random random = new Random(123456789012345L);
+ this.array = new int[LIST_SIZE];
+ int threeQuarters = (int) (LIST_SIZE * 0.75);
+ if ("zeroHi".equals(this.listType)) {
+ for (int i = 0; i < threeQuarters; i++) {
+ this.array[i] = 0;
+ }
+ int k = 1;
+ for (int i = threeQuarters; i < LIST_SIZE; i++) {
+ this.array[i] = k;
+ k++;
+ }
+ }
+ else if ("hiFlatLow".equals(this.listType)) {
+ int oneThird = LIST_SIZE / 3;
+ for (int i = 0; i < oneThird; i++) {
+ this.array[i] = i;
+ }
+ int twoThirds = oneThird * 2;
+ int constant = oneThird - 1;
+ for (int i = oneThird; i < twoThirds; i++) {
+ this.array[i] = constant;
+ }
+ for (int i = twoThirds; i < LIST_SIZE; i++) {
+ this.array[i] = constant - i + twoThirds;
+ }
+ }
+ else if ("hiZeroLow".equals(this.listType)) {
+ int oneThird = LIST_SIZE / 3;
+ for (int i = 0; i < oneThird; i++) {
+ this.array[i] = i;
+ }
+ int twoThirds = oneThird * 2;
+ for (int i = oneThird; i < twoThirds; i++) {
+ this.array[i] = 0;
+ }
+ for (int i = twoThirds; i < LIST_SIZE; i++) {
+ this.array[i] = oneThird - i + twoThirds;
+ }
+ }
+ else if ("identical".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = 0;
+ }
+ }
+ else if ("randomDups".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = random.nextInt(1000);
+ }
+ }
+ else if ("randomNoDups".equals(this.listType)) {
+ Set<Integer> set = new HashSet();
+ while (set.size() < LIST_SIZE + 1) {
+ set.add(random.nextInt());
+ }
+ List<Integer> list = new ArrayList<>(LIST_SIZE);
+ list.addAll(set);
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = list.get(i);
+ }
+ }
+ else if ("sortedReversedSorted".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE / 2; i++) {
+ this.array[i] = i;
+ }
+ int num = 0;
+ for (int i = LIST_SIZE / 2; i < LIST_SIZE; i++) {
+ this.array[i] = LIST_SIZE - num;
+ num++;
+ }
+ }
+ else if ("pairFlip".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = i;
+ }
+ for (int i = 0; i < LIST_SIZE; i += 2) {
+ int temp = this.array[i];
+ this.array[i] = this.array[i + 1];
+ this.array[i + 1] = temp;
+ }
+ }
+ else if ("endLessThan".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE - 1; i++) {
+ this.array[i] = 3;
+ }
+ this.array[LIST_SIZE - 1] = 1;
+ }
+ else if ("pairFlipZeroPairFlip".equals(this.listType)) {
+ //pairflip
+ for (int i = 0; i < 64; i++) {
+ this.array[i] = i;
+ }
+ for (int i = 0; i < 64; i += 2) {
+ int temp = this.array[i];
+ this.array[i] = this.array[i + 1];
+ this.array[i + 1] = temp;
+ }
+ //zero
+ for (int i = 64; i < this.array.length - 64; i++) {
+ this.array[i] = 0;
+ }
+ //pairflip
+ for (int i = this.array.length - 64; i < this.array.length; i++) {
+ this.array[i] = i;
+ }
+ for (int i = this.array.length - 64; i < this.array.length; i += 2) {
+ int temp = this.array[i];
+ this.array[i] = this.array[i + 1];
+ this.array[i + 1] = temp;
+ }
+ }
+ else if ("pairFlipOneHundredPairFlip".equals(this.listType)) {
+ //10, 5
+ for (int i = 0; i < 64; i++) {
+ if (i % 2 == 0) {
+ this.array[i] = 10;
+ }
+ else {
+ this.array[i] = 5;
+ }
+ }
+
+ //100
+ for (int i = 64; i < this.array.length - 64; i++) {
+ this.array[i] = 100;
+ }
+
+ //10, 5
+ for (int i = this.array.length - 64; i < this.array.length; i++) {
+ if (i % 2 == 0) {
+ this.array[i] = 10;
+ }
+ else {
+ this.array[i] = 5;
+ }
+ }
+ }
+ }
+
+ @Warmup(iterations = 20)
+ @Measurement(iterations = 10)
+ @Benchmark
+ public void sortNewWay() {
+ for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+ SortingIntTestJMH.sort(this.array, 0, this.array.length - 1, null, 0, 0);
+ }
+ }
+
+ @Warmup(iterations = 20)
+ @Measurement(iterations = 10)
+ @Benchmark
+ public void sortCurrentWay() {
+ for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+ Arrays.sort(this.array);
+ }
+ }
+
+ static void sort(int[] a, int left, int right,
+ int[] work, int workBase, int workLen) {
+ // Use Quicksort on small arrays
+ if (right - left < QUICKSORT_THRESHOLD) {
+ SortingIntTestJMH.sort(a, left, right, true);
+ return;
+ }
+
+ /*
+ * Index run[i] is the start of i-th run
+ * (ascending or descending sequence).
+ */
+ int[] run = new int[MAX_RUN_COUNT + 1];
+ int count = 0;
+ run[0] = left;
+
+ // Check if the array is nearly sorted
+ for (int k = left; k < right; run[count] = k) {
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break;
+ if (a[k] < a[k + 1]) { // ascending
+ while (++k <= right && a[k - 1] <= a[k]) ;
+ }
+ else if (a[k] > a[k + 1]) { // descending
+ while (++k <= right && a[k - 1] >= a[k]) ;
+ for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
+ int t = a[lo];
+ a[lo] = a[hi];
+ a[hi] = t;
+ }
+ }
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
+ }
+ /*
+ * The array is not highly structured,
+ * use Quicksort instead of merge sort.
+ */
+ if (++count == MAX_RUN_COUNT) {
+ sort(a, left, right, true);
+ return;
+ }
+ }
+
+ // Check special cases
+ // Implementation note: variable "right" is increased by 1.
+ if (run[count] == right++) {
+ run[++count] = right;
+ }
+ if (count <= 1) { // The array is already sorted
+ return;
+ }
+
+ // Determine alternation base for merge
+ byte odd = 0;
+ for (int n = 1; (n <<= 1) < count; odd ^= 1) {
+ }
+
+ // Use or create temporary array b for merging
+ int[] b; // temp array; alternates with a
+ int ao, bo; // array offsets from 'left'
+ int blen = right - left; // space needed for b
+ if (work == null || workLen < blen || workBase + blen > work.length) {
+ work = new int[blen];
+ workBase = 0;
+ }
+ if (odd == 0) {
+ System.arraycopy(a, left, work, workBase, blen);
+ b = a;
+ bo = 0;
+ a = work;
+ ao = workBase - left;
+ }
+ else {
+ b = work;
+ ao = 0;
+ bo = workBase - left;
+ }
+
+ // Merging
+ for (int last; count > 1; count = last) {
+ for (int k = (last = 0) + 2; k <= count; k += 2) {
+ int hi = run[k], mi = run[k - 1];
+ for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
+ if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {
+ b[i + bo] = a[p++ + ao];
+ }
+ else {
+ b[i + bo] = a[q++ + ao];
+ }
+ }
+ run[++last] = hi;
+ }
+ if ((count & 1) != 0) {
+ for (int i = right, lo = run[count - 1]; --i >= lo;
+ b[i + bo] = a[i + ao]
+ ) {
+ }
+ run[++last] = right;
+ }
+ int[] t = a;
+ a = b;
+ b = t;
+ int o = ao;
+ ao = bo;
+ bo = o;
+ }
+ }
+
+ private static void sort(int[] a, int left, int right, boolean leftmost) {
+ int length = right - left + 1;
+
+ // Use insertion sort on tiny arrays
+ if (length < INSERTION_SORT_THRESHOLD) {
+ if (leftmost) {
+ /*
+ * Traditional (without sentinel) insertion sort,
+ * optimized for server VM, is used in case of
+ * the leftmost part.
+ */
+ for (int i = left, j = i; i < right; j = ++i) {
+ int ai = a[i + 1];
+ while (ai < a[j]) {
+ a[j + 1] = a[j];
+ if (j-- == left) {
+ break;
+ }
+ }
+ a[j + 1] = ai;
+ }
+ }
+ else {
+ /*
+ * Skip the longest ascending sequence.
+ */
+ do {
+ if (left >= right) {
+ return;
+ }
+ }
+ while (a[++left] >= a[left - 1]);
+
+ /*
+ * Every element from adjoining part plays the role
+ * of sentinel, therefore this allows us to avoid the
+ * left range check on each iteration. Moreover, we use
+ * the more optimized algorithm, so called pair insertion
+ * sort, which is faster (in the context of Quicksort)
+ * than traditional implementation of insertion sort.
+ */
+ for (int k = left; ++left <= right; k = ++left) {
+ int a1 = a[k], a2 = a[left];
+
+ if (a1 < a2) {
+ a2 = a1;
+ a1 = a[left];
+ }
+ while (a1 < a[--k]) {
+ a[k + 2] = a[k];
+ }
+ a[++k + 1] = a1;
+
+ while (a2 < a[--k]) {
+ a[k + 1] = a[k];
+ }
+ a[k + 1] = a2;
+ }
+ int last = a[right];
+
+ while (last < a[--right]) {
+ a[right + 1] = a[right];
+ }
+ a[right + 1] = last;
+ }
+ return;
+ }
+
+ // Inexpensive approximation of length / 7
+ int seventh = (length >> 3) + (length >> 6) + 1;
+
+ /*
+ * Sort five evenly spaced elements around (and including) the
+ * center element in the range. These elements will be used for
+ * pivot selection as described below. The choice for spacing
+ * these elements was empirically determined to work well on
+ * a wide variety of inputs.
+ */
+ int e3 = (left + right) >>> 1; // The midpoint
+ int e2 = e3 - seventh;
+ int e1 = e2 - seventh;
+ int e4 = e3 + seventh;
+ int e5 = e4 + seventh;
+
+ // Sort these elements using insertion sort
+ if (a[e2] < a[e1]) {
+ int t = a[e2];
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+
+ if (a[e3] < a[e2]) {
+ int t = a[e3];
+ a[e3] = a[e2];
+ a[e2] = t;
+ if (t < a[e1]) {
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+ }
+ if (a[e4] < a[e3]) {
+ int t = a[e4];
+ a[e4] = a[e3];
+ a[e3] = t;
+ if (t < a[e2]) {
+ a[e3] = a[e2];
+ a[e2] = t;
+ if (t < a[e1]) {
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+ }
+ }
+ if (a[e5] < a[e4]) {
+ int t = a[e5];
+ a[e5] = a[e4];
+ a[e4] = t;
+ if (t < a[e3]) {
+ a[e4] = a[e3];
+ a[e3] = t;
+ if (t < a[e2]) {
+ a[e3] = a[e2];
+ a[e2] = t;
+ if (t < a[e1]) {
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+ }
+ }
+ }
+
+ // Pointers
+ int less = left; // The index of the first element of center part
+ int great = right; // The index before the first element of right part
+
+ if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
+ /*
+ * Use the second and fourth of the five sorted elements as pivots.
+ * These values are inexpensive approximations of the first and
+ * second terciles of the array. Note that pivot1 <= pivot2.
+ */
+ int pivot1 = a[e2];
+ int pivot2 = a[e4];
+
+ /*
+ * The first and the last elements to be sorted are moved to the
+ * locations formerly occupied by the pivots. When partitioning
+ * is complete, the pivots are swapped back into their final
+ * positions, and excluded from subsequent sorting.
+ */
+ a[e2] = a[left];
+ a[e4] = a[right];
+
+ /*
+ * Skip elements, which are less or greater than pivot values.
+ */
+ while (a[++less] < pivot1) {
+ }
+ while (a[--great] > pivot2) {
+ }
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +--------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +--------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (left, less) < pivot1
+ * pivot1 <= all in [less, k) <= pivot2
+ * all in (great, right) > pivot2
+ *
+ * Pointer k is the first index of ?-part.
+ */
+ outer:
+ for (int k = less - 1; ++k <= great; ) {
+ int ak = a[k];
+ if (ak < pivot1) { // Move a[k] to left part
+ a[k] = a[less];
+ /*
+ * Here and below we use "a[i] = b; i++;" instead
+ * of "a[i++] = b;" due to performance issue.
+ */
+ a[less] = ak;
+ ++less;
+ }
+ else if (ak > pivot2) { // Move a[k] to right part
+ while (a[great] > pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] < pivot1) { // a[great] <= pivot2
+ a[k] = a[less];
+ a[less] = a[great];
+ ++less;
+ }
+ else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ }
+ /*
+ * Here and below we use "a[i] = b; i--;" instead
+ * of "a[i--] = b;" due to performance issue.
+ */
+ a[great] = ak;
+ --great;
+ }
+ }
+
+ // Swap pivots into their final positions
+ a[left] = a[less - 1];
+ a[less - 1] = pivot1;
+ a[right] = a[great + 1];
+ a[great + 1] = pivot2;
+
+ // Sort left and right parts recursively, excluding known pivots
+ SortingIntTestJMH.sort(a, left, less - 2, leftmost);
+ SortingIntTestJMH.sort(a, great + 2, right, false);
+
+ /*
+ * If center part is too large (comprises > 4/7 of the array),
+ * swap internal pivot values to ends.
+ */
+ if (less < e1 && e5 < great) {
+ /*
+ * Skip elements, which are equal to pivot values.
+ */
+ while (a[less] == pivot1) {
+ ++less;
+ }
+
+ while (a[great] == pivot2) {
+ --great;
+ }
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part.
+ */
+ outer:
+ for (int k = less - 1; ++k <= great; ) {
+ int ak = a[k];
+ if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
+ a[less] = ak;
+ ++less;
+ }
+ else if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) { // a[great] < pivot2
+ a[k] = a[less];
+ /*
+ * Even though a[great] equals to pivot1, the
+ * assignment a[less] = pivot1 may be incorrect,
+ * if a[great] and pivot1 are floating-point zeros
+ * of different signs. Therefore in float and
+ * double sorting methods we have to use more
+ * accurate assignment a[less] = a[great].
+ */
+ a[less] = pivot1;
+ ++less;
+ }
+ else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great] = ak;
+ --great;
+ }
+ }
+ }
+
+ // Sort center part recursively
+ SortingIntTestJMH.sort(a, less, great, false);
+ }
+ else { // Partitioning with one pivot
+ /*
+ * Use the third of the five sorted elements as pivot.
+ * This value is inexpensive approximation of the median.
+ */
+ int pivot = a[e3];
+
+ /*
+ * Partitioning degenerates to the traditional 3-way
+ * (or "Dutch National Flag") schema:
+ *
+ * left part center part right part
+ * +-------------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +-------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (left, less) < pivot
+ * all in [less, k) == pivot
+ * all in (great, right) > pivot
+ *
+ * Pointer k is the first index of ?-part.
+ */
+ for (int k = less; k <= great; ++k) {
+ if (a[k] == pivot) {
+ continue;
+ }
+ int ak = a[k];
+ if (ak < pivot) { // Move a[k] to left part
+ a[k] = a[less];
+ a[less] = ak;
+ ++less;
+ }
+ else { // a[k] > pivot - Move a[k] to right part
+ while (a[great] > pivot) {
+ --great;
+ }
+ if (a[great] < pivot) { // a[great] <= pivot
+ a[k] = a[less];
+ a[less] = a[great];
+ ++less;
+ }
+ else { // a[great] == pivot
+ /*
+ * Even though a[great] equals to pivot, the
+ * assignment a[k] = pivot may be incorrect,
+ * if a[great] and pivot are floating-point
+ * zeros of different signs. Therefore in float
+ * and double sorting methods we have to use
+ * more accurate assignment a[k] = a[great].
+ */
+ a[k] = pivot;
+ }
+ a[great] = ak;
+ --great;
+ }
+ }
+
+ /*
+ * Sort left and right parts recursively.
+ * All elements from center part are equal
+ * and, therefore, already sorted.
+ */
+ SortingIntTestJMH.sort(a, left, less - 1, leftmost);
+ SortingIntTestJMH.sort(a, great + 1, right, false);
+ }
+ }
+
+ private static void swap(int[] arr, int i, int j) {
+ int tmp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = tmp;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Arrays/SortingLongBenchmarkTestJMH.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,725 @@
+/*
+ * Copyright 2015 Goldman Sachs.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@State(Scope.Thread)
+@BenchmarkMode(Mode.Throughput)
+@OutputTimeUnit(TimeUnit.SECONDS)
+public class SortingLongBenchmarkTestJMH {
+ private static final int QUICKSORT_THRESHOLD = 286;
+ private static final int MAX_RUN_COUNT = 67;
+ private static final int INSERTION_SORT_THRESHOLD = 47;
+ public static final int MAX_VALUE = 1_000_000;
+
+ @Param({"pairFlipZeroPairFlip", "descendingAscending", "zeroHi", "hiZeroLow", "hiFlatLow", "identical",
+ "randomDups", "randomNoDups", "sortedReversedSorted", "pairFlip", "endLessThan"})
+ public String listType;
+
+ private long[] array;
+ private static final int LIST_SIZE = 10_000_000;
+ public static final int NUMBER_OF_ITERATIONS = 10;
+
+ @Setup
+ public void setUp() {
+ Random random = new Random(123456789012345L);
+ this.array = new long[LIST_SIZE];
+ int threeQuarters = (int) (LIST_SIZE * 0.75);
+ if ("zeroHi".equals(this.listType)) {
+ for (int i = 0; i < threeQuarters; i++) {
+ this.array[i] = 0;
+ }
+ int k = 1;
+ for (int i = threeQuarters; i < LIST_SIZE; i++) {
+ this.array[i] = k;
+ k++;
+ }
+ }
+ else if ("hiFlatLow".equals(this.listType)) {
+ int oneThird = LIST_SIZE / 3;
+ for (int i = 0; i < oneThird; i++) {
+ this.array[i] = i;
+ }
+ int twoThirds = oneThird * 2;
+ int constant = oneThird - 1;
+ for (int i = oneThird; i < twoThirds; i++) {
+ this.array[i] = constant;
+ }
+ for (int i = twoThirds; i < LIST_SIZE; i++) {
+ this.array[i] = constant - i + twoThirds;
+ }
+ }
+ else if ("hiZeroLow".equals(this.listType)) {
+ int oneThird = LIST_SIZE / 3;
+ for (int i = 0; i < oneThird; i++) {
+ this.array[i] = i;
+ }
+ int twoThirds = oneThird * 2;
+ for (int i = oneThird; i < twoThirds; i++) {
+ this.array[i] = 0;
+ }
+ for (int i = twoThirds; i < LIST_SIZE; i++) {
+ this.array[i] = oneThird - i + twoThirds;
+ }
+ }
+ else if ("identical".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = 0;
+ }
+ }
+ else if ("randomDups".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = random.nextInt(1000);
+ }
+ }
+ else if ("randomNoDups".equals(this.listType)) {
+ Set<Integer> set = new HashSet<>();
+ while (set.size() < LIST_SIZE + 1) {
+ set.add(random.nextInt());
+ }
+ List<Integer> list = new ArrayList<>(LIST_SIZE);
+ list.addAll(set);
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = list.get(i);
+ }
+ }
+ else if ("sortedReversedSorted".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE / 2; i++) {
+ this.array[i] = i;
+ }
+ int num = 0;
+ for (int i = LIST_SIZE / 2; i < LIST_SIZE; i++) {
+ this.array[i] = LIST_SIZE - num;
+ num++;
+ }
+ }
+ else if ("pairFlip".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE; i++) {
+ this.array[i] = i;
+ }
+ for (int i = 0; i < LIST_SIZE; i += 2) {
+ long temp = this.array[i];
+ this.array[i] = this.array[i + 1];
+ this.array[i + 1] = temp;
+ }
+ }
+ else if ("endLessThan".equals(this.listType)) {
+ for (int i = 0; i < LIST_SIZE - 1; i++) {
+ this.array[i] = 3;
+ }
+ this.array[LIST_SIZE - 1] = 1;
+ }
+ else if ("pairFlipZeroPairFlip".equals(this.listType)) {
+ //pairflip
+ for (int i = 0; i < 64; i++) {
+ this.array[i] = i;
+ }
+ for (int i = 0; i < 64; i += 2) {
+ long temp = this.array[i];
+ this.array[i] = this.array[i + 1];
+ this.array[i + 1] = temp;
+ }
+ //zero
+ for (int i = 64; i < this.array.length - 64; i++) {
+ this.array[i] = 0;
+ }
+ //pairflip
+ for (int i = this.array.length - 64; i < this.array.length; i++) {
+ this.array[i] = i;
+ }
+ for (int i = this.array.length - 64; i < this.array.length; i += 2) {
+ long temp = this.array[i];
+ this.array[i] = this.array[i + 1];
+ this.array[i + 1] = temp;
+ }
+ }
+ else if ("pairFlipOneHundredPairFlip".equals(this.listType)) {
+ //10, 5
+ for (int i = 0; i < 64; i++) {
+ if (i % 2 == 0) {
+ this.array[i] = 10;
+ }
+ else {
+ this.array[i] = 5;
+ }
+ }
+
+ //100
+ for (int i = 64; i < this.array.length - 64; i++) {
+ this.array[i] = 100;
+ }
+
+ //10, 5
+ for (int i = this.array.length - 64; i < this.array.length; i++) {
+ if (i % 2 == 0) {
+ this.array[i] = 10;
+ }
+ else {
+ this.array[i] = 5;
+ }
+ }
+ }
+ }
+
+ @Warmup(iterations = 20)
+ @Measurement(iterations = 10)
+ @Benchmark
+ public void sortNewWay() {
+ for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+ SortingLongTestJMH.sort(this.array, 0, this.array.length - 1, null, 0, 0);
+ }
+ }
+
+ @Warmup(iterations = 20)
+ @Measurement(iterations = 10)
+ @Benchmark
+ public void sortOldWay() {
+ for (int i = 0; i < NUMBER_OF_ITERATIONS; i++) {
+ Arrays.sort(this.array);
+ }
+ }
+
+ /**
+ * Sorts the specified range of the array using the given
+ * workspace array slice if possible for merging
+ *
+ * @param a the array to be sorted
+ * @param left the index of the first element, inclusive, to be sorted
+ * @param right the index of the last element, inclusive, to be sorted
+ * @param work a workspace array (slice)
+ * @param workBase origin of usable space in work array
+ * @param workLen usable size of work array
+ */
+ static void sort(long[] a, int left, int right,
+ long[] work, int workBase, int workLen) {
+// Use Quicksort on small arrays
+ if (right - left < QUICKSORT_THRESHOLD) {
+ SortingLongTestJMH.sort(a, left, right, true);
+ return;
+ }
+
+ /*
+ * Index run[i] is the start of i-th run
+ * (ascending or descending sequence).
+ */
+ int[] run = new int[MAX_RUN_COUNT + 1];
+ int count = 0;
+ run[0] = left;
+
+ // Check if the array is nearly sorted
+ for (int k = left; k < right; run[count] = k) {
+ while (k < right && a[k] == a[k + 1])
+ k++;
+ if (k == right) break;
+ if (a[k] < a[k + 1]) { // ascending
+ while (++k <= right && a[k - 1] <= a[k]) ;
+ }
+ else if (a[k] > a[k + 1]) { // descending
+ while (++k <= right && a[k - 1] >= a[k]) ;
+ for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
+ long t = a[lo];
+ a[lo] = a[hi];
+ a[hi] = t;
+ }
+ }
+ if (run[count] > left && a[run[count]] >= a[run[count] - 1]) {
+ count--;
+ }
+ /*
+ * The array is not highly structured,
+ * use Quicksort instead of merge sort.
+ */
+ if (++count == MAX_RUN_COUNT) {
+ sort(a, left, right, true);
+ return;
+ }
+ }
+
+ // Check special cases
+ // Implementation note: variable "right" is increased by 1.
+ if (run[count] == right++) {
+ run[++count] = right;
+ }
+ if (count <= 1) { // The array is already sorted
+ return;
+ }
+
+ // Determine alternation base for merge
+ byte odd = 0;
+ for (int n = 1; (n <<= 1) < count; odd ^= 1) {
+ }
+
+ // Use or create temporary array b for merging
+ long[] b; // temp array; alternates with a
+ int ao, bo; // array offsets from 'left'
+ int blen = right - left; // space needed for b
+ if (work == null || workLen < blen || workBase + blen > work.length) {
+ work = new long[blen];
+ workBase = 0;
+ }
+ if (odd == 0) {
+ System.arraycopy(a, left, work, workBase, blen);
+ b = a;
+ bo = 0;
+ a = work;
+ ao = workBase - left;
+ }
+ else {
+ b = work;
+ ao = 0;
+ bo = workBase - left;
+ }
+
+ // Merging
+ for (int last; count > 1; count = last) {
+ for (int k = (last = 0) + 2; k <= count; k += 2) {
+ int hi = run[k], mi = run[k - 1];
+ for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {
+ if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {
+ b[i + bo] = a[p++ + ao];
+ }
+ else {
+ b[i + bo] = a[q++ + ao];
+ }
+ }
+ run[++last] = hi;
+ }
+ if ((count & 1) != 0) {
+ for (int i = right, lo = run[count - 1]; --i >= lo;
+ b[i + bo] = a[i + ao]
+ ) {
+ }
+ run[++last] = right;
+ }
+ long[] t = a;
+ a = b;
+ b = t;
+ int o = ao;
+ ao = bo;
+ bo = o;
+ }
+ }
+
+ /**
+ * Sorts the specified range of the array by Dual-Pivot Quicksort.
+ *
+ * @param a the array to be sorted
+ * @param left the index of the first element, inclusive, to be sorted
+ * @param right the index of the last element, inclusive, to be sorted
+ * @param leftmost indicates if this part is the leftmost in the range
+ */
+ private static void sort(long[] a, int left, int right, boolean leftmost) {
+ int length = right - left + 1;
+
+ // Use insertion sort on tiny arrays
+ if (length < INSERTION_SORT_THRESHOLD) {
+ if (leftmost) {
+ /*
+ * Traditional (without sentinel) insertion sort,
+ * optimized for server VM, is used in case of
+ * the leftmost part.
+ */
+ for (int i = left, j = i; i < right; j = ++i) {
+ long ai = a[i + 1];
+ while (ai < a[j]) {
+ a[j + 1] = a[j];
+ if (j-- == left) {
+ break;
+ }
+ }
+ a[j + 1] = ai;
+ }
+ }
+ else {
+ /*
+ * Skip the longest ascending sequence.
+ */
+ do {
+ if (left >= right) {
+ return;
+ }
+ }
+ while (a[++left] >= a[left - 1]);
+
+ /*
+ * Every element from adjoining part plays the role
+ * of sentinel, therefore this allows us to avoid the
+ * left range check on each iteration. Moreover, we use
+ * the more optimized algorithm, so called pair insertion
+ * sort, which is faster (in the context of Quicksort)
+ * than traditional implementation of insertion sort.
+ */
+ for (int k = left; ++left <= right; k = ++left) {
+ long a1 = a[k], a2 = a[left];
+
+ if (a1 < a2) {
+ a2 = a1;
+ a1 = a[left];
+ }
+ while (a1 < a[--k]) {
+ a[k + 2] = a[k];
+ }
+ a[++k + 1] = a1;
+
+ while (a2 < a[--k]) {
+ a[k + 1] = a[k];
+ }
+ a[k + 1] = a2;
+ }
+ long last = a[right];
+
+ while (last < a[--right]) {
+ a[right + 1] = a[right];
+ }
+ a[right + 1] = last;
+ }
+ return;
+ }
+
+ // Inexpensive approximation of length / 7
+ int seventh = (length >> 3) + (length >> 6) + 1;
+
+ /*
+ * Sort five evenly spaced elements around (and including) the
+ * center element in the range. These elements will be used for
+ * pivot selection as described below. The choice for spacing
+ * these elements was empirically determined to work well on
+ * a wide variety of inputs.
+ */
+ int e3 = (left + right) >>> 1; // The midpoint
+ int e2 = e3 - seventh;
+ int e1 = e2 - seventh;
+ int e4 = e3 + seventh;
+ int e5 = e4 + seventh;
+
+ // Sort these elements using insertion sort
+ if (a[e2] < a[e1]) {
+ long t = a[e2];
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+
+ if (a[e3] < a[e2]) {
+ long t = a[e3];
+ a[e3] = a[e2];
+ a[e2] = t;
+ if (t < a[e1]) {
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+ }
+ if (a[e4] < a[e3]) {
+ long t = a[e4];
+ a[e4] = a[e3];
+ a[e3] = t;
+ if (t < a[e2]) {
+ a[e3] = a[e2];
+ a[e2] = t;
+ if (t < a[e1]) {
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+ }
+ }
+ if (a[e5] < a[e4]) {
+ long t = a[e5];
+ a[e5] = a[e4];
+ a[e4] = t;
+ if (t < a[e3]) {
+ a[e4] = a[e3];
+ a[e3] = t;
+ if (t < a[e2]) {
+ a[e3] = a[e2];
+ a[e2] = t;
+ if (t < a[e1]) {
+ a[e2] = a[e1];
+ a[e1] = t;
+ }
+ }
+ }
+ }
+
+ // Pointers
+ int less = left; // The index of the first element of center part
+ int great = right; // The index before the first element of right part
+
+ if (a[e1] != a[e2] && a[e2] != a[e3] && a[e3] != a[e4] && a[e4] != a[e5]) {
+ /*
+ * Use the second and fourth of the five sorted elements as pivots.
+ * These values are inexpensive approximations of the first and
+ * second terciles of the array. Note that pivot1 <= pivot2.
+ */
+ long pivot1 = a[e2];
+ long pivot2 = a[e4];
+
+ /*
+ * The first and the last elements to be sorted are moved to the
+ * locations formerly occupied by the pivots. When partitioning
+ * is complete, the pivots are swapped back into their final
+ * positions, and excluded from subsequent sorting.
+ */
+ a[e2] = a[left];
+ a[e4] = a[right];
+
+ /*
+ * Skip elements, which are less or greater than pivot values.
+ */
+ while (a[++less] < pivot1) {
+ }
+ while (a[--great] > pivot2) {
+ }
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +--------------------------------------------------------------+
+ * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 |
+ * +--------------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (left, less) < pivot1
+ * pivot1 <= all in [less, k) <= pivot2
+ * all in (great, right) > pivot2
+ *
+ * Pointer k is the first index of ?-part.
+ */
+ outer:
+ for (int k = less - 1; ++k <= great; ) {
+ long ak = a[k];
+ if (ak < pivot1) { // Move a[k] to left part
+ a[k] = a[less];
+ /*
+ * Here and below we use "a[i] = b; i++;" instead
+ * of "a[i++] = b;" due to performance issue.
+ */
+ a[less] = ak;
+ ++less;
+ }
+ else if (ak > pivot2) { // Move a[k] to right part
+ while (a[great] > pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] < pivot1) { // a[great] <= pivot2
+ a[k] = a[less];
+ a[less] = a[great];
+ ++less;
+ }
+ else { // pivot1 <= a[great] <= pivot2
+ a[k] = a[great];
+ }
+ /*
+ * Here and below we use "a[i] = b; i--;" instead
+ * of "a[i--] = b;" due to performance issue.
+ */
+ a[great] = ak;
+ --great;
+ }
+ }
+
+ // Swap pivots into their final positions
+ a[left] = a[less - 1];
+ a[less - 1] = pivot1;
+ a[right] = a[great + 1];
+ a[great + 1] = pivot2;
+
+ // Sort left and right parts recursively, excluding known pivots
+ SortingLongTestJMH.sort(a, left, less - 2, leftmost);
+ SortingLongTestJMH.sort(a, great + 2, right, false);
+
+ /*
+ * If center part is too large (comprises > 4/7 of the array),
+ * swap internal pivot values to ends.
+ */
+ if (less < e1 && e5 < great) {
+ /*
+ * Skip elements, which are equal to pivot values.
+ */
+ while (a[less] == pivot1) {
+ ++less;
+ }
+
+ while (a[great] == pivot2) {
+ --great;
+ }
+
+ /*
+ * Partitioning:
+ *
+ * left part center part right part
+ * +----------------------------------------------------------+
+ * | == pivot1 | pivot1 < && < pivot2 | ? | == pivot2 |
+ * +----------------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (*, less) == pivot1
+ * pivot1 < all in [less, k) < pivot2
+ * all in (great, *) == pivot2
+ *
+ * Pointer k is the first index of ?-part.
+ */
+ outer:
+ for (int k = less - 1; ++k <= great; ) {
+ long ak = a[k];
+ if (ak == pivot1) { // Move a[k] to left part
+ a[k] = a[less];
+ a[less] = ak;
+ ++less;
+ }
+ else if (ak == pivot2) { // Move a[k] to right part
+ while (a[great] == pivot2) {
+ if (great-- == k) {
+ break outer;
+ }
+ }
+ if (a[great] == pivot1) { // a[great] < pivot2
+ a[k] = a[less];
+ /*
+ * Even though a[great] equals to pivot1, the
+ * assignment a[less] = pivot1 may be incorrect,
+ * if a[great] and pivot1 are floating-point zeros
+ * of different signs. Therefore in float and
+ * double sorting methods we have to use more
+ * accurate assignment a[less] = a[great].
+ */
+ a[less] = pivot1;
+ ++less;
+ }
+ else { // pivot1 < a[great] < pivot2
+ a[k] = a[great];
+ }
+ a[great] = ak;
+ --great;
+ }
+ }
+ }
+
+ // Sort center part recursively
+ SortingLongTestJMH.sort(a, less, great, false);
+ }
+ else { // Partitioning with one pivot
+ /*
+ * Use the third of the five sorted elements as pivot.
+ * This value is inexpensive approximation of the median.
+ */
+ long pivot = a[e3];
+
+ /*
+ * Partitioning degenerates to the traditional 3-way
+ * (or "Dutch National Flag") schema:
+ *
+ * left part center part right part
+ * +-------------------------------------------------+
+ * | < pivot | == pivot | ? | > pivot |
+ * +-------------------------------------------------+
+ * ^ ^ ^
+ * | | |
+ * less k great
+ *
+ * Invariants:
+ *
+ * all in (left, less) < pivot
+ * all in [less, k) == pivot
+ * all in (great, right) > pivot
+ *
+ * Pointer k is the first index of ?-part.
+ */
+ for (int k = less; k <= great; ++k) {
+ if (a[k] == pivot) {
+ continue;
+ }
+ long ak = a[k];
+ if (ak < pivot) { // Move a[k] to left part
+ a[k] = a[less];
+ a[less] = ak;
+ ++less;
+ }
+ else { // a[k] > pivot - Move a[k] to right part
+ while (a[great] > pivot) {
+ --great;
+ }
+ if (a[great] < pivot) { // a[great] <= pivot
+ a[k] = a[less];
+ a[less] = a[great];
+ ++less;
+ }
+ else { // a[great] == pivot
+ /*
+ * Even though a[great] equals to pivot, the
+ * assignment a[k] = pivot may be incorrect,
+ * if a[great] and pivot are floating-point
+ * zeros of different signs. Therefore in float
+ * and double sorting methods we have to use
+ * more accurate assignment a[k] = a[great].
+ */
+ a[k] = pivot;
+ }
+ a[great] = ak;
+ --great;
+ }
+ }
+
+ /*
+ * Sort left and right parts recursively.
+ * All elements from center part are equal
+ * and, therefore, already sorted.
+ */
+ SortingLongTestJMH.sort(a, left, less - 1, leftmost);
+ SortingLongTestJMH.sort(a, great + 1, right, false);
+ }
+ }
+
+ private static void swap(long[] arr, int i, int j) {
+ long tmp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = tmp;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Arrays/SortingNearlySortedPrimitive.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2015 Goldman Sachs.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+/*
+ * @test
+ * @summary Tests the sorting of a large array of sorted primitive values,
+ * predominently for cases where the array is nearly sorted. This tests
+ * code that detects patterns in the array to determine if it is nearly
+ * sorted and if so employs and optimizes merge sort rather than a
+ * Dual-Pivot QuickSort.
+ *
+ * @run testng SortingNearlySortedPrimitive
+ */
+
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.Arrays;
+import java.util.function.Supplier;
+
+public class SortingNearlySortedPrimitive {
+ private static final int ARRAY_SIZE = 1_000_000;
+
+ @DataProvider(name = "arrays")
+ public Object[][] createData() {
+ return new Object[][]{
+ {"hiZeroLowTest", (Supplier<int[]>) this::hiZeroLowData},
+ {"endLessThanTest", (Supplier<int[]>) this::endLessThanData},
+ {"highFlatLowTest", (Supplier<int[]>) this::highFlatLowData},
+ {"identicalTest", (Supplier<int[]>) this::identicalData},
+ {"sortedReversedSortedTest", (Supplier<int[]>) this::sortedReversedSortedData},
+ {"pairFlipTest", (Supplier<int[]>) this::pairFlipData},
+ {"zeroHiTest", (Supplier<int[]>) this::zeroHiData},
+ };
+ }
+
+ @Test(dataProvider = "arrays")
+ public void runTests(String testName, Supplier<int[]> dataMethod) throws Exception {
+ int[] intSourceArray = dataMethod.get();
+
+ // Clone source array to ensure it is not modified
+ this.sortAndAssert(intSourceArray.clone());
+ this.sortAndAssert(floatCopyFromInt(intSourceArray));
+ this.sortAndAssert(doubleCopyFromInt(intSourceArray));
+ this.sortAndAssert(longCopyFromInt(intSourceArray));
+ this.sortAndAssert(shortCopyFromInt(intSourceArray));
+ this.sortAndAssert(charCopyFromInt(intSourceArray));
+ }
+
+ private float[] floatCopyFromInt(int[] src) {
+ float[] result = new float[src.length];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = src[i];
+ }
+ return result;
+ }
+
+ private double[] doubleCopyFromInt(int[] src) {
+ double[] result = new double[src.length];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = src[i];
+ }
+ return result;
+ }
+
+ private long[] longCopyFromInt(int[] src) {
+ long[] result = new long[src.length];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = src[i];
+ }
+ return result;
+ }
+
+ private short[] shortCopyFromInt(int[] src) {
+ short[] result = new short[src.length];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = (short) src[i];
+ }
+ return result;
+ }
+
+ private char[] charCopyFromInt(int[] src) {
+ char[] result = new char[src.length];
+ for (int i = 0; i < result.length; i++) {
+ result[i] = (char) src[i];
+ }
+ return result;
+ }
+
+ private void sortAndAssert(int[] array) {
+ Arrays.sort(array);
+ for (int i = 1; i < ARRAY_SIZE; i++) {
+ if (array[i] < array[i - 1]) {
+ throw new AssertionError("not sorted");
+ }
+ }
+ Assert.assertEquals(ARRAY_SIZE, array.length);
+ }
+
+ private void sortAndAssert(char[] array) {
+ Arrays.sort(array);
+ for (int i = 1; i < ARRAY_SIZE; i++) {
+ if (array[i] < array[i - 1]) {
+ throw new AssertionError("not sorted");
+ }
+ }
+ Assert.assertEquals(ARRAY_SIZE, array.length);
+ }
+
+ private void sortAndAssert(short[] array) {
+ Arrays.sort(array);
+ for (int i = 1; i < ARRAY_SIZE; i++) {
+ if (array[i] < array[i - 1]) {
+ throw new AssertionError("not sorted");
+ }
+ }
+ Assert.assertEquals(ARRAY_SIZE, array.length);
+ }
+
+ private void sortAndAssert(double[] array) {
+ Arrays.sort(array);
+ for (int i = 1; i < ARRAY_SIZE; i++) {
+ if (array[i] < array[i - 1]) {
+ throw new AssertionError("not sorted");
+ }
+ }
+ Assert.assertEquals(ARRAY_SIZE, array.length);
+ }
+
+ private void sortAndAssert(float[] array) {
+ Arrays.sort(array);
+ for (int i = 1; i < ARRAY_SIZE; i++) {
+ if (array[i] < array[i - 1]) {
+ throw new AssertionError("not sorted");
+ }
+ }
+ Assert.assertEquals(ARRAY_SIZE, array.length);
+ }
+
+ private void sortAndAssert(long[] array) {
+ Arrays.sort(array);
+ for (int i = 1; i < ARRAY_SIZE; i++) {
+ if (array[i] < array[i - 1]) {
+ throw new AssertionError("not sorted");
+ }
+ }
+ Assert.assertEquals(ARRAY_SIZE, array.length);
+ }
+
+ private int[] zeroHiData() {
+ int[] array = new int[ARRAY_SIZE];
+
+ int threeQuarters = (int) (ARRAY_SIZE * 0.75);
+ for (int i = 0; i < threeQuarters; i++) {
+ array[i] = 0;
+ }
+ int k = 1;
+ for (int i = threeQuarters; i < ARRAY_SIZE; i++) {
+ array[i] = k;
+ k++;
+ }
+
+ return array;
+ }
+
+ private int[] hiZeroLowData() {
+ int[] array = new int[ARRAY_SIZE];
+
+ int oneThird = ARRAY_SIZE / 3;
+ for (int i = 0; i < oneThird; i++) {
+ array[i] = i;
+ }
+ int twoThirds = oneThird * 2;
+ for (int i = oneThird; i < twoThirds; i++) {
+ array[i] = 0;
+ }
+ for (int i = twoThirds; i < ARRAY_SIZE; i++) {
+ array[i] = oneThird - i + twoThirds;
+ }
+ return array;
+ }
+
+ private int[] highFlatLowData() {
+ int[] array = new int[ARRAY_SIZE];
+
+ int oneThird = ARRAY_SIZE / 3;
+ for (int i = 0; i < oneThird; i++) {
+ array[i] = i;
+ }
+ int twoThirds = oneThird * 2;
+ int constant = oneThird - 1;
+ for (int i = oneThird; i < twoThirds; i++) {
+ array[i] = constant;
+ }
+ for (int i = twoThirds; i < ARRAY_SIZE; i++) {
+ array[i] = constant - i + twoThirds;
+ }
+
+ return array;
+ }
+
+ private int[] identicalData() {
+ int[] array = new int[ARRAY_SIZE];
+ int listNumber = 24;
+
+ for (int i = 0; i < ARRAY_SIZE; i++) {
+ array[i] = listNumber;
+ }
+
+ return array;
+ }
+
+ private int[] endLessThanData() {
+ int[] array = new int[ARRAY_SIZE];
+
+ for (int i = 0; i < ARRAY_SIZE - 1; i++) {
+ array[i] = 3;
+ }
+ array[ARRAY_SIZE - 1] = 1;
+
+ return array;
+ }
+
+ private int[] sortedReversedSortedData() {
+ int[] array = new int[ARRAY_SIZE];
+
+ for (int i = 0; i < ARRAY_SIZE / 2; i++) {
+ array[i] = i;
+ }
+ int num = 0;
+ for (int i = ARRAY_SIZE / 2; i < ARRAY_SIZE; i++) {
+ array[i] = ARRAY_SIZE - num;
+ num++;
+ }
+
+ return array;
+ }
+
+ private int[] pairFlipData() {
+ int[] array = new int[ARRAY_SIZE];
+
+ for (int i = 0; i < ARRAY_SIZE; i++) {
+ array[i] = i;
+ }
+ for (int i = 0; i < ARRAY_SIZE; i += 2) {
+ int temp = array[i];
+ array[i] = array[i + 1];
+ array[i + 1] = temp;
+ }
+
+ return array;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/PropertyPermission/PropertyPermissionCollection.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,162 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for PropertyPermissionCollection subclass
+ */
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+import java.util.PropertyPermission;
+
+public class PropertyPermissionCollection {
+
+ public static void main(String[] args) throws Exception {
+
+ int testFail = 0;
+
+ PropertyPermission perm = new PropertyPermission("user.home", "read");
+ PermissionCollection perms = perm.newPermissionCollection();
+
+ // test 1
+ System.out.println
+ ("test 1: add throws IllegalArgExc for wrong perm type");
+ try {
+ perms.add(new SecurityPermission("createAccessControlContext"));
+ System.err.println("Expected IllegalArgumentException");
+ testFail++;
+ } catch (IllegalArgumentException iae) {}
+
+ // test 2
+ System.out.println("test 2: implies returns false for wrong perm type");
+ if (perms.implies(new SecurityPermission("getPolicy"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 3
+ System.out.println
+ ("test 3: implies returns true for match on name and action");
+ perms.add(new PropertyPermission("user.home", "read"));
+ if (!perms.implies(new PropertyPermission("user.home", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 4
+ System.out.println
+ ("test 4: implies returns false for match on name but not action");
+ if (perms.implies(new PropertyPermission("user.home", "write"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 5
+ System.out.println("test 5: implies returns true for match " +
+ "on name and subset of actions");
+ perms.add(new PropertyPermission("java.home", "read, write"));
+ if (!perms.implies(new PropertyPermission("java.home", "write"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 6
+ System.out.println("test 6: implies returns true for aggregate " +
+ "match on name and action");
+ perms.add(new PropertyPermission("user.name", "read"));
+ perms.add(new PropertyPermission("user.name", "write"));
+ if (!perms.implies(new PropertyPermission("user.name", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+ if (!perms.implies(new PropertyPermission("user.name", "write,read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 7
+ System.out.println("test 7: implies returns true for wildcard " +
+ "and match on action");
+ perms.add(new PropertyPermission("foo.*", "read"));
+ if (!perms.implies(new PropertyPermission("foo.bar", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 8
+ System.out.println("test 8: implies returns true for deep " +
+ "wildcard and match on action");
+ if (!perms.implies(new PropertyPermission("foo.bar.baz", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 8
+ System.out.println
+ ("test 8: implies returns false for invalid wildcard");
+ perms.add(new PropertyPermission("baz*", "read"));
+ if (perms.implies(new PropertyPermission("baz.foo", "read"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 9
+ System.out.println("test 9: implies returns true for all " +
+ "wildcard and match on action");
+ perms.add(new PropertyPermission("*", "read"));
+ if (!perms.implies(new PropertyPermission("java.version", "read"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 10
+ System.out.println("test 10: implies returns false for wildcard " +
+ "and non-match on action");
+ if (perms.implies(new PropertyPermission("java.version", "write"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 11
+ System.out.println("test 11: elements returns correct number of perms");
+ int numPerms = 0;
+ Enumeration<Permission> e = perms.elements();
+ while (e.hasMoreElements()) {
+ numPerms++;
+ System.out.println(e.nextElement());
+ }
+ // the 2 user.name permissions added were combined into one
+ if (numPerms != 6) {
+ System.err.println("Expected 6, got " + numPerms);
+ testFail++;
+ }
+
+ if (testFail > 0) {
+ throw new Exception(testFail + " test(s) failed");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/concurrent/LinkedTransferQueue/SpliteratorTraverseAddRemoveTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @run testng SpliteratorTraverseAddRemoveTest
+ * @bug 8085978
+ * @summary repeatedly traverse the queue using the spliterator while
+ * concurrently adding and removing an element to test that self-linked
+ * nodes are never erroneously reported on traversal
+ */
+
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Queue;
+import java.util.Spliterator;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.LinkedTransferQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+
+@Test
+public class SpliteratorTraverseAddRemoveTest {
+
+ static Object[] of(String desc, Consumer<Queue<?>> c) {
+ return new Object[]{desc, c};
+ }
+
+ static void assertIsString(Object e) {
+ Assert.assertTrue(e instanceof String,
+ String.format("Object instanceof %s (actual: instanceof %s)",
+ String.class.getName(),
+ e.getClass().getName()));
+ }
+
+ @DataProvider()
+ public static Object[][] spliteratorTraversers() {
+ return new Object[][]{
+ of("forEachRemaining", q -> {
+ q.spliterator().forEachRemaining(SpliteratorTraverseAddRemoveTest::assertIsString);
+ }),
+ of("tryAdvance", q -> {
+ Spliterator<?> s = q.spliterator();
+ while (s.tryAdvance(SpliteratorTraverseAddRemoveTest::assertIsString))
+ ;
+ }),
+ of("trySplit then forEachRemaining", q -> {
+ Spliterator<?> r = q.spliterator();
+
+ List<Spliterator<?>> ss = new ArrayList<>();
+ Spliterator<?> l;
+ while ((l = r.trySplit()) != null) {
+ ss.add(l);
+ }
+ ss.add(r);
+
+ ss.forEach(s -> s.forEachRemaining(SpliteratorTraverseAddRemoveTest::assertIsString));
+ }),
+ };
+ }
+
+ @Test(dataProvider = "spliteratorTraversers")
+ public void testQueue(String desc, Consumer<Queue<String>> c)
+ throws InterruptedException {
+ AtomicBoolean done = new AtomicBoolean(false);
+ Queue<String> msgs = new LinkedTransferQueue<>();
+
+ CompletableFuture<Void> traversalTask = CompletableFuture.runAsync(() -> {
+ while (!done.get()) {
+ // Traversal will fail if self-linked nodes of
+ // LinkedTransferQueue are erroneously reported
+ c.accept(msgs);
+ }
+ });
+ CompletableFuture<Void> addAndRemoveTask = CompletableFuture.runAsync(() -> {
+ while (!traversalTask.isDone()) {
+ msgs.add("msg");
+ msgs.remove("msg");
+ }
+ });
+
+ Thread.sleep(TimeUnit.SECONDS.toMillis(1));
+ done.set(true);
+
+ addAndRemoveTask.join();
+ Assert.assertTrue(traversalTask.isDone());
+ traversalTask.join();
+ }
+}
--- a/jdk/test/javax/imageio/plugins/png/ItxtUtf8Test.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/javax/imageio/plugins/png/ItxtUtf8Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -30,7 +30,7 @@
*
* @run main ItxtUtf8Test
*
- * @run main/othervm/timeout=10 -Xmx2m ItxtUtf8Test truncate
+ * @run main/othervm/timeout=10 -Xmx4m ItxtUtf8Test truncate
*/
import java.awt.image.BufferedImage;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSBufferOverflowUnderflowTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS buffer overflow and underflow status when dealing with
+ * application data.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSBufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSBufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSBufferOverflowUnderflowTest
+ */
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping.
+ */
+public class DTLSBufferOverflowUnderflowTest {
+ public static void main(String[] args) {
+ BufferOverflowUnderflowTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSDataExchangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS application data exchange using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSDataExchangeTest
+ */
+
+/**
+ * Testing DTLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class DTLSDataExchangeTest {
+ public static void main(String[] args) {
+ DataExchangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSEnginesClosureTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines closing using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSEnginesClosureTest
+ */
+
+/**
+ * Testing DTLS engines closing using each of the supported cipher suites.
+ */
+public class DTLSEnginesClosureTest {
+ public static void main(String[] args) {
+ EnginesClosureTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSHandshakeTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites.
+ */
+public class DTLSHandshakeTest {
+ public static void main(String[] args) {
+ HandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSHandshakeWithReplicatedPacketsTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ * cipher suites with replicated packets check.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSHandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSHandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSHandshakeWithReplicatedPacketsTest
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * replicated packets check.
+ */
+public class DTLSHandshakeWithReplicatedPacketsTest extends SSLEngineTestCase {
+
+ private static String testMode;
+
+ public static void main(String[] args) {
+ DTLSHandshakeWithReplicatedPacketsTest test
+ = new DTLSHandshakeWithReplicatedPacketsTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE, true);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSIncorrectAppDataTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS incorrect app data packages unwrapping.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSIncorrectAppDataTest
+ */
+
+import java.nio.ByteBuffer;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import java.util.Random;
+import jdk.testlibrary.RandomFactory;
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping. Incorrect application
+ * data packages should be ignored by DTLS SSLEngine.
+ */
+public class DTLSIncorrectAppDataTest extends SSLEngineTestCase {
+
+ private final String MESSAGE = "Hello peer!";
+
+ public static void main(String[] s) {
+ DTLSIncorrectAppDataTest test = new DTLSIncorrectAppDataTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ try {
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ checkIncorrectAppDataUnwrap(clientEngine, serverEngine);
+ checkIncorrectAppDataUnwrap(serverEngine, clientEngine);
+ } catch (SSLException ssle) {
+ throw new AssertionError("Error during handshake or sending app data",
+ ssle);
+ }
+ }
+
+ private void checkIncorrectAppDataUnwrap(SSLEngine sendEngine,
+ SSLEngine recvEngine) throws SSLException {
+ String direction = sendEngine.getUseClientMode() ? "client"
+ : "server";
+ System.out.println("================================================="
+ + "===========");
+ System.out.println("Testing DTLS incorrect app data packages unwrapping"
+ + " by sending data from " + direction);
+ ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+ ByteBuffer net = doWrap(sendEngine, direction, 0, app);
+ final Random RNG = RandomFactory.getRandom();
+ int randomPlace = RNG.nextInt(net.remaining());
+ net.array()[randomPlace] += 1;
+ app = ByteBuffer.allocate(recvEngine.getSession()
+ .getApplicationBufferSize());
+ recvEngine.unwrap(net, app);
+ app.flip();
+ int length = app.remaining();
+ System.out.println("Unwrapped " + length + " bytes.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSMFLNTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ * cipher suites with different maximum fragment length. Testing of
+ * MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSMFLNTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class DTLSMFLNTest {
+ public static void main(String[] args) {
+ MFLNTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSNotEnabledRC4Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS DTLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class DTLSNotEnabledRC4Test {
+ public static void main(String[] args) throws Exception {
+ NotEnabledRC4Test.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSRehandshakeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class DTLSRehandshakeTest {
+ public static void main(String[] args) {
+ RehandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithCipherChangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking with cipher change. New cipher
+ * is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * DTLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class DTLSRehandshakeWithCipherChangeTest {
+ public static void main(String[] args) {
+ RehandshakeWithCipherChangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSRehandshakeWithDataExTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ * cipher suites with application data exchange before and after
+ * re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class DTLSRehandshakeWithDataExTest {
+ public static void main(String[] args) {
+ RehandshakeWithDataExTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSSequenceNumberTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS records sequence number property support in application
+ * data exchange.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm DTLSSequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=norm_sni DTLSSequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLS
+ * -Dtest.mode=krb DTLSSequenceNumberTest
+ */
+
+import java.nio.ByteBuffer;
+import java.util.TreeMap;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import java.util.Random;
+import jdk.testlibrary.RandomFactory;
+
+/**
+ * Testing DTLS records sequence number property support in application data
+ * exchange.
+ */
+public class DTLSSequenceNumberTest extends SSLEngineTestCase {
+
+ private final String BIG_MESSAGE = "Very very big message. One two three"
+ + " four five six seven eight nine ten eleven twelve thirteen"
+ + " fourteen fifteen sixteen seventeen eighteen nineteen twenty.";
+ private final byte[] BIG_MESSAGE_BYTES = BIG_MESSAGE.getBytes();
+ private final int PIECES_NUMBER = 15;
+
+ public static void main(String[] args) {
+ DTLSSequenceNumberTest test = new DTLSSequenceNumberTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ checkSeqNumPropertyWithAppDataSend(clientEngine, serverEngine);
+ checkSeqNumPropertyWithAppDataSend(serverEngine, clientEngine);
+ }
+
+ private void checkSeqNumPropertyWithAppDataSend(SSLEngine sendEngine,
+ SSLEngine recvEngine) throws SSLException {
+ String sender, reciever;
+ if (sendEngine.getUseClientMode() && !recvEngine.getUseClientMode()) {
+ sender = "Client";
+ reciever = "Server";
+ } else if (recvEngine.getUseClientMode() && !sendEngine.getUseClientMode()) {
+ sender = "Server";
+ reciever = "Client";
+ } else {
+ throw new Error("Both engines are in the same mode");
+ }
+ System.out.println("================================================="
+ + "===========");
+ System.out.println("Checking DTLS sequence number support"
+ + " by sending data from " + sender + " to " + reciever);
+ ByteBuffer[] sentMessages = new ByteBuffer[PIECES_NUMBER];
+ ByteBuffer[] netBuffers = new ByteBuffer[PIECES_NUMBER];
+ TreeMap<Long, ByteBuffer> recvMap = new TreeMap<>(Long::compareUnsigned);
+ int symbolsInAMessage;
+ int symbolsInTheLastMessage;
+ int[] recievingSequence = new int[PIECES_NUMBER];
+ for (int i = 0; i < PIECES_NUMBER; i++) {
+ recievingSequence[i] = i;
+ }
+ shuffleArray(recievingSequence);
+ if (BIG_MESSAGE.length() % PIECES_NUMBER == 0) {
+ symbolsInAMessage = BIG_MESSAGE.length() / PIECES_NUMBER;
+ symbolsInTheLastMessage = symbolsInAMessage;
+ } else {
+ symbolsInAMessage = BIG_MESSAGE.length() / (PIECES_NUMBER - 1);
+ symbolsInTheLastMessage = BIG_MESSAGE.length() % (PIECES_NUMBER - 1);
+ }
+ for (int i = 0; i < PIECES_NUMBER - 1; i++) {
+ sentMessages[i] = ByteBuffer.wrap(BIG_MESSAGE_BYTES,
+ i * symbolsInAMessage, symbolsInAMessage);
+ }
+ sentMessages[PIECES_NUMBER - 1] = ByteBuffer.wrap(BIG_MESSAGE_BYTES,
+ (PIECES_NUMBER - 1) * symbolsInAMessage, symbolsInTheLastMessage);
+ long prevSeqNum = 0L;
+ //Wrapping massages in direct order
+ for (int i = 0; i < PIECES_NUMBER; i++) {
+ netBuffers[i] = ByteBuffer.allocate(sendEngine.getSession()
+ .getPacketBufferSize());
+ SSLEngineResult[] r = new SSLEngineResult[1];
+ netBuffers[i] = doWrap(sendEngine, sender, 0, sentMessages[i], r);
+ long seqNum = r[0].sequenceNumber();
+ if (Long.compareUnsigned(seqNum, prevSeqNum) <= 0) {
+ throw new AssertionError("Sequence number of the wrapped "
+ + "message is less or equal than that of the"
+ + " previous one! "
+ + "Was " + prevSeqNum + ", now " + seqNum + ".");
+ }
+ prevSeqNum = seqNum;
+ }
+ //Unwrapping messages in random order and trying to reconstruct order
+ //from sequence number.
+ for (int i = 0; i < PIECES_NUMBER; i++) {
+ int recvNow = recievingSequence[i];
+ SSLEngineResult[] r = new SSLEngineResult[1];
+ ByteBuffer recvMassage = doUnWrap(recvEngine, reciever,
+ netBuffers[recvNow], r);
+ long seqNum = r[0].sequenceNumber();
+ recvMap.put(seqNum, recvMassage);
+ }
+ int mapSize = recvMap.size();
+ if (mapSize != PIECES_NUMBER) {
+ throw new AssertionError("The number of received massages "
+ + mapSize + " is not equal to the number of sent messages "
+ + PIECES_NUMBER + "!");
+ }
+ byte[] recvBigMsgBytes = new byte[BIG_MESSAGE_BYTES.length];
+ int counter = 0;
+ for (ByteBuffer msg : recvMap.values()) {
+ System.arraycopy(msg.array(), 0, recvBigMsgBytes,
+ counter * symbolsInAMessage, msg.remaining());
+ counter++;
+ }
+ String recvBigMsg = new String(recvBigMsgBytes);
+ if (!recvBigMsg.equals(BIG_MESSAGE)) {
+ throw new AssertionError("Received big message is not equal to"
+ + " one that was sent! Received message is: " + recvBigMsg);
+ }
+ }
+
+ private static void shuffleArray(int[] ar) {
+ final Random RNG = RandomFactory.getRandom();
+ for (int i = ar.length - 1; i > 0; i--) {
+ int index = RNG.nextInt(i + 1);
+ int a = ar[index];
+ ar[index] = ar[i];
+ ar[i] = a;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/DTLSUnsupportedCiphersTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing that try to enable unsupported ciphers
+ * causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLS DTLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class DTLSUnsupportedCiphersTest {
+ public static void main(String[] args) {
+ UnsupportedCiphersTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLS/TEST.properties Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,1 @@
+modules=java.base java.security.jgss
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10BufferOverflowUnderflowTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS buffer overflow and underflow status when dealing with
+ * application data.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10BufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10BufferOverflowUnderflowTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10BufferOverflowUnderflowTest
+ */
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping.
+ */
+public class DTLSv10BufferOverflowUnderflowTest {
+ public static void main(String[] args) {
+ BufferOverflowUnderflowTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10DataExchangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS application data exchange using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10DataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10DataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10DataExchangeTest
+ */
+
+/**
+ * Testing DTLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class DTLSv10DataExchangeTest {
+ public static void main(String[] args) {
+ DataExchangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10EnginesClosureTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines closing using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10EnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10EnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10EnginesClosureTest
+ */
+
+/**
+ * Testing DTLS engines closing using each of the supported cipher suites.
+ */
+public class DTLSv10EnginesClosureTest {
+ public static void main(String[] args) {
+ EnginesClosureTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10HandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10HandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10HandshakeTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites.
+ */
+public class DTLSv10HandshakeTest {
+ public static void main(String[] args) {
+ HandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10HandshakeWithReplicatedPacketsTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ * cipher suites with replicated packets check.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10HandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10HandshakeWithReplicatedPacketsTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10HandshakeWithReplicatedPacketsTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * replicated packets check.
+ */
+public class DTLSv10HandshakeWithReplicatedPacketsTest {
+ public static void main(String[] args) {
+ DTLSHandshakeWithReplicatedPacketsTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10IncorrectAppDataTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS incorrect app data packages unwrapping.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSIncorrectAppDataTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSIncorrectAppDataTest
+ */
+
+/**
+ * Testing DTLS incorrect app data packages unwrapping. Incorrect application
+ * data packages should be ignored by DTLS SSLEngine.
+ */
+public class DTLSv10IncorrectAppDataTest {
+ public static void main(String[] args) {
+ DTLSIncorrectAppDataTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10MFLNTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines handshake using each of the supported
+ * cipher suites with different maximum fragment length. Testing of
+ * MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10MFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10MFLNTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10MFLNTest
+ */
+
+/**
+ * Testing DTLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class DTLSv10MFLNTest {
+ public static void main(String[] args) {
+ MFLNTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10NotEnabledRC4Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0 DTLSv10NotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class DTLSv10NotEnabledRC4Test {
+ public static void main(String[] args) throws Exception {
+ NotEnabledRC4Test.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10RehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10RehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10RehandshakeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class DTLSv10RehandshakeTest {
+ public static void main(String[] args) {
+ RehandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithCipherChangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking with cipher change. New cipher
+ * is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * DTLSv10RehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class DTLSv10RehandshakeWithCipherChangeTest {
+ public static void main(String[] args) {
+ RehandshakeWithCipherChangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10RehandshakeWithDataExTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS engines re-handshaking using each of the supported
+ * cipher suites with application data exchange before and after
+ * re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10RehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10RehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10RehandshakeWithDataExTest
+ */
+
+/**
+ * Testing DTLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class DTLSv10RehandshakeWithDataExTest {
+ public static void main(String[] args) {
+ RehandshakeWithDataExTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10SequenceNumberTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing DTLS records sequence number property support in application
+ * data exchange.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon /javax/net/ssl/DTLS
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm DTLSv10SequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=norm_sni DTLSv10SequenceNumberTest
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * -Dtest.mode=krb DTLSv10SequenceNumberTest
+ */
+
+/**
+ * Testing DTLS records sequence number property support in application data
+ * exchange.
+ */
+public class DTLSv10SequenceNumberTest {
+ public static void main(String[] args) {
+ DTLSHandshakeWithReplicatedPacketsTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/DTLSv10UnsupportedCiphersTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8043758
+ * @summary Testing that try to enable unsupported ciphers
+ * causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=DTLSv1.0
+ * DTLSv10UnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class DTLSv10UnsupportedCiphersTest {
+ public static void main(String[] args) {
+ UnsupportedCiphersTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/DTLSv10/TEST.properties Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,1 @@
+modules=java.base java.security.jgss
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSDataExchangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS application data exchange using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSDataExchangeTest
+ */
+
+/**
+ * Testing TLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class TLSDataExchangeTest {
+ public static void main(String[] args) {
+ DataExchangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSEnginesClosureTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines closing using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSEnginesClosureTest
+ */
+
+/**
+ * Testing TLS engines closing using each of the supported cipher suites.
+ */
+public class TLSEnginesClosureTest {
+ public static void main(String[] args) {
+ EnginesClosureTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSHandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSHandshakeTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites.
+ */
+public class TLSHandshakeTest {
+ public static void main(String[] args) {
+ HandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSMFLNTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ * cipher suites with different maximum fragment length. Testing of
+ * MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSMFLNTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class TLSMFLNTest {
+ public static void main(String[] args) {
+ MFLNTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSNotEnabledRC4Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS TLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class TLSNotEnabledRC4Test {
+ public static void main(String[] args) throws Exception {
+ NotEnabledRC4Test.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSRehandshakeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class TLSRehandshakeTest {
+ public static void main(String[] args) {
+ RehandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithCipherChangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking with cipher change. New cipher
+ * is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS TLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class TLSRehandshakeWithCipherChangeTest {
+ public static void main(String[] args) {
+ RehandshakeWithCipherChangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSRehandshakeWithDataExTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ * cipher suites with application data exchange before and after
+ * re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLS -Dtest.mode=krb TLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class TLSRehandshakeWithDataExTest {
+ public static void main(String[] args) {
+ RehandshakeWithDataExTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLS/TLSUnsupportedCiphersTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing that try to enable unsupported ciphers
+ * causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLS TLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class TLSUnsupportedCiphersTest {
+ public static void main(String[] args) {
+ UnsupportedCiphersTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/BufferOverflowUnderflowTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.nio.ByteBuffer;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngine incorrect app data packages unwrapping.
+ */
+public class BufferOverflowUnderflowTest extends SSLEngineTestCase {
+
+ private final String MESSAGE = "Hello peer!";
+
+ public static void main(String[] args) {
+ BufferOverflowUnderflowTest test = new BufferOverflowUnderflowTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ checkBufferOverflowOnWrap(clientEngine);
+ checkBufferOverflowOnWrap(serverEngine);
+ checkBufferOverflowOnUnWrap(clientEngine, serverEngine);
+ checkBufferOverflowOnUnWrap(serverEngine, clientEngine);
+ checkBufferUnderflowOnUnWrap(serverEngine, clientEngine);
+ checkBufferUnderflowOnUnWrap(clientEngine, serverEngine);
+ }
+
+ private void checkBufferOverflowOnWrap(SSLEngine engine)
+ throws SSLException {
+ String mode = engine.getUseClientMode() ? "client"
+ : "server";
+ System.out.println("================================================="
+ + "===========");
+ System.out.println("Testing SSLEngine buffer overflow"
+ + " on wrap by " + mode);
+ ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+ //Making net buffer size less than required by 1 byte.
+ ByteBuffer net = ByteBuffer
+ .allocate(engine.getSession().getPacketBufferSize() - 1);
+ SSLEngineResult r = engine.wrap(app, net);
+ checkResult(r, SSLEngineResult.Status.BUFFER_OVERFLOW);
+ System.out.println("Passed");
+ }
+
+ private void checkBufferOverflowOnUnWrap(SSLEngine wrappingEngine,
+ SSLEngine unwrappingEngine)
+ throws SSLException {
+ String wrapperMode = wrappingEngine.getUseClientMode() ? "client"
+ : "server";
+ String unwrapperMode = unwrappingEngine.getUseClientMode() ? "client"
+ : "server";
+ if (wrapperMode.equals(unwrapperMode)) {
+ throw new Error("Test error: both engines are in the same mode!");
+ }
+ System.out.println("================================================="
+ + "===========");
+ System.out.println("Testing SSLEngine buffer overflow"
+ + " on unwrap by " + unwrapperMode);
+ ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+ ByteBuffer net = ByteBuffer
+ .allocate(wrappingEngine.getSession().getPacketBufferSize());
+ SSLEngineResult r = wrappingEngine.wrap(app, net);
+ checkResult(r, SSLEngineResult.Status.OK);
+ //Making app buffer size less than required by 1 byte.
+ app = ByteBuffer.allocate(MESSAGE.length() - 1);
+ net.flip();
+ r = unwrappingEngine.unwrap(net, app);
+ checkResult(r, SSLEngineResult.Status.BUFFER_OVERFLOW);
+ System.out.println("Passed");
+ }
+
+ private void checkBufferUnderflowOnUnWrap(SSLEngine wrappingEngine,
+ SSLEngine unwrappingEngine)
+ throws SSLException {
+ String wrapperMode = wrappingEngine.getUseClientMode() ? "client"
+ : "server";
+ String unwrapperMode = unwrappingEngine.getUseClientMode() ? "client"
+ : "server";
+ if (wrapperMode.equals(unwrapperMode)) {
+ throw new Error("Test error: both engines are in the same mode!");
+ }
+ System.out.println("================================================="
+ + "===========");
+ System.out.println("Testing SSLEngine buffer underflow"
+ + " on unwrap by " + unwrapperMode);
+ ByteBuffer app = ByteBuffer.wrap(MESSAGE.getBytes());
+ ByteBuffer net = ByteBuffer
+ .allocate(wrappingEngine.getSession().getPacketBufferSize());
+ SSLEngineResult r = wrappingEngine.wrap(app, net);
+ checkResult(r, SSLEngineResult.Status.OK);
+ app = ByteBuffer.allocate(unwrappingEngine.getSession()
+ .getApplicationBufferSize());
+ net.flip();
+ //Making net buffer size less than size of dtls message.
+ net.limit(net.limit() - 1);
+ r = unwrappingEngine.unwrap(net, app);
+ checkResult(r, SSLEngineResult.Status.BUFFER_UNDERFLOW);
+ System.out.println("Passed");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/DataExchangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngine application data exchange using each of the supported cipher
+ * suites.
+ */
+public class DataExchangeTest extends SSLEngineTestCase {
+
+ public static void main(String[] args) {
+ DataExchangeTest test = new DataExchangeTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ sendApplicationData(clientEngine, serverEngine);
+ sendApplicationData(serverEngine, clientEngine);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/EnginesClosureTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines closing using each of the supported cipher suites.
+ */
+public class EnginesClosureTest extends SSLEngineTestCase {
+
+ public static void main(String[] args) {
+ EnginesClosureTest test = new EnginesClosureTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ closingTest(cipher, true);
+ closingTest(cipher, false);
+ }
+
+ private void closingTest(String cipher, boolean clientCloses)
+ throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ if (clientCloses) {
+ closeEngines(clientEngine, serverEngine);
+ } else {
+ closeEngines(serverEngine, clientEngine);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/HandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines handshake using each of the supported cipher suites.
+ */
+public class HandshakeTest extends SSLEngineTestCase {
+
+ public static void main(String[] args) {
+ HandshakeTest test = new HandshakeTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/MFLNTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class MFLNTest extends SSLEngineTestCase {
+
+ public static void main(String[] args) {
+ setUpAndStartKDCIfNeeded();
+ System.setProperty("jsse.enableMFLNExtension", "true");
+ for (int mfl = 4096; mfl >= 256; mfl /= 2) {
+ System.out.println("=============================================="
+ + "==============");
+ System.out.printf("Testsing DTLS handshake with MFL = %d%n", mfl);
+ MFLNTest test = new MFLNTest(mfl);
+ test.runTests();
+ }
+ }
+
+ protected MFLNTest(int maxPacketSize) {
+ super(maxPacketSize);
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/NotEnabledRC4Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+
+/**
+ * Testing SSLEngines do not enable RC4 ciphers by default.
+ */
+public class NotEnabledRC4Test {
+
+ public static void main(String[] s) throws Exception {
+ SSLContext context = SSLEngineTestCase.getContext();
+ SSLEngine clientEngine = context.createSSLEngine();
+ clientEngine.setUseClientMode(true);
+ SSLEngine serverEngine = context.createSSLEngine();
+ serverEngine.setUseClientMode(false);
+ String[] cliEnabledCiphers = clientEngine.getEnabledCipherSuites();
+ rc4Test(cliEnabledCiphers, true);
+ String[] srvEnabledCiphers = serverEngine.getEnabledCipherSuites();
+ rc4Test(srvEnabledCiphers, false);
+ }
+
+ private static void rc4Test(String[] ciphers, boolean isClient) {
+ String mode = isClient ? "client" : "server";
+ for (String cipher : ciphers) {
+ if (cipher.contains("RC4")) {
+ throw new AssertionError("RC4 cipher " + cipher + " is enabled"
+ + " by default on " + mode + " SSLEngine,"
+ + " but it should not!");
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/RehandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class RehandshakeTest extends SSLEngineTestCase {
+
+ public static void main(String[] args) {
+ RehandshakeTest test = new RehandshakeTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.REHANDSHAKE_BEGIN_CLIENT);
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.REHANDSHAKE_BEGIN_SERVER);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/RehandshakeWithCipherChangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import java.util.Random;
+import jdk.testlibrary.RandomFactory;
+
+/**
+ * Testing SSLEngines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class RehandshakeWithCipherChangeTest extends SSLEngineTestCase {
+
+ public static void main(String[] s) {
+ RehandshakeWithCipherChangeTest test
+ = new RehandshakeWithCipherChangeTest();
+ test.runTests(Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS);
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ SSLEngine clientEngine = context.createSSLEngine();
+ clientEngine.setUseClientMode(true);
+ SSLEngine serverEngine = context.createSSLEngine();
+ serverEngine.setUseClientMode(false);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(
+ Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS.ciphers);
+ String randomCipher;
+ serverEngine.setNeedClientAuth(true);
+ long initialEpoch = 0;
+ long secondEpoch = 0;
+ SSLEngineResult r;
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ sendApplicationData(clientEngine, serverEngine);
+ r = sendApplicationData(serverEngine, clientEngine);
+ if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+ initialEpoch = r.sequenceNumber() >> 48;
+ }
+ final Random RNG = RandomFactory.getRandom();
+ randomCipher = Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS.ciphers[RNG
+ .nextInt(Ciphers.ENABLED_NON_KRB_NOT_ANON_CIPHERS.ciphers.length)];
+ clientEngine.setEnabledCipherSuites(new String[]{randomCipher});
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.REHANDSHAKE_BEGIN_CLIENT);
+ sendApplicationData(clientEngine, serverEngine);
+ r = sendApplicationData(serverEngine, clientEngine);
+ if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+ secondEpoch = r.sequenceNumber() >> 48;
+ AssertionError epochError = new AssertionError("Epoch number"
+ + " did not grow after re-handshake! "
+ + " Was " + initialEpoch + ", now " + secondEpoch + ".");
+ if (Long.compareUnsigned(secondEpoch, initialEpoch) <= 0) {
+ throw epochError;
+ }
+ }
+ closeEngines(clientEngine, serverEngine);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/RehandshakeWithDataExTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+
+/**
+ * Testing SSLEngines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class RehandshakeWithDataExTest extends SSLEngineTestCase {
+
+ public static void main(String[] args) {
+ RehandshakeWithDataExTest test = new RehandshakeWithDataExTest();
+ setUpAndStartKDCIfNeeded();
+ test.runTests();
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) throws SSLException {
+ SSLContext context = getContext();
+ int maxPacketSize = getMaxPacketSize();
+ boolean useSNI = !TEST_MODE.equals("norm");
+ SSLEngine clientEngine = getClientSSLEngine(context, useSNI);
+ SSLEngine serverEngine = getServerSSLEngine(context, useSNI);
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ serverEngine.setNeedClientAuth(!cipher.contains("anon"));
+ long initialEpoch = 0;
+ long secondEpoch = 0;
+ long thirdEpoch = 0;
+ SSLEngineResult r;
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.INITIAL_HANDSHAKE);
+ sendApplicationData(clientEngine, serverEngine);
+ r = sendApplicationData(serverEngine, clientEngine);
+ if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+ initialEpoch = r.sequenceNumber() >> 48;
+ }
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.REHANDSHAKE_BEGIN_CLIENT);
+ sendApplicationData(clientEngine, serverEngine);
+ r = sendApplicationData(serverEngine, clientEngine);
+ AssertionError epochError = new AssertionError("Epoch number"
+ + " did not grow after re-handshake! "
+ + " Was " + initialEpoch + ", now " + secondEpoch + ".");
+ if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+ secondEpoch = r.sequenceNumber() >> 48;
+ if (Long.compareUnsigned(secondEpoch, initialEpoch) <= 0) {
+ throw epochError;
+ }
+ }
+ doHandshake(clientEngine, serverEngine, maxPacketSize,
+ HandshakeMode.REHANDSHAKE_BEGIN_SERVER);
+ sendApplicationData(clientEngine, serverEngine);
+ r = sendApplicationData(serverEngine, clientEngine);
+ if (TESTED_SECURITY_PROTOCOL.contains("DTLS")) {
+ thirdEpoch = r.sequenceNumber() >> 48;
+ if (Long.compareUnsigned(thirdEpoch, secondEpoch) <= 0) {
+ throw epochError;
+ }
+ }
+ closeEngines(clientEngine, serverEngine);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/SSLEngineTestCase.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,1081 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SNIHostName;
+import javax.net.ssl.SNIMatcher;
+import javax.net.ssl.SNIServerName;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLParameters;
+import javax.net.ssl.TrustManagerFactory;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Basic class to inherit SSLEngine test cases from it. Tests apply for
+ * the TLS or DTLS security protocols and their versions.
+ */
+abstract public class SSLEngineTestCase {
+
+ public enum Ciphers {
+
+ /**
+ * Ciphers supported by the tested SSLEngine without those with kerberos
+ * authentication.
+ */
+ SUPPORTED_NON_KRB_CIPHERS(SSLEngineTestCase.SUPPORTED_NON_KRB_CIPHERS,
+ "Supported non kerberos"),
+ /**
+ * Ciphers supported by the tested SSLEngine without those with kerberos
+ * authentication and without those with SHA256 ans SHA384.
+ */
+ SUPPORTED_NON_KRB_NON_SHA_CIPHERS(SSLEngineTestCase.SUPPORTED_NON_KRB_NON_SHA_CIPHERS,
+ "Supported non kerberos non SHA256 and SHA384"),
+ /**
+ * Ciphers supported by the tested SSLEngine with kerberos authentication.
+ */
+ SUPPORTED_KRB_CIPHERS(SSLEngineTestCase.SUPPORTED_KRB_CIPHERS,
+ "Supported kerberos"),
+ /**
+ * Ciphers enabled by default for the tested SSLEngine without kerberos
+ * and anon.
+ */
+ ENABLED_NON_KRB_NOT_ANON_CIPHERS(
+ SSLEngineTestCase.ENABLED_NON_KRB_NOT_ANON_CIPHERS,
+ "Enabled by default non kerberos not anonymous"),
+ /**
+ * Ciphers unsupported by the tested SSLEngine.
+ */
+ UNSUPPORTED_CIPHERS(SSLEngineTestCase.UNSUPPORTED_CIPHERS,
+ "Unsupported");
+
+ Ciphers(String[] ciphers, String description) {
+ this.ciphers = ciphers;
+ this.description = description;
+ }
+
+ final String[] ciphers;
+ final String description;
+ }
+
+ /**
+ * Enumeration used to distinguish handshake mode in
+ * {@link SSLEngineTestCase#doHandshake(javax.net.ssl.SSLEngine,
+ * javax.net.ssl.SSLEngine, int, SSLEngineTestCase.HandshakeMode, boolean)
+ * SSLEngineTestCase.doHandshake} method.
+ */
+ public enum HandshakeMode {
+
+ /**
+ * Initial handshake done for the first time: both engines call
+ * {@link SSLEngine#beginHandshake()} method.
+ */
+ INITIAL_HANDSHAKE,
+ /**
+ * Repeated handshake done by client: client engine calls
+ * {@link SSLEngine#beginHandshake()} method.
+ */
+ REHANDSHAKE_BEGIN_CLIENT,
+ /**
+ * Repeated handshake done by server: server engine calls
+ * {@link SSLEngine#beginHandshake()} method.
+ */
+ REHANDSHAKE_BEGIN_SERVER;
+ }
+ /**
+ * Security protocol to be tested: "TLS" or "DTLS" or their versions,
+ * e.g. "TLSv1", "TLSv1.1", "TLSv1.2", "DTLSv1.0", "DTLSv1.2".
+ */
+ public static final String TESTED_SECURITY_PROTOCOL
+ = System.getProperty("test.security.protocol", "TLS");
+ /**
+ * Test mode: "norm", "norm_sni" or "krb".
+ * Modes "norm" and "norm_sni" are used to run
+ * with all supported non-kerberos ciphers.
+ * Mode "krb" is used to run with kerberos ciphers.
+ */
+ public static final String TEST_MODE
+ = System.getProperty("test.mode", "norm");
+
+ private static final String FS = System.getProperty("file.separator", "/");
+ private static final String PATH_TO_STORES = ".." + FS + "etc";
+ private static final String KEY_STORE_FILE = "keystore";
+ private static final String TRUST_STORE_FILE = "truststore";
+ private static final String PASSWD = "passphrase";
+
+ private static final String KEY_FILE_NAME
+ = System.getProperty("test.src", ".") + FS + PATH_TO_STORES
+ + FS + KEY_STORE_FILE;
+ private static final String TRUST_FILE_NAME
+ = System.getProperty("test.src", ".") + FS + PATH_TO_STORES
+ + FS + TRUST_STORE_FILE;
+
+ private static ByteBuffer net;
+ private static ByteBuffer netReplicatedClient;
+ private static ByteBuffer netReplicatedServer;
+ private static final int MAX_HANDSHAKE_LOOPS = 100;
+ private static final String EXCHANGE_MSG_SENT = "Hello, peer!";
+ private static boolean doUnwrapForNotHandshakingStatus;
+ private static boolean endHandshakeLoop = false;
+ private static final String TEST_SRC = System.getProperty("test.src", ".");
+ private static final String KTAB_FILENAME = "krb5.keytab.data";
+ private static final String KRB_REALM = "TEST.REALM";
+ private static final String KRBTGT_PRINCIPAL = "krbtgt/" + KRB_REALM;
+ private static final String KRB_USER = "USER";
+ private static final String KRB_USER_PASSWORD = "password";
+ private static final String KRB_USER_PRINCIPAL = KRB_USER + "@" + KRB_REALM;
+ private static final String KRB5_CONF_FILENAME = "krb5.conf";
+ private static final String PATH_TO_COMMON = ".." + FS + "TLSCommon";
+ private static final String JAAS_CONF_FILE = PATH_TO_COMMON
+ + FS + "jaas.conf";
+ private static final int DELAY = 1000;
+ private static final String HOST = "localhost";
+ private static final String SERVER_NAME = "service.localhost";
+ private static final String SNI_PATTERN = ".*";
+
+ private static final String[] SUPPORTED_NON_KRB_CIPHERS;
+
+ static {
+ try {
+ String[] allSupportedCiphers = getContext()
+ .createSSLEngine().getSupportedCipherSuites();
+ List<String> supportedCiphersList = new LinkedList<>();
+ for (String cipher : allSupportedCiphers) {
+ if (!cipher.contains("KRB5")
+ && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")) {
+ supportedCiphersList.add(cipher);
+ }
+ }
+ SUPPORTED_NON_KRB_CIPHERS = supportedCiphersList.toArray(new String[0]);
+ } catch (Exception ex) {
+ throw new Error("Unexpected issue", ex);
+ }
+ }
+
+ private static final String[] SUPPORTED_NON_KRB_NON_SHA_CIPHERS;
+
+ static {
+ try {
+ String[] allSupportedCiphers = getContext()
+ .createSSLEngine().getSupportedCipherSuites();
+ List<String> supportedCiphersList = new LinkedList<>();
+ for (String cipher : allSupportedCiphers) {
+ if (!cipher.contains("KRB5")
+ && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")
+ && !cipher.endsWith("_SHA256")
+ && !cipher.endsWith("_SHA384")) {
+ supportedCiphersList.add(cipher);
+ }
+ }
+ SUPPORTED_NON_KRB_NON_SHA_CIPHERS
+ = supportedCiphersList.toArray(new String[0]);
+ } catch (Exception ex) {
+ throw new Error("Unexpected issue", ex);
+ }
+ }
+
+ private static final String[] SUPPORTED_KRB_CIPHERS;
+
+ static {
+ try {
+ String[] allSupportedCiphers = getContext()
+ .createSSLEngine().getSupportedCipherSuites();
+ List<String> supportedCiphersList = new LinkedList<>();
+ for (String cipher : allSupportedCiphers) {
+ if (cipher.contains("KRB5")
+ && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")) {
+ supportedCiphersList.add(cipher);
+ }
+ }
+ SUPPORTED_KRB_CIPHERS = supportedCiphersList.toArray(new String[0]);
+ } catch (Exception ex) {
+ throw new Error("Unexpected issue", ex);
+ }
+ }
+
+ private static final String[] ENABLED_NON_KRB_NOT_ANON_CIPHERS;
+
+ static {
+ try {
+ SSLEngine temporary = getContext().createSSLEngine();
+ temporary.setUseClientMode(true);
+ String[] enabledCiphers = temporary.getEnabledCipherSuites();
+ List<String> enabledCiphersList = new LinkedList<>();
+ for (String cipher : enabledCiphers) {
+ if (!cipher.contains("anon") && !cipher.contains("KRB5")
+ && !cipher.contains("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")) {
+ enabledCiphersList.add(cipher);
+ }
+ }
+ ENABLED_NON_KRB_NOT_ANON_CIPHERS = enabledCiphersList.toArray(new String[0]);
+ } catch (Exception ex) {
+ throw new Error("Unexpected issue", ex);
+ }
+ }
+
+ private static final String[] UNSUPPORTED_CIPHERS = {
+ "SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA",
+ "SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA",
+ "SSL_DHE_DSS_WITH_RC4_128_SHA",
+ "SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA",
+ "SSL_DH_DSS_WITH_DES_CBC_SHA",
+ "SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA",
+ "SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA",
+ "SSL_DH_RSA_WITH_DES_CBC_SHA",
+ "SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA",
+ "SSL_FORTEZZA_DMS_WITH_NULL_SHA",
+ "SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA",
+ "SSL_RSA_EXPORT1024_WITH_RC4_56_SHA",
+ "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5",
+ "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA",
+ "SSL_RSA_FIPS_WITH_DES_CBC_SHA",
+ "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5",
+ "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA",
+ "TLS_KRB5_WITH_IDEA_CBC_MD5",
+ "TLS_KRB5_WITH_IDEA_CBC_SHA",
+ "SSL_RSA_WITH_IDEA_CBC_SHA",
+ "TLS_DH_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_DH_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_DH_DSS_WITH_AES_128_GCM_SHA256",
+ "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"
+ };
+
+ private final int maxPacketSize;
+
+ /**
+ * Constructs test case with the given MFLN maxMacketSize.
+ *
+ * @param maxPacketSize - MLFN extension max packet size.
+ */
+ public SSLEngineTestCase(int maxPacketSize) {
+ this.maxPacketSize = maxPacketSize;
+ }
+
+ /**
+ * Constructs test case with {@code maxPacketSize = 0}.
+ */
+ public SSLEngineTestCase() {
+ this.maxPacketSize = 0;
+ }
+
+ /**
+ * Wraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that wraps data.
+ * @param wrapper - Set wrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param maxPacketSize - Max packet size to check that MFLN extension works
+ * or zero for no check.
+ * @param app - Buffer with data to wrap.
+ * @return - Buffer with wrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+ int maxPacketSize, ByteBuffer app)
+ throws SSLException {
+ return doWrap(engine, wrapper, maxPacketSize,
+ app, SSLEngineResult.Status.OK, null);
+ }
+
+ /**
+ * Wraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that wraps data.
+ * @param wrapper - Set wrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param maxPacketSize - Max packet size to check that MFLN extension works
+ * or zero for no check.
+ * @param app - Buffer with data to wrap.
+ * @param result - Array which first element will be used to output wrap
+ * result object.
+ * @return - Buffer with wrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+ int maxPacketSize, ByteBuffer app,
+ SSLEngineResult[] result)
+ throws SSLException {
+ return doWrap(engine, wrapper, maxPacketSize,
+ app, SSLEngineResult.Status.OK, result);
+ }
+
+ /**
+ * Wraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that wraps data.
+ * @param wrapper - Set wrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param maxPacketSize - Max packet size to check that MFLN extension works
+ * or zero for no check.
+ * @param app - Buffer with data to wrap.
+ * @param wantedStatus - Specifies expected result status of wrapping.
+ * @return - Buffer with wrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+ int maxPacketSize, ByteBuffer app,
+ SSLEngineResult.Status wantedStatus)
+ throws SSLException {
+ return doWrap(engine, wrapper, maxPacketSize,
+ app, wantedStatus, null);
+ }
+
+ /**
+ * Wraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that wraps data.
+ * @param wrapper - Set wrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param maxPacketSize - Max packet size to check that MFLN extension works
+ * or zero for no check.
+ * @param app - Buffer with data to wrap.
+ * @param wantedStatus - Specifies expected result status of wrapping.
+ * @param result - Array which first element will be used to output wrap
+ * result object.
+ * @return - Buffer with wrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doWrap(SSLEngine engine, String wrapper,
+ int maxPacketSize, ByteBuffer app,
+ SSLEngineResult.Status wantedStatus,
+ SSLEngineResult[] result)
+ throws SSLException {
+ ByteBuffer net = ByteBuffer.allocate(engine.getSession()
+ .getPacketBufferSize());
+ SSLEngineResult r = engine.wrap(app, net);
+ net.flip();
+ int length = net.remaining();
+ System.out.println(wrapper + " wrapped " + length + " bytes.");
+ System.out.println(wrapper + " handshake status is "
+ + engine.getHandshakeStatus());
+ if (maxPacketSize < length && maxPacketSize != 0) {
+ throw new AssertionError("Handshake wrapped net buffer length "
+ + length + " exceeds maximum packet size "
+ + maxPacketSize);
+ }
+ checkResult(r, wantedStatus);
+ if (result != null && result.length > 0) {
+ result[0] = r;
+ }
+ return net;
+ }
+
+ /**
+ * Unwraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that unwraps data.
+ * @param unwrapper - Set unwrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param net - Buffer with data to unwrap.
+ * @return - Buffer with unwrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+ ByteBuffer net)
+ throws SSLException {
+ return doUnWrap(engine, unwrapper, net, SSLEngineResult.Status.OK, null);
+ }
+
+ /**
+ * Unwraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that unwraps data.
+ * @param unwrapper - Set unwrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param net - Buffer with data to unwrap.
+ * @param result - Array which first element will be used to output wrap
+ * result object.
+ * @return - Buffer with unwrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+ ByteBuffer net, SSLEngineResult[] result)
+ throws SSLException {
+ return doUnWrap(engine, unwrapper, net, SSLEngineResult.Status.OK, result);
+ }
+
+ /**
+ * Unwraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that unwraps data.
+ * @param unwrapper - Set unwrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param net - Buffer with data to unwrap.
+ * @param wantedStatus - Specifies expected result status of wrapping.
+ * @return - Buffer with unwrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+ ByteBuffer net,
+ SSLEngineResult.Status wantedStatus)
+ throws SSLException {
+ return doUnWrap(engine, unwrapper, net, wantedStatus, null);
+ }
+
+ /**
+ * Unwraps data with the specified engine.
+ *
+ * @param engine - SSLEngine that unwraps data.
+ * @param unwrapper - Set unwrapper id, e.g. "server" of "client". Used for
+ * logging only.
+ * @param net - Buffer with data to unwrap.
+ * @param wantedStatus - Specifies expected result status of wrapping.
+ * @param result - Array which first element will be used to output wrap
+ * result object.
+ * @return - Buffer with unwrapped data.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static ByteBuffer doUnWrap(SSLEngine engine, String unwrapper,
+ ByteBuffer net,
+ SSLEngineResult.Status wantedStatus,
+ SSLEngineResult[] result)
+ throws SSLException {
+ ByteBuffer app = ByteBuffer.allocate(engine.getSession()
+ .getApplicationBufferSize());
+ int length = net.remaining();
+ System.out.println(unwrapper + " unwrapping "
+ + length + " bytes...");
+ SSLEngineResult r = engine.unwrap(net, app);
+ app.flip();
+ System.out.println(unwrapper + " handshake status is "
+ + engine.getHandshakeStatus());
+ checkResult(r, wantedStatus);
+ if (result != null && result.length > 0) {
+ result[0] = r;
+ }
+ return app;
+ }
+
+ /**
+ * Does the handshake of the two specified engines according to the
+ * {@code mode} specified.
+ *
+ * @param clientEngine - Client SSLEngine.
+ * @param serverEngine - Server SSLEngine.
+ * @param maxPacketSize - Maximum packet size for MFLN of zero for no limit.
+ * @param mode - Handshake mode according to {@link HandshakeMode} enum.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static void doHandshake(SSLEngine clientEngine,
+ SSLEngine serverEngine,
+ int maxPacketSize, HandshakeMode mode)
+ throws SSLException {
+ doHandshake(clientEngine, serverEngine, maxPacketSize, mode, false);
+ }
+
+ /**
+ * Does the handshake of the two specified engines according to the
+ * {@code mode} specified.
+ *
+ * @param clientEngine - Client SSLEngine.
+ * @param serverEngine - Server SSLEngine.
+ * @param maxPacketSize - Maximum packet size for MFLN of zero for no limit.
+ * @param mode - Handshake mode according to {@link HandshakeMode} enum.
+ * @param enableReplicatedPacks - Set {@code true} to enable replicated
+ * packet sending.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static void doHandshake(SSLEngine clientEngine,
+ SSLEngine serverEngine, int maxPacketSize,
+ HandshakeMode mode,
+ boolean enableReplicatedPacks)
+ throws SSLException {
+ System.out.println("================================================="
+ + "===========");
+ System.out.println("Starting handshake " + mode.name());
+ int loop = 0;
+ if (maxPacketSize < 0) {
+ throw new Error("Test issue: maxPacketSize is less than zero!");
+ }
+ SSLParameters params = clientEngine.getSSLParameters();
+ params.setMaximumPacketSize(maxPacketSize);
+ clientEngine.setSSLParameters(params);
+ params = serverEngine.getSSLParameters();
+ params.setMaximumPacketSize(maxPacketSize);
+ serverEngine.setSSLParameters(params);
+ SSLEngine firstEngine;
+ SSLEngine secondEngine;
+ switch (mode) {
+ case INITIAL_HANDSHAKE:
+ firstEngine = clientEngine;
+ secondEngine = serverEngine;
+ doUnwrapForNotHandshakingStatus = false;
+ clientEngine.beginHandshake();
+ serverEngine.beginHandshake();
+ break;
+ case REHANDSHAKE_BEGIN_CLIENT:
+ firstEngine = clientEngine;
+ secondEngine = serverEngine;
+ doUnwrapForNotHandshakingStatus = true;
+ clientEngine.beginHandshake();
+ break;
+ case REHANDSHAKE_BEGIN_SERVER:
+ firstEngine = serverEngine;
+ secondEngine = clientEngine;
+ doUnwrapForNotHandshakingStatus = true;
+ serverEngine.beginHandshake();
+ break;
+ default:
+ throw new Error("Test issue: unknown handshake mode");
+ }
+ endHandshakeLoop = false;
+ while (!endHandshakeLoop) {
+ if (++loop > MAX_HANDSHAKE_LOOPS) {
+ throw new Error("Too much loops for handshaking");
+ }
+ System.out.println("==============================================");
+ System.out.println("Handshake loop " + loop);
+ SSLEngineResult.HandshakeStatus clientHSStatus
+ = clientEngine.getHandshakeStatus();
+ SSLEngineResult.HandshakeStatus serverHSStatus
+ = serverEngine.getHandshakeStatus();
+ System.out.println("Client handshake status "
+ + clientHSStatus.name());
+ System.out.println("Server handshake status "
+ + serverHSStatus.name());
+ handshakeProcess(firstEngine, secondEngine, maxPacketSize,
+ enableReplicatedPacks);
+ handshakeProcess(secondEngine, firstEngine, maxPacketSize,
+ enableReplicatedPacks);
+ }
+ }
+
+ /**
+ * Routine to send application data from one SSLEngine to another.
+ *
+ * @param fromEngine - Sending engine.
+ * @param toEngine - Receiving engine.
+ * @return - Result of unwrap method of the receiving engine.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static SSLEngineResult sendApplicationData(SSLEngine fromEngine,
+ SSLEngine toEngine)
+ throws SSLException {
+ String sender = null;
+ String reciever = null;
+ String excMsgSent = EXCHANGE_MSG_SENT;
+ if (fromEngine.getUseClientMode() && !toEngine.getUseClientMode()) {
+ sender = "Client";
+ reciever = "Server";
+ excMsgSent += " Client.";
+ } else if (toEngine.getUseClientMode() && !fromEngine.getUseClientMode()) {
+ sender = "Server";
+ reciever = "Client";
+ excMsgSent += " Server.";
+ } else {
+ throw new Error("Test issue: both engines are in the same mode");
+ }
+ System.out.println("================================================="
+ + "===========");
+ System.out.println("Trying to send application data from " + sender
+ + " to " + reciever);
+ ByteBuffer clientAppSent
+ = ByteBuffer.wrap(excMsgSent.getBytes());
+ net = doWrap(fromEngine, sender, 0, clientAppSent);
+ SSLEngineResult[] r = new SSLEngineResult[1];
+ ByteBuffer serverAppRecv = doUnWrap(toEngine, reciever, net, r);
+ byte[] serverAppRecvTrunc = Arrays.copyOf(serverAppRecv.array(),
+ serverAppRecv.limit());
+ String msgRecv = new String(serverAppRecvTrunc);
+ if (!msgRecv.equals(excMsgSent)) {
+ throw new AssertionError(sender + " to " + reciever
+ + ": application data"
+ + " has been altered while sending."
+ + " Message sent: " + "\"" + excMsgSent + "\"."
+ + " Message recieved: " + "\"" + msgRecv + "\".");
+ }
+ System.out.println("Successful sending application data from " + sender
+ + " to " + reciever);
+ return r[0];
+ }
+
+ /**
+ * Close engines by sending "close outbound" message from one SSLEngine to
+ * another.
+ *
+ * @param fromEngine - Sending engine.
+ * @param toEngine - Receiving engine.
+ * @throws SSLException - thrown on engine errors.
+ */
+ public static void closeEngines(SSLEngine fromEngine,
+ SSLEngine toEngine) throws SSLException {
+ String from = null;
+ String to = null;
+ ByteBuffer app;
+ if (fromEngine.getUseClientMode() && !toEngine.getUseClientMode()) {
+ from = "Client";
+ to = "Server";
+ } else if (toEngine.getUseClientMode() && !fromEngine.getUseClientMode()) {
+ from = "Server";
+ to = "Client";
+ } else {
+ throw new Error("Both engines are in the same mode");
+ }
+ System.out.println("=========================================================");
+ System.out.println("Trying to close engines from " + from + " to " + to);
+ // Sending close outbound request to peer
+ fromEngine.closeOutbound();
+ app = ByteBuffer.allocate(fromEngine.getSession().getApplicationBufferSize());
+ net = doWrap(fromEngine, from, 0, app, SSLEngineResult.Status.CLOSED);
+ doUnWrap(toEngine, to, net, SSLEngineResult.Status.CLOSED);
+ app = ByteBuffer.allocate(fromEngine.getSession().getApplicationBufferSize());
+ net = doWrap(toEngine, to, 0, app, SSLEngineResult.Status.CLOSED);
+ doUnWrap(fromEngine, from, net, SSLEngineResult.Status.CLOSED);
+ if (!toEngine.isInboundDone()) {
+ throw new AssertionError(from + " sent close request to " + to
+ + ", but " + to + "did not close inbound.");
+ }
+ // Executing close inbound
+ fromEngine.closeInbound();
+ app = ByteBuffer.allocate(fromEngine.getSession().getApplicationBufferSize());
+ net = doWrap(fromEngine, from, 0, app, SSLEngineResult.Status.CLOSED);
+ doUnWrap(toEngine, to, net, SSLEngineResult.Status.CLOSED);
+ if (!toEngine.isOutboundDone()) {
+ throw new AssertionError(from + "sent close request to " + to
+ + ", but " + to + "did not close outbound.");
+ }
+ System.out.println("Successful closing from " + from + " to " + to);
+ }
+
+ /**
+ * Runs the same test case for all given {@code ciphers}. Method counts all
+ * failures and throws {@code AssertionError} if one or more tests fail.
+ *
+ * @param ciphers - Ciphers that should be tested.
+ */
+ public void runTests(Ciphers ciphers) {
+ int total = ciphers.ciphers.length;
+ int failed = testSomeCiphers(ciphers);
+ if (failed > 0) {
+ throw new AssertionError("" + failed + " of " + total
+ + " tests failed!");
+ }
+ System.out.println("All tests passed!");
+ }
+
+ /**
+ * Runs test cases for ciphers defined by the test mode.
+ */
+ public void runTests() {
+ switch (TEST_MODE) {
+ case "norm":
+ case "norm_sni":
+ switch (TESTED_SECURITY_PROTOCOL) {
+ case "DTLSv1.0":
+ case "TLSv1":
+ case "TLSv1.1":
+ runTests(Ciphers.SUPPORTED_NON_KRB_NON_SHA_CIPHERS);
+ break;
+ default:
+ runTests(Ciphers.SUPPORTED_NON_KRB_CIPHERS);
+ }
+ break;
+ case "krb":
+ runTests(Ciphers.SUPPORTED_KRB_CIPHERS);
+ break;
+ default:
+ throw new Error("Test error: unexpected test mode: " + TEST_MODE);
+ }
+ }
+
+ /**
+ * Returns maxPacketSize value used for MFLN extension testing
+ *
+ * @return - MLFN extension max packet size.
+ */
+ public int getMaxPacketSize() {
+ return maxPacketSize;
+ }
+
+ /**
+ * Checks that status of result {@code r} is {@code wantedStatus}.
+ *
+ * @param r - Result.
+ * @param wantedStatus - Wanted status of the result.
+ * @throws AssertionError - if status or {@code r} is not
+ * {@code wantedStatus}.
+ */
+ public static void checkResult(SSLEngineResult r,
+ SSLEngineResult.Status wantedStatus) {
+ SSLEngineResult.Status rs = r.getStatus();
+ if (!rs.equals(wantedStatus)) {
+ throw new AssertionError("Unexpected status " + rs.name()
+ + ", should be " + wantedStatus.name());
+ }
+ }
+
+ /**
+ * Returns SSLContext with TESTED_SECURITY_PROTOCOL protocol and sets up keys.
+ *
+ * @return - SSLContext with a protocol specified by TESTED_SECURITY_PROTOCOL.
+ */
+ public static SSLContext getContext() {
+ try {
+ KeyStore ks = KeyStore.getInstance("JKS");
+ KeyStore ts = KeyStore.getInstance("JKS");
+ char[] passphrase = PASSWD.toCharArray();
+ try (FileInputStream keyFileStream = new FileInputStream(KEY_FILE_NAME)) {
+ ks.load(keyFileStream, passphrase);
+ }
+ try (FileInputStream trustFileStream = new FileInputStream(TRUST_FILE_NAME)) {
+ ts.load(trustFileStream, passphrase);
+ }
+ KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+ kmf.init(ks, passphrase);
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+ tmf.init(ts);
+ SSLContext sslCtx = SSLContext.getInstance(TESTED_SECURITY_PROTOCOL);
+ sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+ return sslCtx;
+ } catch (KeyStoreException | IOException | NoSuchAlgorithmException |
+ CertificateException | UnrecoverableKeyException |
+ KeyManagementException ex) {
+ throw new Error("Unexpected exception", ex);
+ }
+ }
+
+ /**
+ * Sets up and starts kerberos KDC server.
+ */
+ public static void setUpAndStartKDC() {
+ String servicePrincipal = "host/" + SERVER_NAME + "@" + KRB_REALM;
+ Map<String, String> principals = new HashMap<>();
+ principals.put(KRB_USER_PRINCIPAL, KRB_USER_PASSWORD);
+ principals.put(KRBTGT_PRINCIPAL, null);
+ principals.put(servicePrincipal, null);
+ System.setProperty("java.security.krb5.conf", KRB5_CONF_FILENAME);
+ startKDC(KRB_REALM, principals, KTAB_FILENAME);
+ System.setProperty("java.security.auth.login.config",
+ TEST_SRC + FS + JAAS_CONF_FILE);
+ System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
+ }
+
+ /**
+ * Sets up and starts kerberos KDC server if SSLEngineTestCase.TEST_MODE is "krb".
+ */
+ public static void setUpAndStartKDCIfNeeded() {
+ if (TEST_MODE.equals("krb")) {
+ setUpAndStartKDC();
+ }
+ }
+
+ /**
+ * Returns client ssl engine.
+ *
+ * @param context - SSLContext to get SSLEngine from.
+ * @param useSNI - flag used to enable or disable using SNI extension.
+ * Needed for Kerberos.
+ */
+ public static SSLEngine getClientSSLEngine(SSLContext context, boolean useSNI) {
+ SSLEngine clientEngine = context.createSSLEngine(HOST, 80);
+ clientEngine.setUseClientMode(true);
+ if (useSNI) {
+ SNIHostName serverName = new SNIHostName(SERVER_NAME);
+ List<SNIServerName> serverNames = new ArrayList<>();
+ serverNames.add(serverName);
+ SSLParameters params = clientEngine.getSSLParameters();
+ params.setServerNames(serverNames);
+ clientEngine.setSSLParameters(params);
+ }
+ return clientEngine;
+ }
+
+ /**
+ * Returns server ssl engine.
+ *
+ * @param context - SSLContext to get SSLEngine from.
+ * @param useSNI - flag used to enable or disable using SNI extension.
+ * Needed for Kerberos.
+ */
+ public static SSLEngine getServerSSLEngine(SSLContext context, boolean useSNI) {
+ SSLEngine serverEngine = context.createSSLEngine();
+ serverEngine.setUseClientMode(false);
+ if (useSNI) {
+ SNIMatcher matcher = SNIHostName.createSNIMatcher(SNI_PATTERN);
+ List<SNIMatcher> matchers = new ArrayList<>();
+ matchers.add(matcher);
+ SSLParameters params = serverEngine.getSSLParameters();
+ params.setSNIMatchers(matchers);
+ serverEngine.setSSLParameters(params);
+ }
+ return serverEngine;
+ }
+
+ /**
+ * Runs the test case for one cipher suite.
+ *
+ * @param cipher - Cipher suite name.
+ * @throws SSLException - If tests fails.
+ */
+ abstract protected void testOneCipher(String cipher)
+ throws SSLException;
+
+ /**
+ * Iterates through an array of ciphers and runs the same test case for
+ * every entry.
+ *
+ * @param ciphers - Array of cipher names.
+ * @return - Number of tests failed.
+ */
+ protected int testSomeCiphers(Ciphers ciphers) {
+ int failedNum = 0;
+ String description = ciphers.description;
+ System.out.println("==================================================="
+ + "=========");
+ System.out.println(description + " ciphers testing");
+ System.out.println("==================================================="
+ + "=========");
+ for (String cs : ciphers.ciphers) {
+ System.out.println("-----------------------------------------------"
+ + "-------------");
+ System.out.println("Testing cipher suite " + cs);
+ System.out.println("-----------------------------------------------"
+ + "-------------");
+ Throwable error = null;
+ try {
+ testOneCipher(cs);
+ } catch (Throwable t) {
+ error = t;
+ }
+ switch (ciphers) {
+ case SUPPORTED_NON_KRB_CIPHERS:
+ case SUPPORTED_NON_KRB_NON_SHA_CIPHERS:
+ case SUPPORTED_KRB_CIPHERS:
+ case ENABLED_NON_KRB_NOT_ANON_CIPHERS:
+ if (error != null) {
+ System.out.println("Test Failed: " + cs);
+ System.err.println("Test Exception for " + cs);
+ error.printStackTrace();
+ failedNum++;
+ } else {
+ System.out.println("Test Passed: " + cs);
+ }
+ break;
+ case UNSUPPORTED_CIPHERS:
+ if (error == null) {
+ System.out.println("Test Failed: " + cs);
+ System.err.println("Test for " + cs + " should have thrown"
+ + " IllegalArgumentException, but it has not!");
+ failedNum++;
+ } else if (!(error instanceof IllegalArgumentException)) {
+ System.out.println("Test Failed: " + cs);
+ System.err.println("Test Exception for " + cs);
+ error.printStackTrace();
+ failedNum++;
+ } else {
+ System.out.println("Test Passed: " + cs);
+ }
+ break;
+ default:
+ throw new Error("Test issue: unexpected ciphers: "
+ + ciphers.name());
+ }
+ }
+ return failedNum;
+ }
+
+ /**
+ * Method used for the handshake routine.
+ *
+ * @param wrapingEngine - Engine that is expected to wrap data.
+ * @param unwrapingEngine - Engine that is expected to unwrap data.
+ * @param maxPacketSize - Maximum packet size for MFLN of zero for no limit.
+ * @param enableReplicatedPacks - Set {@code true} to enable replicated
+ * packet sending.
+ * @throws SSLException - thrown on engine errors.
+ */
+ private static void handshakeProcess(SSLEngine wrapingEngine,
+ SSLEngine unwrapingEngine,
+ int maxPacketSize,
+ boolean enableReplicatedPacks)
+ throws SSLException {
+ SSLEngineResult.HandshakeStatus wrapingHSStatus = wrapingEngine
+ .getHandshakeStatus();
+ SSLEngineResult.HandshakeStatus unwrapingHSStatus = unwrapingEngine
+ .getHandshakeStatus();
+ SSLEngineResult r;
+ String wrapper, unwrapper;
+ if (wrapingEngine.getUseClientMode()
+ && !unwrapingEngine.getUseClientMode()) {
+ wrapper = "Client";
+ unwrapper = "Server";
+ } else if (unwrapingEngine.getUseClientMode()
+ && !wrapingEngine.getUseClientMode()) {
+ wrapper = "Server";
+ unwrapper = "Client";
+ } else {
+ throw new Error("Both engines are in the same mode");
+ }
+ switch (wrapingHSStatus) {
+ case NEED_WRAP:
+ if (enableReplicatedPacks) {
+ if (net != null) {
+ net.flip();
+ if (net.remaining() != 0) {
+ if (wrapingEngine.getUseClientMode()) {
+ netReplicatedServer = net;
+ } else {
+ netReplicatedClient = net;
+ }
+ }
+ }
+ }
+ ByteBuffer app = ByteBuffer.allocate(wrapingEngine.getSession()
+ .getApplicationBufferSize());
+ net = doWrap(wrapingEngine, wrapper, maxPacketSize, app);
+ case NOT_HANDSHAKING:
+ switch (unwrapingHSStatus) {
+ case NEED_TASK:
+ runDelegatedTasks(unwrapingEngine);
+ case NEED_UNWRAP:
+ doUnWrap(unwrapingEngine, unwrapper, net);
+ if (enableReplicatedPacks) {
+ System.out.println("Unwrapping replicated packet...");
+ if (unwrapingEngine.getHandshakeStatus()
+ .equals(SSLEngineResult.HandshakeStatus.NEED_TASK)) {
+ runDelegatedTasks(unwrapingEngine);
+ }
+ runDelegatedTasks(unwrapingEngine);
+ ByteBuffer netReplicated;
+ if (unwrapingEngine.getUseClientMode()) {
+ netReplicated = netReplicatedClient;
+ } else {
+ netReplicated = netReplicatedServer;
+ }
+ if (netReplicated != null) {
+ doUnWrap(unwrapingEngine, unwrapper, netReplicated);
+ } else {
+ net.flip();
+ doUnWrap(unwrapingEngine, unwrapper, net);
+ }
+ }
+ break;
+ case NEED_UNWRAP_AGAIN:
+ break;
+ case NOT_HANDSHAKING:
+ if (doUnwrapForNotHandshakingStatus) {
+ doUnWrap(unwrapingEngine, unwrapper, net);
+ doUnwrapForNotHandshakingStatus = false;
+ break;
+ } else {
+ endHandshakeLoop = true;
+ }
+ break;
+ default:
+ throw new Error("Unexpected unwraping engine handshake status "
+ + unwrapingHSStatus.name());
+ }
+ break;
+ case NEED_UNWRAP:
+ break;
+ case NEED_UNWRAP_AGAIN:
+ net.flip();
+ doUnWrap(wrapingEngine, wrapper, net);
+ break;
+ case NEED_TASK:
+ runDelegatedTasks(wrapingEngine);
+ break;
+ default:
+ throw new Error("Unexpected wraping engine handshake status "
+ + wrapingHSStatus.name());
+ }
+ }
+
+ private static void runDelegatedTasks(SSLEngine engine) {
+ Runnable runnable;
+ System.out.println("Running delegated tasks...");
+ while ((runnable = engine.getDelegatedTask()) != null) {
+ runnable.run();
+ }
+ SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus();
+ if (hs == SSLEngineResult.HandshakeStatus.NEED_TASK) {
+ throw new Error("Handshake shouldn't need additional tasks.");
+ }
+ }
+
+ /**
+ * Start a KDC server:
+ * - create a KDC instance
+ * - create Kerberos principals
+ * - save Kerberos configuration
+ * - save keys to keytab file
+ * - no pre-auth is required
+ */
+ private static void startKDC(String realm, Map<String, String> principals,
+ String ktab) {
+ try {
+ KDC kdc = KDC.create(realm, HOST, 0, true);
+ kdc.setOption(KDC.Option.PREAUTH_REQUIRED, Boolean.FALSE);
+ if (principals != null) {
+ principals.entrySet().stream().forEach((entry) -> {
+ String name = entry.getKey();
+ String password = entry.getValue();
+ if (password == null || password.isEmpty()) {
+ System.out.println("KDC: add a principal '" + name
+ + "' with a random password");
+ kdc.addPrincipalRandKey(name);
+ } else {
+ System.out.println("KDC: add a principal '" + name
+ + "' with '" + password + "' password");
+ kdc.addPrincipal(name, password.toCharArray());
+ }
+ });
+ }
+ KDC.saveConfig(KRB5_CONF_FILENAME, kdc);
+ if (ktab != null) {
+ File ktabFile = new File(ktab);
+ if (ktabFile.exists()) {
+ System.out.println("KDC: append keys to an exising "
+ + "keytab file " + ktab);
+ kdc.appendKtab(ktab);
+ } else {
+ System.out.println("KDC: create a new keytab file "
+ + ktab);
+ kdc.writeKtab(ktab);
+ }
+ }
+ System.out.println("KDC: started on " + HOST + ":" + kdc.getPort()
+ + " with '" + realm + "' realm");
+ } catch (Exception e) {
+ throw new RuntimeException("KDC: unexpected exception", e);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/UnsupportedCiphersTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+
+/**
+ * Testing that try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class UnsupportedCiphersTest extends SSLEngineTestCase {
+
+ public static void main(String[] s) {
+ UnsupportedCiphersTest test = new UnsupportedCiphersTest();
+ test.runTests(Ciphers.UNSUPPORTED_CIPHERS);
+ }
+
+ @Override
+ protected void testOneCipher(String cipher) {
+ unsupTest(cipher, true);
+ unsupTest(cipher, false);
+ }
+
+ private void unsupTest(String cipher, boolean clientTest) {
+ SSLContext context = getContext();
+ SSLEngine clientEngine = context.createSSLEngine();
+ clientEngine.setUseClientMode(true);
+ SSLEngine serverEngine = context.createSSLEngine();
+ serverEngine.setUseClientMode(false);
+ if (clientTest) {
+ clientEngine.setEnabledCipherSuites(new String[]{cipher});
+ } else {
+ serverEngine.setEnabledCipherSuites(new String[]{cipher});
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSCommon/jaas.conf Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,17 @@
+com.sun.net.ssl.client {
+ com.sun.security.auth.module.Krb5LoginModule required
+ principal="USER@TEST.REALM"
+ doNotPrompt=true
+ useKeyTab=true
+ keyTab="krb5.keytab.data";
+};
+
+com.sun.net.ssl.server {
+ com.sun.security.auth.module.Krb5LoginModule required
+ principal="host/service.localhost@TEST.REALM"
+ isInitiator=false
+ useKeyTab=true
+ keyTab="krb5.keytab.data"
+ storeKey=true;
+};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSDataExchangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS application data exchange using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSDataExchangeTest
+ */
+
+/**
+ * Testing TLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class TLSDataExchangeTest {
+ public static void main(String[] args) {
+ DataExchangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSEnginesClosureTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines closing using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSEnginesClosureTest
+ */
+
+/**
+ * Testing TLS engines closing using each of the supported cipher suites.
+ */
+public class TLSEnginesClosureTest {
+ public static void main(String[] args) {
+ EnginesClosureTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSHandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSHandshakeTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites.
+ */
+public class TLSHandshakeTest {
+ public static void main(String[] args) {
+ HandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSMFLNTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ * cipher suites with different maximum fragment length. Testing of
+ * MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSMFLNTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class TLSMFLNTest {
+ public static void main(String[] args) {
+ MFLNTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSNotEnabledRC4Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 TLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class TLSNotEnabledRC4Test {
+ public static void main(String[] args) throws Exception {
+ NotEnabledRC4Test.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSRehandshakeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class TLSRehandshakeTest {
+ public static void main(String[] args) {
+ RehandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithCipherChangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking with cipher change. New cipher
+ * is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 TLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class TLSRehandshakeWithCipherChangeTest {
+ public static void main(String[] args) {
+ RehandshakeWithCipherChangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSRehandshakeWithDataExTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ * cipher suites with application data exchange before and after
+ * re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1 -Dtest.mode=krb TLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class TLSRehandshakeWithDataExTest {
+ public static void main(String[] args) {
+ RehandshakeWithDataExTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv1/TLSUnsupportedCiphersTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing that try to enable unsupported ciphers
+ * causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1 TLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class TLSUnsupportedCiphersTest {
+ public static void main(String[] args) {
+ UnsupportedCiphersTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSDataExchangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS application data exchange using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSDataExchangeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSDataExchangeTest
+ */
+
+/**
+ * Testing TLS application data exchange using each of the supported cipher
+ * suites.
+ */
+public class TLSDataExchangeTest {
+ public static void main(String[] args) {
+ DataExchangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSEnginesClosureTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines closing using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSEnginesClosureTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSEnginesClosureTest
+ */
+
+/**
+ * Testing TLS engines closing using each of the supported cipher suites.
+ */
+public class TLSEnginesClosureTest {
+ public static void main(String[] args) {
+ EnginesClosureTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSHandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSHandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSHandshakeTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites.
+ */
+public class TLSHandshakeTest {
+ public static void main(String[] args) {
+ HandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSMFLNTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines handshake using each of the supported
+ * cipher suites with different maximum fragment length. Testing of
+ * MFLN extension.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSMFLNTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSMFLNTest
+ */
+
+/**
+ * Testing TLS engines handshake using each of the supported cipher suites with
+ * different maximum fragment length. Testing of MFLN extension.
+ */
+public class TLSMFLNTest {
+ public static void main(String[] args) {
+ MFLNTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSNotEnabledRC4Test.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines do not enable RC4 ciphers by default.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSNotEnabledRC4Test
+ */
+
+/**
+ * Testing DTLS engines do not enable RC4 ciphers by default.
+ */
+public class TLSNotEnabledRC4Test {
+ public static void main(String[] args) throws Exception {
+ NotEnabledRC4Test.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ * cipher suites.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSRehandshakeTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSRehandshakeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher
+ * suites.
+ */
+public class TLSRehandshakeTest {
+ public static void main(String[] args) {
+ RehandshakeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithCipherChangeTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking with cipher change. New cipher
+ * is taken randomly from the supporetd ciphers list.
+ * @key randomness
+ * @library /sun/security/krb5/auto /lib/testlibrary /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSRehandshakeWithCipherChangeTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking with cipher change. New cipher is taken
+ * randomly from the supported ciphers list.
+ */
+public class TLSRehandshakeWithCipherChangeTest {
+ public static void main(String[] args) {
+ RehandshakeWithCipherChangeTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSRehandshakeWithDataExTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing TLS engines re-handshaking using each of the supported
+ * cipher suites with application data exchange before and after
+ * re-handshake and closing of the engines.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=norm_sni TLSRehandshakeWithDataExTest
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 -Dtest.mode=krb TLSRehandshakeWithDataExTest
+ */
+
+/**
+ * Testing TLS engines re-handshaking using each of the supported cipher suites
+ * with application data exchange before and after re-handshake and closing of
+ * the engines.
+ */
+public class TLSRehandshakeWithDataExTest {
+ public static void main(String[] args) {
+ RehandshakeWithDataExTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/TLSv11/TLSUnsupportedCiphersTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8085979
+ * @summary Testing that try to enable unsupported ciphers
+ * causes IllegalArgumentException.
+ * @library /sun/security/krb5/auto /javax/net/ssl/TLSCommon
+ * @run main/othervm -Dtest.security.protocol=TLSv1.1 TLSUnsupportedCiphersTest
+ */
+
+/**
+ * Testing that a try to enable unsupported ciphers causes IllegalArgumentException.
+ */
+public class TLSUnsupportedCiphersTest {
+ public static void main(String[] args) {
+ UnsupportedCiphersTest.main(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/security/auth/kerberos/DelegationPermissionCollection.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for DelegationPermissionCollection subclass
+ */
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+import javax.security.auth.kerberos.DelegationPermission;
+
+public class DelegationPermissionCollection {
+
+ private static final String FOO = "\"host/foo.example.com@EXAMPLE.COM\"";
+ private static final String BAR = "\"host/bar.example.com@EXAMPLE.COM\"";
+ private static final String TGT = "\"krbtgt/EXAMPLE.COM@EXAMPLE.COM\"";
+
+ public static void main(String[] args) throws Exception {
+
+ int testFail = 0;
+
+ DelegationPermission perm = new DelegationPermission(FOO + " " + TGT);
+ PermissionCollection perms = perm.newPermissionCollection();
+
+ // test 1
+ System.out.println
+ ("test 1: add throws IllegalArgException for wrong perm type");
+ try {
+ perms.add(new SecurityPermission("createAccessControlContext"));
+ System.err.println("Expected IllegalArgumentException");
+ testFail++;
+ } catch (IllegalArgumentException iae) {}
+
+ // test 2
+ System.out.println("test 2: implies returns false for wrong perm type");
+ if (perms.implies(new SecurityPermission("getPolicy"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 3
+ System.out.println("test 3: implies returns true for match on name");
+ perms.add(new DelegationPermission(FOO + " " + TGT));
+ if (!perms.implies(new DelegationPermission(FOO + " " + TGT))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 4
+ System.out.println
+ ("test 4: implies returns false for non-match on name");
+ if (perms.implies(new DelegationPermission(BAR + " " + TGT))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 5
+ System.out.println("test 5: elements returns correct number of perms");
+ int numPerms = 0;
+ Enumeration<Permission> e = perms.elements();
+ while (e.hasMoreElements()) {
+ numPerms++;
+ System.out.println(e.nextElement());
+ }
+ if (numPerms != 1) {
+ System.err.println("Expected 1, got " + numPerms);
+ testFail++;
+ }
+
+ if (testFail > 0) {
+ throw new Exception(testFail + " test(s) failed");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/security/auth/kerberos/ServicePermissionCollection.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8056179
+ * @summary Unit test for ServicePermissionCollection subclass
+ */
+
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.SecurityPermission;
+import java.util.Enumeration;
+import javax.security.auth.kerberos.ServicePermission;
+
+public class ServicePermissionCollection {
+
+ private static final String FOO = "host/foo.example.com@EXAMPLE.COM";
+ private static final String BAR = "host/bar.example.com@EXAMPLE.COM";
+ private static final String BAZ = "host/baz.example.com@EXAMPLE.COM";
+
+ public static void main(String[] args) throws Exception {
+
+ int testFail = 0;
+
+ ServicePermission perm = new ServicePermission(FOO, "accept");
+ PermissionCollection perms = perm.newPermissionCollection();
+
+ // test 1
+ System.out.println
+ ("test 1: add throws IllegalArgExc for wrong permission type");
+ try {
+ perms.add(new SecurityPermission("createAccessControlContext"));
+ System.err.println("Expected IllegalArgumentException");
+ testFail++;
+ } catch (IllegalArgumentException iae) {}
+
+ // test 2
+ System.out.println("test 2: implies returns false for wrong perm type");
+ if (perms.implies(new SecurityPermission("getPolicy"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 3
+ System.out.println
+ ("test 3: implies returns true for match on name and action");
+ perms.add(new ServicePermission(FOO, "accept"));
+ if (!perms.implies(new ServicePermission(FOO, "accept"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 4
+ System.out.println
+ ("test 4: implies returns false for match on name but not action");
+ if (perms.implies(new ServicePermission(FOO, "initiate"))) {
+ System.err.println("Expected false, returned true");
+ testFail++;
+ }
+
+ // test 5
+ System.out.println("test 5: implies returns true for match on " +
+ "name and subset of actions");
+ perms.add(new ServicePermission(BAR, "accept, initiate"));
+ if (!perms.implies(new ServicePermission(BAR, "accept"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 6
+ System.out.println("test 6: implies returns false for aggregate " +
+ "match on name and action");
+ perms.add(new ServicePermission(BAZ, "accept"));
+ perms.add(new ServicePermission(BAZ, "initiate"));
+ if (!perms.implies(new ServicePermission(BAZ, "initiate"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+ if (!perms.implies(new ServicePermission(BAZ, "initiate, accept"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 7
+ System.out.println("test 7: implies returns true for wildcard " +
+ "match on name and action");
+ perms.add(new ServicePermission("*", "initiate"));
+ if (!perms.implies(new ServicePermission("Duke", "initiate"))) {
+ System.err.println("Expected true, returned false");
+ testFail++;
+ }
+
+ // test 8
+ System.out.println("test 8: elements returns correct number of perms");
+ int numPerms = 0;
+ Enumeration<Permission> e = perms.elements();
+ while (e.hasMoreElements()) {
+ numPerms++;
+ System.out.println(e.nextElement());
+ }
+ // the 2 FOO permissions and the 2 BAZ permisssions
+ // are combined into one
+ if (numPerms != 4) {
+ System.err.println("Expected 4, got " + numPerms);
+ testFail++;
+ }
+
+ if (testFail > 0) {
+ throw new Exception(testFail + " test(s) failed");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JOptionPane/8081019/bug8081019.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.awt.Frame;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @test
+ * @bug 8081019
+ * @summary Check peer to null in CPlatformWindow.checkZoom() method
+ * @author Alexandr Scherbatiy
+ */
+public class bug8081019 {
+
+ private static final String RUN_PROCESS = "RUN_PROCESS";
+ private static final String RUN_TEST = "RUN_TEST";
+
+ public static void main(String[] args) throws Exception {
+ String command = RUN_PROCESS;
+
+ if (0 < args.length) {
+ command = args[0];
+ }
+
+ switch (command) {
+ case RUN_PROCESS:
+ runProcess();
+ break;
+ case RUN_TEST:
+ runTest();
+ break;
+ default:
+ throw new RuntimeException("Unknown command: " + command);
+ }
+ }
+
+ private static void runTest() throws Exception {
+ System.setSecurityManager(new SecurityManager());
+ Frame f = new Frame("Test frame");
+ f.setVisible(true);
+ f.setVisible(false);
+ f.dispose();
+ }
+
+ private static void runProcess() throws Exception {
+ String javaPath = System.getProperty("java.home", "");
+ String command = javaPath + File.separator + "bin" + File.separator + "java"
+ + " " + bug8081019.class.getName() + " " + RUN_TEST;
+
+ Process process = Runtime.getRuntime().exec(command);
+ boolean processExit = process.waitFor(20, TimeUnit.SECONDS);
+
+ dumpStream(process.getErrorStream(), "error stream");
+ dumpStream(process.getInputStream(), "input stream");
+
+ if (!processExit) {
+ process.destroy();
+ throw new RuntimeException(""
+ + "The sub process has not exited!");
+ }
+ }
+
+ public static void dumpStream(InputStream in, String name) throws IOException {
+ System.out.println("--- dump " + name + " ---");
+ String tempString;
+ int count = in.available();
+ boolean exception = false;
+ while (count > 0) {
+ byte[] b = new byte[count];
+ in.read(b);
+ tempString = new String(b);
+ if (!exception) {
+ exception = tempString.indexOf("Exception") != -1
+ || tempString.indexOf("Error") != -1;
+ }
+ System.out.println(tempString);
+ count = in.available();
+ }
+
+ if (exception) {
+ throw new RuntimeException("Exception in the output!");
+ }
+ }
+}
\ No newline at end of file
--- a/jdk/test/javax/swing/plaf/nimbus/8041642/bug8041642.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/javax/swing/plaf/nimbus/8041642/bug8041642.java Thu Jun 25 07:13:27 2015 +0000
@@ -22,7 +22,7 @@
*/
/* @test
- @bug 8041642
+ @bug 8041642 8079450
@summary Incorrect paint of JProgressBar in Nimbus LF
@author Semyon Sadetsky
*/
@@ -63,6 +63,7 @@
}
});
final Robot robot = new Robot();
+ robot.delay(100);
Color color = robot.getPixelColor(point.x + 1, point.y + 7);
System.out.println(color);
if (color.getGreen() < 150 || color.getBlue() > 30 ||
--- a/jdk/test/lib/security/CheckBlacklistedCerts.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/lib/security/CheckBlacklistedCerts.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -69,7 +69,9 @@
};
// Is this an OPENJDK build?
- if (!new File(home, "lib/security/local_policy.jar").exists()) {
+ String prop = System.getProperty("java.runtime.name");
+ if (prop != null && prop.startsWith("OpenJDK")) {
+ System.out.println("This is a OpenJDK build.");
blacklists = Arrays.copyOf(blacklists, 1);
}
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/Utils.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/Utils.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 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
@@ -25,9 +25,6 @@
import static jdk.testlibrary.Asserts.assertTrue;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
@@ -40,6 +37,7 @@
import java.util.regex.Matcher;
import java.util.concurrent.TimeUnit;
import java.util.function.BooleanSupplier;
+import java.util.function.Function;
/**
* Common library for various test helper functions.
@@ -326,4 +324,38 @@
}
return condition.getAsBoolean();
}
+
+ /**
+ * Interface same as java.lang.Runnable but with
+ * method {@code run()} able to throw any Throwable.
+ */
+ public static interface ThrowingRunnable {
+ void run() throws Throwable;
+ }
+
+ /**
+ * Filters out an exception that may be thrown by the given
+ * test according to the given filter.
+ *
+ * @param test - method that is invoked and checked for exception.
+ * @param filter - function that checks if the thrown exception matches
+ * criteria given in the filter's implementation.
+ * @return - exception that matches the filter if it has been thrown or
+ * {@code null} otherwise.
+ * @throws Throwable - if test has thrown an exception that does not
+ * match the filter.
+ */
+ public static Throwable filterException(ThrowingRunnable test,
+ Function<Throwable, Boolean> filter) throws Throwable {
+ try {
+ test.run();
+ } catch (Throwable t) {
+ if (filter.apply(t)) {
+ return t;
+ } else {
+ throw t;
+ }
+ }
+ return null;
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/lib/testlibrary/jsr292/com/oracle/testlibrary/jsr292/CodeCacheOverflowProcessor.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.testlibrary.jsr292;
+
+import jdk.testlibrary.Utils;
+
+/**
+ * Helper class used to catch and process VirtualMachineError with message "Out
+ * of space in CodeCache". Some JSR292 tests run out of code cache size, so code
+ * cache overflows and VME is thrown. This VME is considered as non-critical in
+ * some JSR292 tests, so it should be processed to prevent test failure.
+ */
+public class CodeCacheOverflowProcessor {
+
+ /**
+ * Checks if an instance of Throwable is caused by VirtualMachineError with
+ * message "Out of space in CodeCache". May be used as filter in method
+ * {@code jdk.testlibrary.Utils.filterException}.
+ *
+ * @param t - Throwable to check.
+ * @return true if Throwable is caused by VME, false otherwise.
+ */
+ public static Boolean isThrowableCausedByVME(Throwable t) {
+ Throwable causeOfT = t;
+ do {
+ if (causeOfT instanceof VirtualMachineError
+ && causeOfT.getMessage().matches(".*[Oo]ut of space"
+ + " in CodeCache.*")) {
+ return true;
+ }
+ causeOfT = causeOfT != null ? causeOfT.getCause() : null;
+ } while (causeOfT != null && causeOfT != t);
+ return false;
+ }
+
+ /**
+ * Checks if the given test throws an exception caused by
+ * VirtualMachineError with message "Out of space in CodeCache", and, if VME
+ * takes place, processes it so that no exception is thrown, and prints its
+ * stack trace. If test throws exception not caused by VME, this method just
+ * re-throws this exception.
+ *
+ * @param test - test to check for and process VirtualMachineError.
+ * @return - an exception caused by VME or null
+ * if test has thrown no exception.
+ * @throws Throwable - if test has thrown an exception
+ * that is not caused by VME.
+ */
+ public static Throwable runMHTest(Utils.ThrowingRunnable test) throws Throwable {
+ Throwable t = Utils.filterException(test::run,
+ CodeCacheOverflowProcessor::isThrowableCausedByVME);
+ if (t != null) {
+ System.err.printf("%nNon-critical exception caught becuse of"
+ + " code cache size is not enough to run all test cases.%n%n");
+ t.printStackTrace();
+ }
+ return t;
+ }
+}
--- a/jdk/test/sun/text/resources/LocaleData Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/sun/text/resources/LocaleData Thu Jun 25 07:13:27 2015 +0000
@@ -5414,11 +5414,13 @@
FormatData/en_SG/TimePatterns/1=h:mm:ss a z
FormatData/en_SG/TimePatterns/2=h:mm:ss a
FormatData/en_SG/TimePatterns/3=h:mm a
-FormatData/en_SG/DatePatterns/0=EEEE, MMMM d, yyyy
-FormatData/en_SG/DatePatterns/1=MMMM d, yyyy
-FormatData/en_SG/DatePatterns/2=MMM d, yyyy
-FormatData/en_SG/DatePatterns/3=M/d/yy
FormatData/en_SG/DateTimePatterns/0={1} {0}
+# bug# 8080774
+# Day should precede month for all date formats in en_SG - CLDR 27.0.0
+FormatData/en_SG/DatePatterns/0=EEEE, d MMMM, yyyy
+FormatData/en_SG/DatePatterns/1=d MMMM, yyyy
+FormatData/en_SG/DatePatterns/2=d MMM, yyyy
+FormatData/en_SG/DatePatterns/3=d/M/yy
# Use approved data
FormatData/ms/Eras/0=BCE
FormatData/ms/Eras/1=CE
--- a/jdk/test/sun/text/resources/LocaleDataTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -36,7 +36,7 @@
* 6919624 6998391 7019267 7020960 7025837 7020583 7036905 7066203 7101495
* 7003124 7085757 7028073 7171028 7189611 8000983 7195759 8004489 8006509
* 7114053 7074882 7040556 8013836 8021121 6192407 6931564 8027695 8017142
- * 8037343 8055222 8042126 8074791 8075173
+ * 8037343 8055222 8042126 8074791 8075173 8080774
* @summary Verify locale data
*
*/
--- a/jdk/test/sun/tools/jmap/heapconfig/JMapHeapConfigTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/sun/tools/jmap/heapconfig/JMapHeapConfigTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -21,25 +21,29 @@
* questions.
*/
-/*
- * @test
- * @bug 8042397
- * @summary Unit test for jmap utility test heap configuration reader
- * @library /lib/testlibrary
- * @modules java.management
- * @build jdk.testlibrary.*
- * @build JMapHeapConfigTest LingeredApp TmtoolTestScenario
- * @run main JMapHeapConfigTest
- */
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+
+import jdk.test.lib.apps.LingeredApp;
import jdk.testlibrary.Utils;
import jdk.testlibrary.Platform;
+/*
+ * @test
+ * @bug 8042397
+ * @summary Unit test for jmap utility test heap configuration reader
+ * @library /../../test/lib/share/classes
+ * @library /lib/testlibrary
+ * @modules java.management
+ * @build jdk.testlibrary.*
+ * @build jdk.test.lib.apps.*
+ * @build JMapHeapConfigTest TmtoolTestScenario
+ * @run main JMapHeapConfigTest
+ */
public class JMapHeapConfigTest {
static final String expectedJMapValues[] = {
--- a/jdk/test/sun/tools/jmap/heapconfig/LingeredApp.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,431 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-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;
-import java.nio.file.attribute.FileTime;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-/**
- * This is a framework to launch an app that could be synchronized with caller
- * to make further attach actions reliable across supported platforms
-
- * Caller example:
- * SmartTestApp a = SmartTestApp.startApp(cmd);
- * // do something
- * a.stopApp();
- *
- * or fine grained control
- *
- * a = new SmartTestApp("MyLock.lck");
- * a.createLock();
- * a.runApp();
- * a.waitAppReady();
- * // do something
- * a.deleteLock();
- * a.waitAppTerminate();
- *
- * Then you can work with app output and process object
- *
- * output = a.getAppOutput();
- * process = a.getProcess();
- *
- */
-public class LingeredApp {
-
- private static final long spinDelay = 1000;
-
- private final String lockFileName;
- private long lockCreationTime;
- private Process appProcess;
- private final ArrayList<String> storedAppOutput;
-
- /*
- * Drain child process output, store it into string array
- */
- class InputGobbler extends Thread {
-
- InputStream is;
- List<String> astr;
-
- InputGobbler(InputStream is, List<String> astr) {
- this.is = is;
- this.astr = astr;
- }
-
- public void run() {
- try {
- InputStreamReader isr = new InputStreamReader(is);
- BufferedReader br = new BufferedReader(isr);
- String line = null;
- while ((line = br.readLine()) != null) {
- astr.add(line);
- }
- } catch (IOException ex) {
- // pass
- }
- }
- }
-
- /**
- * Create LingeredApp object on caller side. Lock file have be a valid filename
- * at writable location
- *
- * @param lockFileName - the name of lock file
- */
- public LingeredApp(String lockFileName) {
- this.lockFileName = lockFileName;
- this.storedAppOutput = new ArrayList();
- }
-
- /**
- *
- * @return name of lock file
- */
- public String getLockFileName() {
- return this.lockFileName;
- }
-
- /**
- *
- * @return name of testapp
- */
- public String getAppName() {
- return this.getClass().getName();
- }
-
- /**
- *
- * @return pid of java process running testapp
- */
- public long getPid() {
- if (appProcess == null) {
- throw new RuntimeException("Process is not alive");
- }
- return appProcess.getPid();
- }
-
- /**
- *
- * @return process object
- */
- public Process getProcess() {
- return appProcess;
- }
-
- /**
- *
- * @return application output as string array. Empty array if application produced no output
- */
- List<String> getAppOutput() {
- if (appProcess.isAlive()) {
- throw new RuntimeException("Process is still alive. Can't get its output.");
- }
- return storedAppOutput;
- }
-
- /* Make sure all part of the app use the same method to get dates,
- as different methods could produce different results
- */
- private static long epoch() {
- return new Date().getTime();
- }
-
- private static long lastModified(String fileName) throws IOException {
- Path path = Paths.get(fileName);
- BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
- return attr.lastModifiedTime().toMillis();
- }
-
- private static void setLastModified(String fileName, long newTime) throws IOException {
- Path path = Paths.get(fileName);
- FileTime fileTime = FileTime.fromMillis(newTime);
- Files.setLastModifiedTime(path, fileTime);
- }
-
- /**
- * create lock
- *
- * @throws IOException
- */
- public void createLock() throws IOException {
- Path path = Paths.get(lockFileName);
- // Files.deleteIfExists(path);
- Files.createFile(path);
- lockCreationTime = lastModified(lockFileName);
- }
-
- /**
- * Delete lock
- *
- * @throws IOException
- */
- public void deleteLock() throws IOException {
- try {
- Path path = Paths.get(lockFileName);
- Files.delete(path);
- } catch (NoSuchFileException ex) {
- // Lock already deleted. Ignore error
- }
- }
-
- public void waitAppTerminate() {
- while (true) {
- try {
- appProcess.waitFor();
- break;
- } catch (InterruptedException ex) {
- // pass
- }
- }
- }
-
- /**
- * The app touches the lock file when it's started
- * wait while it happens. Caller have to delete lock on wait error.
- *
- * @param timeout
- * @throws java.io.IOException
- */
- public void waitAppReady(long timeout) throws IOException {
- long here = epoch();
- while (true) {
- long epoch = epoch();
- if (epoch - here > (timeout * 1000)) {
- throw new IOException("App waiting timeout");
- }
-
- // Live process should touch lock file every second
- long lm = lastModified(lockFileName);
- if (lm > lockCreationTime) {
- break;
- }
-
- // Make sure process didn't already exit
- if (!appProcess.isAlive()) {
- throw new IOException("App exited unexpectedly with " + appProcess.exitValue());
- }
-
- try {
- Thread.sleep(spinDelay);
- } catch (InterruptedException ex) {
- // pass
- }
- }
- }
-
- /**
- * Run the app
- *
- * @param vmArguments
- * @throws IOException
- */
- public void runApp(List<String> vmArguments)
- throws IOException {
-
- // We should always use testjava or throw an exception,
- // so we can't use JDKToolFinder.getJDKTool("java");
- // that falls back to compile java on error
- String jdkPath = System.getProperty("test.jdk");
- if (jdkPath == null) {
- // we are not under jtreg, try env
- Map<String, String> env = System.getenv();
- jdkPath = env.get("TESTJAVA");
- }
-
- if (jdkPath == null) {
- throw new RuntimeException("Can't determine jdk path neither test.jdk property no TESTJAVA env are set");
- }
-
- String osname = System.getProperty("os.name");
- String javapath = jdkPath + ((osname.startsWith("window")) ? "/bin/java.exe" : "/bin/java");
-
- List<String> cmd = new ArrayList();
- cmd.add(javapath);
-
-
- if (vmArguments == null) {
- // Propagate test.vm.options to LingeredApp, filter out possible empty options
- String testVmOpts[] = System.getProperty("test.vm.opts","").split("\\s+");
- for (String s : testVmOpts) {
- if (!s.equals("")) {
- cmd.add(s);
- }
- }
- }
- else{
- // Lets user manage LingerApp options
- cmd.addAll(vmArguments);
- }
-
- // Make sure we set correct classpath to run the app
- cmd.add("-cp");
- String classpath = System.getProperty("test.class.path");
- cmd.add((classpath == null) ? "." : classpath);
-
- cmd.add(this.getAppName());
- cmd.add(lockFileName);
-
- // Reporting
- StringBuilder cmdLine = new StringBuilder();
- for (String strCmd : cmd) {
- cmdLine.append("'").append(strCmd).append("' ");
- }
-
- // A bit of verbosity
- System.out.println("Command line: [" + cmdLine.toString() + "]");
-
- ProcessBuilder pb = new ProcessBuilder(cmd);
- // we don't expect any error output but make sure we are not stuck on pipe
- // pb.redirectErrorStream(false);
- pb.redirectError(ProcessBuilder.Redirect.INHERIT);
-
- appProcess = pb.start();
-
- // Create pipe reader for process, and read stdin and stderr to array of strings
- InputGobbler gb = new InputGobbler(appProcess.getInputStream(), storedAppOutput);
- gb.start();
- }
-
- /**
- * High level interface for test writers
- */
- /**
- * Factory method that creates SmartAppTest object with ready to use application
- * lock name is autogenerated, wait timeout is hardcoded
- * @param cmd - vm options, could be null to auto add testvm.options
- * @return LingeredApp object
- * @throws IOException
- */
- public static LingeredApp startApp(List<String> cmd) throws IOException {
- final String lockName = UUID.randomUUID().toString() + ".lck";
- final int waitTime = 10;
-
- LingeredApp a = new LingeredApp(lockName);
- a.createLock();
- try {
- a.runApp(cmd);
- a.waitAppReady(waitTime);
- } catch (Exception ex) {
- a.deleteLock();
- throw ex;
- }
-
- return a;
- }
-
- public static LingeredApp startApp() throws IOException {
- return startApp(null);
- }
-
- /**
- * Delete lock file that signal app to terminate, then
- * waits until app is actually terminated.
- * @throws IOException
- */
- public void stopApp() throws IOException {
- deleteLock();
- waitAppTerminate();
- int exitcode = appProcess.exitValue();
- if (exitcode != 0) {
- throw new IOException("LingeredApp terminated with non-zero exit code " + exitcode);
- }
- }
-
- /**
- * LastModified time might not work correctly in some cases it might
- * cause later failures
- */
-
- public static boolean isLastModifiedWorking() {
- boolean sane = true;
- try {
- long lm = lastModified(".");
- if (lm == 0) {
- System.err.println("SANITY Warning! The lastModifiedTime() doesn't work on this system, it returns 0");
- sane = false;
- }
-
- long now = epoch();
- if (lm > now) {
- System.err.println("SANITY Warning! The Clock is wrong on this system lastModifiedTime() > getTime()");
- sane = false;
- }
-
- setLastModified(".", epoch());
- long lm1 = lastModified(".");
- if (lm1 <= lm) {
- System.err.println("SANITY Warning! The setLastModified doesn't work on this system");
- sane = false;
- }
- }
- catch(IOException e) {
- System.err.println("SANITY Warning! IOException during sanity check " + e);
- sane = false;
- }
-
- return sane;
- }
-
- /**
- * This part is the application it self
- */
- public static void main(String args[]) {
-
- if (args.length != 1) {
- System.err.println("Lock file name is not specified");
- System.exit(7);
- }
-
- String theLockFileName = args[0];
-
- try {
- Path path = Paths.get(theLockFileName);
-
- while (Files.exists(path)) {
- // Touch the lock to indicate our readiness
- setLastModified(theLockFileName, epoch());
- Thread.sleep(spinDelay);
- }
- } catch (NoSuchFileException ex) {
- // Lock deleted while we are setting last modified time.
- // Ignore error and lets the app exits
- } catch (Exception ex) {
- System.err.println("LingeredApp ERROR: " + ex);
- // Leave exit_code = 1 to Java launcher
- System.exit(3);
- }
-
- System.exit(0);
- }
-}
--- a/jdk/test/sun/tools/jmap/heapconfig/LingeredAppTest.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-/*
- * @test
- * @summary Unit test for LingeredApp
- * @compile LingeredAppTest.java
- * @compile LingeredApp.java
- * @run main LingeredAppTest
- */
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-public class LingeredAppTest {
-
- public static void main(String[] args) {
- try {
- System.out.println("Starting LingeredApp with default parameters");
-
- ArrayList<String> cmd = new ArrayList();
-
- // Propagate test.vm.options to LingeredApp, filter out possible empty options
- String testVmOpts[] = System.getProperty("test.vm.opts","").split("\\s+");
- for (String s : testVmOpts) {
- if (!s.equals("")) {
- cmd.add(s);
- }
- }
-
- cmd.add("-XX:+PrintFlagsFinal");
-
- LingeredApp a = LingeredApp.startApp(cmd);
- System.out.printf("App pid: %d\n", a.getPid());
- a.stopApp();
-
- System.out.println("App output:");
- int count = 0;
- for (String line : a.getAppOutput()) {
- count += 1;
- }
- System.out.println("Found " + count + " lines in VM output");
- System.out.println("Test PASSED");
- } catch (IOException ex) {
- ex.printStackTrace();
- System.out.println("Test ERROR");
- System.exit(3);
- }
- }
-}
--- a/jdk/test/sun/tools/jmap/heapconfig/TmtoolTestScenario.java Wed Jun 24 17:45:44 2015 +0200
+++ b/jdk/test/sun/tools/jmap/heapconfig/TmtoolTestScenario.java Thu Jun 25 07:13:27 2015 +0000
@@ -31,6 +31,8 @@
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
+
+import jdk.test.lib.apps.LingeredApp;
import jdk.testlibrary.JDKToolLauncher;
import jdk.testlibrary.Utils;
--- a/langtools/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -310,3 +310,5 @@
4fcf722b811406a7db8f206d88446c82cda1b5f4 jdk9-b65
fd6bda430d96fc5ab421161de016412f2ddd9082 jdk9-b66
fd782cd69b0497299269952d30a6b88cad960fcf jdk9-b67
+c71857c93f57c63be44258d3d67e656c2bacdb45 jdk9-b68
+931ec7dd6cd9e4a92bde7b2cd26e9a9fb0ecdb56 jdk9-b69
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jun 25 07:13:27 2015 +0000
@@ -2175,11 +2175,19 @@
if (isDiamond
&& ((tree.constructorType != null && inferenceContext.free(tree.constructorType))
|| (tree.clazz.type != null && inferenceContext.free(tree.clazz.type)))) {
+ final ResultInfo resultInfoForClassDefinition = this.resultInfo;
inferenceContext.addFreeTypeListener(List.of(tree.constructorType, tree.clazz.type),
instantiatedContext -> {
tree.constructorType = instantiatedContext.asInstType(tree.constructorType);
clazz.type = instantiatedContext.asInstType(clazz.type);
- visitAnonymousClassDefinition(tree, clazz, clazz.type, cdef, localEnv, argtypes, typeargtypes, pkind);
+ ResultInfo prevResult = this.resultInfo;
+ try {
+ this.resultInfo = resultInfoForClassDefinition;
+ visitAnonymousClassDefinition(tree, clazz, clazz.type, cdef,
+ localEnv, argtypes, typeargtypes, pkind);
+ } finally {
+ this.resultInfo = prevResult;
+ }
});
} else {
if (isDiamond && clazztype.hasTag(CLASS)) {
@@ -4132,7 +4140,12 @@
public void visitAnnotatedType(JCAnnotatedType tree) {
attribAnnotationTypes(tree.annotations, env);
- Type underlyingType = attribType(tree.underlyingType, env);
+ JCExpression underlyingTypeTree = tree.getUnderlyingType();
+ Type underlyingType = attribTree(underlyingTypeTree, env,
+ new ResultInfo(KindSelector.TYP_PCK, Type.noType));
+ if (!chk.checkAnnotableType(underlyingType, tree.annotations, underlyingTypeTree.pos())) {
+ underlyingType = underlyingTypeTree.type = syms.errType;
+ }
Type annotatedType = underlyingType.annotatedType(Annotations.TO_BE_SET);
if (!env.info.isNewClass)
@@ -4623,16 +4636,7 @@
}
} else if (enclTr.hasTag(ANNOTATED_TYPE)) {
JCAnnotatedType at = (JCTree.JCAnnotatedType) enclTr;
- if (enclTy == null || enclTy.hasTag(NONE)) {
- if (at.getAnnotations().size() == 1) {
- log.error(at.underlyingType.pos(), "cant.type.annotate.scoping.1", at.getAnnotations().head.attribute);
- } else {
- ListBuffer<Attribute.Compound> comps = new ListBuffer<>();
- for (JCAnnotation an : at.getAnnotations()) {
- comps.add(an.attribute);
- }
- log.error(at.underlyingType.pos(), "cant.type.annotate.scoping", comps.toList());
- }
+ if (!chk.checkAnnotableType(enclTy, at.getAnnotations(), at.underlyingType.pos())) {
repeat = false;
}
enclTr = at.underlyingType;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Thu Jun 25 07:13:27 2015 +0000
@@ -62,6 +62,8 @@
import static com.sun.tools.javac.code.TypeTag.*;
import static com.sun.tools.javac.code.TypeTag.WILDCARD;
+import static com.sun.tools.javac.resources.CompilerProperties.Errors.CantTypeAnnotateScoping;
+import static com.sun.tools.javac.resources.CompilerProperties.Errors.CantTypeAnnotateScoping1;
import static com.sun.tools.javac.tree.JCTree.Tag.*;
/** Type checking helper class for the attribution phase.
@@ -2691,6 +2693,29 @@
* Check annotations
**************************************************************************/
+ /** Verify that a component of a qualified type name being type annotated
+ * can indeed be legally be annotated. For example, package names and type
+ * names used to access static members cannot be annotated.
+ *
+ * @param typeComponent the component of the qualified name being annotated
+ * @param annotations the annotations
+ * @param pos diagnostic position
+ * @return true if all is swell, false otherwise.
+ */
+ boolean checkAnnotableType(Type typeComponent, List<JCAnnotation> annotations, DiagnosticPosition pos) {
+ if (typeComponent == null || typeComponent.hasTag(PACKAGE) || typeComponent.hasTag(NONE)) {
+ ListBuffer<Symbol> lb = new ListBuffer<>();
+ for (JCAnnotation annotation : annotations) {
+ lb.append(annotation.annotationType.type.tsym);
+ }
+ List<Symbol> symbols = lb.toList();
+ log.error(pos,
+ symbols.size() > 1 ? CantTypeAnnotateScoping(symbols)
+ : CantTypeAnnotateScoping1(symbols.get(0)));
+ return false;
+ }
+ return true;
+ }
/**
* Recursively validate annotations values
*/
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Operators.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Operators.java Thu Jun 25 07:13:27 2015 +0000
@@ -479,22 +479,6 @@
}
/**
- * Class representing bitwise operator helpers that operate on all primitive types (either boxed or unboxed).
- * Operator lookup is performed after applying binary numeric promotion of the input types.
- */
- class BinaryBitwiseOperator extends BinaryNumericOperator {
-
- BinaryBitwiseOperator(Tag tag) {
- super(tag);
- }
-
- @Override
- public boolean test(Type arg1, Type arg2) {
- return unaryPromotion(arg1).isPrimitive() && unaryPromotion(arg2).isPrimitive();
- }
- }
-
- /**
* Class representing bitwise operator helpers that operate on boolean types (either boxed or unboxed).
* Operator lookup is performed assuming both input types are boolean types.
*/
@@ -727,16 +711,19 @@
.addBinaryOperator(FLOAT, FLOAT, FLOAT, fmod)
.addBinaryOperator(LONG, LONG, LONG, lmod)
.addBinaryOperator(INT, INT, INT, imod),
- new BinaryBitwiseOperator(Tag.BITAND)
- .addBinaryOperator(BOOLEAN, BOOLEAN, BOOLEAN, iand)
+ new BinaryBooleanOperator(Tag.BITAND)
+ .addBinaryOperator(BOOLEAN, BOOLEAN, BOOLEAN, iand),
+ new BinaryNumericOperator(Tag.BITAND)
.addBinaryOperator(LONG, LONG, LONG, land)
.addBinaryOperator(INT, INT, INT, iand),
- new BinaryBitwiseOperator(Tag.BITOR)
- .addBinaryOperator(BOOLEAN, BOOLEAN, BOOLEAN, ior)
+ new BinaryBooleanOperator(Tag.BITOR)
+ .addBinaryOperator(BOOLEAN, BOOLEAN, BOOLEAN, ior),
+ new BinaryNumericOperator(Tag.BITOR)
.addBinaryOperator(LONG, LONG, LONG, lor)
.addBinaryOperator(INT, INT, INT, ior),
- new BinaryBitwiseOperator(Tag.BITXOR)
- .addBinaryOperator(BOOLEAN, BOOLEAN, BOOLEAN, ixor)
+ new BinaryBooleanOperator(Tag.BITXOR)
+ .addBinaryOperator(BOOLEAN, BOOLEAN, BOOLEAN, ixor),
+ new BinaryNumericOperator(Tag.BITXOR)
.addBinaryOperator(LONG, LONG, LONG, lxor)
.addBinaryOperator(INT, INT, INT, ixor),
new BinaryShiftOperator(Tag.SL)
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/BuildState.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/BuildState.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -26,12 +26,13 @@
package com.sun.tools.sjavac;
import java.io.File;
+import java.util.Collections;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import com.sun.tools.javac.util.Assert;
+import com.sun.tools.sjavac.pubapi.PubApi;
/**
* The build state class captures the source code and generated artifacts
@@ -77,7 +78,7 @@
*/
Module findModuleFromPackageName(String pkg) {
int cp = pkg.indexOf(':');
- Assert.check(cp != -1);
+ Assert.check(cp != -1, "Could not find package name");
String mod = pkg.substring(0, cp);
return lookupModule(mod);
}
@@ -154,21 +155,28 @@
*/
public void calculateDependents() {
dependents = new HashMap<>();
+
for (String s : packages.keySet()) {
Package p = packages.get(s);
- for (String d : p.dependencies()) {
- Set<String> ss = dependents.get(d);
- if (ss == null) {
- ss = new HashSet<>();
- dependents.put(d, ss);
- }
+
+ // Collect all dependencies of the classes in this package
+ Set<String> deps = p.typeDependencies() // maps fqName -> set of dependencies
+ .values()
+ .stream()
+ .reduce(Collections.emptySet(), Util::union);
+
+ // Now reverse the direction
+
+ for (String dep : deps) {
// Add the dependent information to the global dependent map.
- ss.add(s);
- Package dp = packages.get(d);
+ String depPkgStr = ":" + dep.substring(0, dep.lastIndexOf('.'));
+ dependents.merge(depPkgStr, Collections.singleton(s), Util::union);
+
// Also add the dependent information to the package specific map.
// Normally, you do not compile java.lang et al. Therefore
// there are several packages that p depends upon that you
// do not have in your state database. This is perfectly fine.
+ Package dp = packages.get(depPkgStr);
if (dp != null) {
// But this package did exist in the state database.
dp.addDependent(p.name());
@@ -270,11 +278,21 @@
public void copyPackagesExcept(BuildState prev, Set<String> recompiled, Set<String> removed) {
for (String pkg : prev.packages().keySet()) {
// Do not copy recompiled or removed packages.
- if (recompiled.contains(pkg) || removed.contains(pkg)) continue;
+ if (recompiled.contains(pkg) || removed.contains(pkg))
+ continue;
+
Module mnew = findModuleFromPackageName(pkg);
Package pprev = prev.packages().get(pkg);
+
+ // Even though we haven't recompiled this package, we may have
+ // information about its public API: It may be a classpath dependency
+ if (packages.containsKey(pkg)) {
+ pprev.setPubapi(PubApi.mergeTypes(pprev.getPubApi(),
+ packages.get(pkg).getPubApi()));
+ }
+
mnew.addPackage(pprev);
- // Do not forget to update the flattened data.
+ // Do not forget to update the flattened data. (See JDK-8071904)
packages.put(pkg, pprev);
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 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
@@ -25,17 +25,25 @@
package com.sun.tools.sjavac;
-import java.io.*;
+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.Writer;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
-import java.util.Set;
-import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PubApi;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -63,8 +71,10 @@
Map<String,Set<String>> oldPackageDependencies,
URI destRoot,
Map<String,Set<URI>> packageArtifacts,
- Map<String,Set<String>> packageDependencies,
- Map<String,String> packagePublicApis,
+ Map<String, Map<String, Set<String>>> packageDependencies,
+ Map<String, Map<String, Set<String>>> packageCpDependencies,
+ Map<String, PubApi> packagePublicApis,
+ Map<String, PubApi> dependencyPublicApis,
int debugLevel,
boolean incremental,
int numCores,
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -30,10 +30,12 @@
import java.net.URI;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import java.util.Set;
-import java.util.Map;
import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PubApi;
import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.Sjavac;
import com.sun.tools.sjavac.server.SysInfo;
@@ -73,21 +75,25 @@
Map<String,Set<String>> oldPackageDependents,
URI destRoot,
final Map<String,Set<URI>> packageArtifacts,
- final Map<String,Set<String>> packageDependencies,
- final Map<String,String> packagePubapis,
+ final Map<String,Map<String, Set<String>>> packageDependencies,
+ final Map<String,Map<String, Set<String>>> packageCpDependencies,
+ final Map<String, PubApi> packagePubapis,
+ final Map<String, PubApi> dependencyPubapis,
int debugLevel,
boolean incremental,
int numCores,
final PrintStream out,
- final PrintStream err)
- {
+ final PrintStream err) {
+
+ Log.debug("Performing CompileJavaPackages transform...");
+
boolean rc = true;
boolean concurrentCompiles = true;
// Fetch the id.
final String id = Util.extractStringOption("id", sjavac.serverSettings());
// Only keep portfile and sjavac settings..
- String psServerSettings = Util.cleanSubOptions(Util.set("portfile","sjavac","background","keepalive"), sjavac.serverSettings());
+ //String psServerSettings = Util.cleanSubOptions(Util.set("portfile","sjavac","background","keepalive"), sjavac.serverSettings());
// Get maximum heap size from the server!
SysInfo sysinfo = sjavac.getSysInfo();
@@ -210,20 +216,44 @@
final CompileChunk cc = compileChunks[i];
// Pass the num_cores and the id (appended with the chunk number) to the server.
- final String cleanedServerSettings = psServerSettings+",poolsize="+numCores+",id="+id+"-"+i;
-
+ Object lock = new Object();
requests[i] = new Thread() {
@Override
public void run() {
rn[ii] = sjavac.compile("n/a",
- id + "-" + ii,
- args.prepJavacArgs(),
- Collections.<File>emptyList(),
- cc.srcs,
- visibleSources);
- packageArtifacts.putAll(rn[ii].packageArtifacts);
- packageDependencies.putAll(rn[ii].packageDependencies);
- packagePubapis.putAll(rn[ii].packagePubapis);
+ id + "-" + ii,
+ args.prepJavacArgs(),
+ Collections.<File>emptyList(),
+ cc.srcs,
+ visibleSources);
+ // In the code below we have to keep in mind that two
+ // different compilation results may include results for
+ // the same package.
+ synchronized (lock) {
+
+ for (String pkg : rn[ii].packageArtifacts.keySet()) {
+ Set<URI> pkgArtifacts = rn[ii].packageArtifacts.get(pkg);
+ packageArtifacts.merge(pkg, pkgArtifacts, Util::union);
+ }
+
+ for (String pkg : rn[ii].packageDependencies.keySet()) {
+ packageDependencies.putIfAbsent(pkg, new HashMap<>());
+ packageDependencies.get(pkg).putAll(rn[ii].packageDependencies.get(pkg));
+ }
+
+ for (String pkg : rn[ii].packageCpDependencies.keySet()) {
+ packageCpDependencies.putIfAbsent(pkg, new HashMap<>());
+ packageCpDependencies.get(pkg).putAll(rn[ii].packageCpDependencies.get(pkg));
+ }
+
+ for (String pkg : rn[ii].packagePubapis.keySet()) {
+ packagePubapis.merge(pkg, rn[ii].packagePubapis.get(pkg), PubApi::mergeTypes);
+ }
+
+ for (String pkg : rn[ii].dependencyPubapis.keySet()) {
+ dependencyPubapis.merge(pkg, rn[ii].dependencyPubapis.get(pkg), PubApi::mergeTypes);
+ }
+ }
}
};
@@ -278,7 +308,6 @@
return rc;
}
-
/**
* Split up the sources into compile chunks. If old package dependents information
* is available, sort the order of the chunks into the most dependent first!
@@ -294,9 +323,9 @@
* @return
*/
CompileChunk[] createCompileChunks(Map<String,Set<URI>> pkgSrcs,
- Map<String,Set<String>> oldPackageDependents,
- int numCompiles,
- int sourcesPerCompile) {
+ Map<String,Set<String>> oldPackageDependents,
+ int numCompiles,
+ int sourcesPerCompile) {
CompileChunk[] compileChunks = new CompileChunk[numCompiles];
for (int i=0; i<compileChunks.length; ++i) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -25,19 +25,27 @@
package com.sun.tools.sjavac;
-import java.io.*;
+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.Writer;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import java.util.HashSet;
-import java.util.Map;
import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PubApi;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -70,8 +78,10 @@
Map<String,Set<String>> oldPackageDependents,
URI destRoot,
Map<String,Set<URI>> packageArtifacts,
- Map<String,Set<String>> packageDependencies,
- Map<String,String> packagePublicApis,
+ Map<String,Map<String, Set<String>>> packageDependencies,
+ Map<String,Map<String, Set<String>>> packageCpDependencies,
+ Map<String, PubApi> packagePublicApis,
+ Map<String, PubApi> dependencyPublicApis,
int debugLevel,
boolean incremental,
int numCores,
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -25,13 +25,20 @@
package com.sun.tools.sjavac;
-import java.io.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
import java.net.URI;
-import java.util.Set;
import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PubApi;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -58,8 +65,10 @@
Map<String,Set<String>> oldPackageDependents,
URI destRoot,
Map<String,Set<URI>> packageArtifacts,
- Map<String,Set<String>> packageDependencies,
- Map<String,String> packagePubapis,
+ Map<String,Map<String, Set<String>>> packageDependencies,
+ Map<String,Map<String, Set<String>>> packageCpDependencies,
+ Map<String, PubApi> packagePubapis,
+ Map<String, PubApi> dependencyPubapis,
int debugLevel,
boolean incremental,
int numCores,
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -25,11 +25,17 @@
package com.sun.tools.sjavac;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintStream;
import java.net.URI;
import java.nio.file.NoSuchFileException;
import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
@@ -37,8 +43,10 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PubApi;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -268,24 +276,25 @@
* Save the javac_state file.
*/
public void save() throws IOException {
- if (!needsSaving) return;
+ if (!needsSaving)
+ return;
try (FileWriter out = new FileWriter(javacState)) {
StringBuilder b = new StringBuilder();
long millisNow = System.currentTimeMillis();
Date d = new Date(millisNow);
- SimpleDateFormat df =
- new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
- b.append("# javac_state ver 0.3 generated "+millisNow+" "+df.format(d)+"\n");
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
+ b.append("# javac_state ver 0.4 generated "+millisNow+" "+df.format(d)+"\n");
b.append("# This format might change at any time. Please do not depend on it.\n");
+ b.append("# R arguments\n");
b.append("# M module\n");
b.append("# P package\n");
b.append("# S C source_tobe_compiled timestamp\n");
b.append("# S L link_only_source timestamp\n");
b.append("# G C generated_source timestamp\n");
b.append("# A artifact timestamp\n");
- b.append("# D dependency\n");
+ b.append("# D S dependant -> source dependency\n");
+ b.append("# D C dependant -> classpath dependency\n");
b.append("# I pubapi\n");
- b.append("# R arguments\n");
b.append("R ").append(theArgs).append("\n");
// Copy over the javac_state for the packages that did not need recompilation.
@@ -312,6 +321,8 @@
boolean newCommandLine = false;
boolean syntaxError = false;
+ Log.debug("Loading javac state file: " + db.javacState);
+
try (BufferedReader in = new BufferedReader(new FileReader(db.javacState))) {
for (;;) {
String l = in.readLine();
@@ -327,11 +338,14 @@
} else
if (c == 'D') {
if (lastModule == null || lastPackage == null) { syntaxError = true; break; }
- lastPackage.loadDependency(l);
+ char depType = l.charAt(2);
+ if (depType != 'S' && depType != 'C')
+ throw new RuntimeException("Bad dependency string: " + l);
+ lastPackage.parseAndAddDependency(l.substring(4), depType == 'C');
} else
if (c == 'I') {
if (lastModule == null || lastPackage == null) { syntaxError = true; break; }
- lastPackage.loadPubapi(l);
+ lastPackage.getPubApi().appendItem(l.substring(2)); // Strip "I "
} else
if (c == 'A') {
if (lastModule == null || lastPackage == null) { syntaxError = true; break; }
@@ -356,7 +370,7 @@
int sp = l.indexOf(" ", 18);
if (sp != -1) {
String ver = l.substring(18,sp);
- if (!ver.equals("0.3")) {
+ if (!ver.equals("0.4")) {
break;
}
foundCorrectVerNr = true;
@@ -488,11 +502,92 @@
* Propagate recompilation through the dependency chains.
* Avoid re-tainting packages that have already been compiled.
*/
- public void taintPackagesDependingOnChangedPackages(Set<String> pkgs, Set<String> recentlyCompiled) {
+ public void taintPackagesDependingOnChangedPackages(Set<String> pkgsWithChangedPubApi, Set<String> recentlyCompiled) {
+ // For each to-be-recompiled-candidates...
+ for (Package pkg : new HashSet<>(prev.packages().values())) {
+ // Find out what it depends upon...
+ Set<String> deps = pkg.typeDependencies()
+ .values()
+ .stream()
+ .flatMap(s -> s.stream())
+ .collect(Collectors.toSet());
+ for (String dep : deps) {
+ String depPkg = ":" + dep.substring(0, dep.lastIndexOf('.'));
+ if (depPkg.equals(pkg.name()))
+ continue;
+ // Checking if that dependency has changed
+ if (pkgsWithChangedPubApi.contains(depPkg) && !recentlyCompiled.contains(pkg.name())) {
+ taintPackage(pkg.name(), "its depending on " + depPkg);
+ }
+ }
+ }
+ }
+
+ /**
+ * Compare the javac_state recorded public apis of packages on the classpath
+ * with the actual public apis on the classpath.
+ */
+ public void taintPackagesDependingOnChangedClasspathPackages() {
+
+ // 1. Collect fully qualified names of all interesting classpath dependencies
+ Set<String> fqDependencies = new HashSet<>();
for (Package pkg : prev.packages().values()) {
- for (String dep : pkg.dependencies()) {
- if (pkgs.contains(dep) && !recentlyCompiled.contains(pkg.name())) {
- taintPackage(pkg.name(), " its depending on "+dep);
+ // Check if this package was compiled. If it's presence is recorded
+ // because it was on the class path and we needed to save it's
+ // public api, it's not a candidate for tainting.
+ if (pkg.sources().isEmpty())
+ continue;
+
+ pkg.typeClasspathDependencies().values().forEach(fqDependencies::addAll);
+ }
+
+ // 2. Extract the public APIs from the on disk .class files
+ // (Reason for doing step 1 in a separate phase is to avoid extracting
+ // public APIs of the same class twice.)
+ PubApiExtractor pubApiExtractor = new PubApiExtractor(options);
+ Map<String, PubApi> onDiskPubApi = new HashMap<>();
+ for (String cpDep : fqDependencies) {
+ onDiskPubApi.put(cpDep, pubApiExtractor.getPubApi(cpDep));
+ }
+
+ // 3. Compare them with the public APIs as of last compilation (loaded from javac_state)
+ nextPkg:
+ for (Package pkg : prev.packages().values()) {
+ // Check if this package was compiled. If it's presence is recorded
+ // because it was on the class path and we needed to save it's
+ // public api, it's not a candidate for tainting.
+ if (pkg.sources().isEmpty())
+ continue;
+
+ Set<String> cpDepsOfThisPkg = new HashSet<>();
+ for (Set<String> cpDeps : pkg.typeClasspathDependencies().values())
+ cpDepsOfThisPkg.addAll(cpDeps);
+
+ for (String fqDep : cpDepsOfThisPkg) {
+
+ String depPkg = ":" + fqDep.substring(0, fqDep.lastIndexOf('.'));
+ PubApi prevPkgApi = prev.packages().get(depPkg).getPubApi();
+
+ // This PubApi directly lists the members of the class,
+ // i.e. [ MEMBER1, MEMBER2, ... ]
+ PubApi prevDepApi = prevPkgApi.types.get(fqDep).pubApi;
+
+ // In order to dive *into* the class, we need to add
+ // .types.get(fqDep).pubApi below.
+ PubApi currentDepApi = onDiskPubApi.get(fqDep).types.get(fqDep).pubApi;
+
+ if (!currentDepApi.isBackwardCompatibleWith(prevDepApi)) {
+ List<String> apiDiff = currentDepApi.diff(prevDepApi);
+ taintPackage(pkg.name(), "depends on classpath "
+ + "package which has an updated package api: "
+ + String.join("\n", apiDiff));
+ //Log.debug("========================================");
+ //Log.debug("------ PREV API ------------------------");
+ //prevDepApi.asListOfStrings().forEach(Log::debug);
+ //Log.debug("------ CURRENT API ---------------------");
+ //currentDepApi.asListOfStrings().forEach(Log::debug);
+ //Log.debug("========================================");
+ continue nextPkg;
}
}
}
@@ -660,7 +755,6 @@
Map<String,Transformer> suffixRules = new HashMap<>();
suffixRules.put(".java", compileJavaPackages);
compileJavaPackages.setExtra(args);
-
rcValue[0] = perform(sjavac, binDir, suffixRules);
recentlyCompiled.addAll(taintedPackages());
clearTaintedPackages();
@@ -668,6 +762,11 @@
taintPackagesDependingOnChangedPackages(packagesWithChangedPublicApis, recentlyCompiled);
packagesWithChangedPublicApis = new HashSet<>();
return again && rcValue[0];
+
+ // TODO: Figure out why 'again' checks packagesWithChangedPublicAPis.
+ // (It shouldn't matter if packages had changed pub apis as long as no
+ // one depends on them. Wouldn't it make more sense to let 'again'
+ // depend on taintedPackages?)
}
/**
@@ -699,68 +798,101 @@
Map<Transformer,Map<String,Set<URI>>> groupedSources = new HashMap<>();
for (Source src : now.sources().values()) {
Transformer t = suffixRules.get(src.suffix());
- if (t != null) {
+ if (t != null) {
if (taintedPackages.contains(src.pkg().name()) && !src.isLinkedOnly()) {
addFileToTransform(groupedSources, t, src);
}
}
}
// Go through the transforms and transform them.
- for (Map.Entry<Transformer,Map<String,Set<URI>>> e : groupedSources.entrySet()) {
+ for (Map.Entry<Transformer, Map<String, Set<URI>>> e : groupedSources.entrySet()) {
Transformer t = e.getKey();
- Map<String,Set<URI>> srcs = e.getValue();
- // These maps need to be synchronized since multiple threads will be writing results into them.
- Map<String,Set<URI>> packageArtifacts =
- Collections.synchronizedMap(new HashMap<String,Set<URI>>());
- Map<String,Set<String>> packageDependencies =
- Collections.synchronizedMap(new HashMap<String,Set<String>>());
- Map<String,String> packagePublicApis =
- Collections.synchronizedMap(new HashMap<String, String>());
+ Map<String, Set<URI>> srcs = e.getValue();
+ // These maps need to be synchronized since multiple threads will be
+ // writing results into them.
+ Map<String, Set<URI>> packageArtifacts = Collections.synchronizedMap(new HashMap<>());
+ Map<String, Map<String, Set<String>>> packageDependencies = Collections.synchronizedMap(new HashMap<>());
+ Map<String, Map<String, Set<String>>> packageCpDependencies = Collections.synchronizedMap(new HashMap<>());
+ Map<String, PubApi> packagePublicApis = Collections.synchronizedMap(new HashMap<>());
+ Map<String, PubApi> dependencyPublicApis = Collections.synchronizedMap(new HashMap<>());
- boolean r = t.transform(sjavac,
- srcs,
- visibleSrcs,
- visibleClasses,
- prev.dependents(),
- outputDir.toURI(),
- packageArtifacts,
- packageDependencies,
- packagePublicApis,
- 0,
- isIncremental(),
- numCores,
- out,
- err);
- if (!r) rc = false;
+ boolean r = t.transform(sjavac,
+ srcs,
+ visibleSrcs,
+ visibleClasses,
+ prev.dependents(),
+ outputDir.toURI(),
+ packageArtifacts,
+ packageDependencies,
+ packageCpDependencies,
+ packagePublicApis,
+ dependencyPublicApis,
+ 0,
+ isIncremental(),
+ numCores,
+ out,
+ err);
+ if (!r)
+ rc = false;
for (String p : srcs.keySet()) {
recompiledPackages.add(p);
}
// The transform is done! Extract all the artifacts and store the info into the Package objects.
- for (Map.Entry<String,Set<URI>> a : packageArtifacts.entrySet()) {
+ for (Map.Entry<String, Set<URI>> a : packageArtifacts.entrySet()) {
Module mnow = now.findModuleFromPackageName(a.getKey());
mnow.addArtifacts(a.getKey(), a.getValue());
}
// Extract all the dependencies and store the info into the Package objects.
- for (Map.Entry<String,Set<String>> a : packageDependencies.entrySet()) {
- Set<String> deps = a.getValue();
+ for (Map.Entry<String, Map<String, Set<String>>> a : packageDependencies.entrySet()) {
+ Map<String, Set<String>> deps = a.getValue();
Module mnow = now.findModuleFromPackageName(a.getKey());
- mnow.setDependencies(a.getKey(), deps);
+ mnow.setDependencies(a.getKey(), deps, false);
+ }
+ for (Map.Entry<String, Map<String, Set<String>>> a : packageCpDependencies.entrySet()) {
+ Map<String, Set<String>> deps = a.getValue();
+ Module mnow = now.findModuleFromPackageName(a.getKey());
+ mnow.setDependencies(a.getKey(), deps, true);
}
- // Extract all the pubapis and store the info into the Package objects.
- for (Map.Entry<String,String> a : packagePublicApis.entrySet()) {
- Module mprev = prev.findModuleFromPackageName(a.getKey());
- List<String> pubapi = Package.pubapiToList(a.getValue());
- Module mnow = now.findModuleFromPackageName(a.getKey());
- mnow.setPubapi(a.getKey(), pubapi);
- if (mprev.hasPubapiChanged(a.getKey(), pubapi)) {
+
+ // This map contains the public api of the types that this
+ // compilation depended upon. This means that it may not contain
+ // full packages. In other words, we shouldn't remove knowledge of
+ // public apis but merge these with what we already have.
+ for (Map.Entry<String, PubApi> a : dependencyPublicApis.entrySet()) {
+ String pkg = a.getKey();
+ PubApi packagePartialPubApi = a.getValue();
+ Package pkgNow = now.findModuleFromPackageName(pkg).lookupPackage(pkg);
+ PubApi currentPubApi = pkgNow.getPubApi();
+ PubApi newPubApi = PubApi.mergeTypes(currentPubApi, packagePartialPubApi);
+ pkgNow.setPubapi(newPubApi);
+
+ // See JDK-8071904
+ if (now.packages().containsKey(pkg))
+ now.packages().get(pkg).setPubapi(newPubApi);
+ else
+ now.packages().put(pkg, pkgNow);
+ }
+
+ // The packagePublicApis cover entire packages (since sjavac compiles
+ // stuff on package level). This means that if a type is missing
+ // in the public api of a given package, it means that it has been
+ // removed. In other words, we should *set* the pubapi to whatever
+ // this map contains, and not merge it with what we already have.
+ for (Map.Entry<String, PubApi> a : packagePublicApis.entrySet()) {
+ String pkg = a.getKey();
+ PubApi newPubApi = a.getValue();
+ Module mprev = prev.findModuleFromPackageName(pkg);
+ Module mnow = now.findModuleFromPackageName(pkg);
+ mnow.setPubapi(pkg, newPubApi);
+ if (mprev.hasPubapiChanged(pkg, newPubApi)) {
// Aha! The pubapi of this package has changed!
// It can also be a new compile from scratch.
- if (mprev.lookupPackage(a.getKey()).existsInJavacState()) {
+ if (mprev.lookupPackage(pkg).existsInJavacState()) {
// This is an incremental compile! The pubapi
// did change. Trigger recompilation of dependents.
- packagesWithChangedPublicApis.add(a.getKey());
- Log.info("The pubapi of "+Util.justPackageName(a.getKey())+" has changed!");
+ packagesWithChangedPublicApis.add(pkg);
+ Log.info("The API of " + Util.justPackageName(pkg) + " has changed!");
}
}
}
@@ -791,17 +923,21 @@
}
/**
- * Compare the calculate source list, with an explicit list, usually supplied from the makefile.
- * Used to detect bugs where the makefile and sjavac have different opinions on which files
- * should be compiled.
+ * Compare the calculate source list, with an explicit list, usually
+ * supplied from the makefile. Used to detect bugs where the makefile and
+ * sjavac have different opinions on which files should be compiled.
*/
- public void compareWithMakefileList(File makefileSourceList) throws ProblemException {
- // If we are building on win32 using for example cygwin the paths in the makefile source list
+ public void compareWithMakefileList(File makefileSourceList)
+ throws ProblemException {
+ // If we are building on win32 using for example cygwin the paths in the
+ // makefile source list
// might be /cygdrive/c/.... which does not match c:\....
- // We need to adjust our calculated sources to be identical, if necessary.
+ // We need to adjust our calculated sources to be identical, if
+ // necessary.
boolean mightNeedRewriting = File.pathSeparatorChar == ';';
- if (makefileSourceList == null) return;
+ if (makefileSourceList == null)
+ return;
Set<String> calculatedSources = new HashSet<>();
Set<String> listedSources = new HashSet<>();
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Module.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Module.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -28,10 +28,11 @@
import java.io.File;
import java.net.URI;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.Set;
+import com.sun.tools.sjavac.pubapi.PubApi;
+
/**
* The module is the root of a set of packages/sources/artifacts.
* At the moment there is only one module in use, the empty/no-name/default module.
@@ -86,8 +87,7 @@
return new Module(name, "");
}
- public static void saveModules(Map<String,Module> ms, StringBuilder b)
- {
+ public static void saveModules(Map<String,Module> ms, StringBuilder b) {
for (Module m : ms.values()) {
m.save(b);
}
@@ -98,6 +98,7 @@
}
public Package lookupPackage(String pkg) {
+ // See JDK-8071904
Package p = packages.get(pkg);
if (p == null) {
p = new Package(this, pkg);
@@ -124,18 +125,17 @@
}
}
- public void setDependencies(String pkg, Set<String> deps) {
- Package p = lookupPackage(pkg);
- p.setDependencies(deps);
+ public void setDependencies(String pkg, Map<String, Set<String>> deps, boolean cp) {
+ lookupPackage(pkg).setDependencies(deps, cp);
}
- public void setPubapi(String pkg, List<String> ps) {
+ public void setPubapi(String pkg, PubApi ps) {
Package p = lookupPackage(pkg);
p.setPubapi(ps);
}
- public boolean hasPubapiChanged(String pkg, List<String> ps) {
+ public boolean hasPubapiChanged(String pkg, PubApi newPubApi) {
Package p = lookupPackage(pkg);
- return p.hasPubapiChanged(ps);
+ return p.hasPubApiChanged(newPubApi);
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Package.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Package.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -31,11 +31,16 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
import com.sun.tools.javac.util.Assert;
+import com.sun.tools.sjavac.pubapi.PubApi;
/**
* The Package class maintains meta information about a package.
@@ -71,12 +76,16 @@
// The directory path to the package. If the package belongs to a module,
// then that module's file system name is part of the path.
private String dirname;
- // This package depends on these packages.
- private Set<String> dependencies = new HashSet<>();
// This package has the following dependents, that depend on this package.
private Set<String> dependents = new HashSet<>();
+
+ // Fully qualified name of class in this package -> fully qualified name of dependency
+ private Map<String, Set<String>> dependencies = new TreeMap<>();
+ // Fully qualified name of class in this package -> fully qualified name of dependency on class path
+ private Map<String, Set<String>> cpDependencies = new TreeMap<>();
+
// This is the public api of this package.
- private List<String> pubapi = new ArrayList<>();
+ private PubApi pubApi = new PubApi();
// Map from source file name to Source info object.
private Map<String,Source> sources = new HashMap<>();
// This package generated these artifacts.
@@ -85,7 +94,6 @@
public Package(Module m, String n) {
int c = n.indexOf(":");
Assert.check(c != -1);
- String mn = n.substring(0,c);
Assert.check(m.name().equals(m.name()));
name = n;
dirname = n.replace('.', File.separatorChar);
@@ -100,9 +108,11 @@
public String dirname() { return dirname; }
public Map<String,Source> sources() { return sources; }
public Map<String,File> artifacts() { return artifacts; }
- public List<String> pubapi() { return pubapi; }
+ public PubApi getPubApi() { return pubApi; }
- public Set<String> dependencies() { return dependencies; }
+ public Map<String,Set<String>> typeDependencies() { return dependencies; }
+ public Map<String,Set<String>> typeClasspathDependencies() { return cpDependencies; }
+
public Set<String> dependents() { return dependents; }
@Override
@@ -124,70 +134,48 @@
sources.put(s.file().getPath(), s);
}
- public void addDependency(String d) {
- dependencies.add(d);
+ private static Pattern DEP_PATTERN = Pattern.compile("(.*) -> (.*)");
+ public void parseAndAddDependency(String d, boolean cp) {
+ Matcher m = DEP_PATTERN.matcher(d);
+ if (!m.matches())
+ throw new IllegalArgumentException("Bad dependency string: " + d);
+ addDependency(m.group(1), m.group(2), cp);
+ }
+
+ public void addDependency(String fullyQualifiedFrom,
+ String fullyQualifiedTo,
+ boolean cp) {
+ Map<String, Set<String>> map = cp ? cpDependencies : dependencies;
+ if (!map.containsKey(fullyQualifiedFrom))
+ map.put(fullyQualifiedFrom, new HashSet<>());
+ map.get(fullyQualifiedFrom).add(fullyQualifiedTo);
}
public void addDependent(String d) {
dependents.add(d);
}
- public void addPubapi(String p) {
- pubapi.add(p);
- }
-
/**
* Check if we have knowledge in the javac state that
* describe the results of compiling this package before.
*/
public boolean existsInJavacState() {
- return artifacts.size() > 0 || pubapi.size() > 0;
+ return artifacts.size() > 0 || !pubApi.isEmpty();
}
- public static List<String> pubapiToList(String ps)
- {
- String[] lines = ps.split("\n");
- List<String> r = new ArrayList<>();
- for (String l : lines) {
- r.add(l);
- }
- return r;
+ public boolean hasPubApiChanged(PubApi newPubApi) {
+ return !newPubApi.isBackwardCompatibleWith(pubApi);
}
- public boolean hasPubapiChanged(List<String> ps) {
- Iterator<String> i = ps.iterator();
- Iterator<String> j = pubapi.iterator();
- int line = 0;
- while (i.hasNext() && j.hasNext()) {
- String is = i.next();
- String js = j.next();
- if (!is.equals(js)) {
- Log.debug("Change in pubapi for package "+name+" line "+line);
- Log.debug("Old: "+js);
- Log.debug("New: "+is);
- return true;
- }
- line++;
- }
- if ((i.hasNext() && !j.hasNext() ) ||
- (!i.hasNext() && j.hasNext())) {
- Log.debug("Change in pubapi for package "+name);
- if (i.hasNext()) {
- Log.debug("New has more lines!");
- } else {
- Log.debug("Old has more lines!");
- }
- return true;
- }
- return false;
+ public void setPubapi(PubApi newPubApi) {
+ pubApi = newPubApi;
}
- public void setPubapi(List<String> ps) {
- pubapi = ps;
- }
-
- public void setDependencies(Set<String> ds) {
- dependencies = ds;
+ public void setDependencies(Map<String, Set<String>> ds, boolean cp) {
+ (cp ? cpDependencies : dependencies).clear();
+ for (String fullyQualifiedFrom : ds.keySet())
+ for (String fullyQualifiedTo : ds.get(fullyQualifiedFrom))
+ addDependency(fullyQualifiedFrom, fullyQualifiedTo, cp);
}
public void save(StringBuilder b) {
@@ -203,31 +191,28 @@
return new Package(module, name);
}
- public void loadDependency(String l) {
- String n = l.substring(2);
- addDependency(n);
- }
+ public void saveDependencies(StringBuilder b) {
- public void loadPubapi(String l) {
- String pi = l.substring(2);
- addPubapi(pi);
- }
+ // Dependencies where *to* is among sources
+ for (String fullyQualifiedFrom : dependencies.keySet()) {
+ for (String fullyQualifiedTo : dependencies.get(fullyQualifiedFrom)) {
+ b.append(String.format("D S %s -> %s%n", fullyQualifiedFrom, fullyQualifiedTo));
+ }
+ }
- public void saveDependencies(StringBuilder b) {
- List<String> sorted_dependencies = new ArrayList<>();
- for (String key : dependencies) {
- sorted_dependencies.add(key);
- }
- Collections.sort(sorted_dependencies);
- for (String a : sorted_dependencies) {
- b.append("D "+a+"\n");
+ // Dependencies where *to* is on class path
+ for (String fullyQualifiedFrom : cpDependencies.keySet()) {
+ for (String fullyQualifiedTo : cpDependencies.get(fullyQualifiedFrom)) {
+ b.append(String.format("D C %s -> %s%n", fullyQualifiedFrom, fullyQualifiedTo));
+ }
}
}
public void savePubapi(StringBuilder b) {
- for (String l : pubapi) {
- b.append("I "+l+"\n");
- }
+ pubApi.asListOfStrings()
+ .stream()
+ .flatMap(l -> Stream.of("I ", l, "\n"))
+ .forEach(b::append);
}
public static void savePackages(Map<String,Package> packages, StringBuilder b) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/PubApiExtractor.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2012-2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.sjavac;
+
+import java.io.PrintWriter;
+import java.util.Arrays;
+
+import javax.tools.JavaCompiler.CompilationTask;
+import javax.tools.JavaFileManager;
+
+import com.sun.tools.javac.api.JavacTool;
+import com.sun.tools.javac.code.ClassFinder;
+import com.sun.tools.javac.code.Symbol.ClassSymbol;
+import com.sun.tools.javac.main.JavaCompiler;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.Name;
+import com.sun.tools.javac.util.Names;
+import com.sun.tools.sjavac.comp.PubapiVisitor;
+import com.sun.tools.sjavac.comp.SmartFileManager;
+import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PubApi;
+
+public class PubApiExtractor {
+ // Setup a compiler context for finding classes in the classpath
+ // and to execute annotation processors.
+ Context context;
+ CompilationTask task;
+
+ /**
+ * Setup a compilation context, used for reading public apis of classes on the classpath
+ * as well as annotation processors.
+ */
+ public PubApiExtractor(Options options) {
+ JavacTool compiler = com.sun.tools.javac.api.JavacTool.create();
+ SmartFileManager fileManager = new SmartFileManager(compiler.getStandardFileManager(null, null, null));
+ context = new com.sun.tools.javac.util.Context();
+ String[] args = options.prepJavacArgs();
+ task = compiler.getTask(new PrintWriter(System.err),
+ fileManager,
+ null,
+ Arrays.asList(args),
+ null,
+ null,
+ context);
+ // Trigger a creation of the JavaCompiler, necessary to get a sourceCompleter for ClassFinder.
+ // The sourceCompleter is used for build situations where a classpath class references other classes
+ // that happens to be on the sourcepath.
+ JavaCompiler.instance(context);
+
+// context.put(JavaFileManager.class, fileManager);
+ }
+
+ public PubApi getPubApi(String fullyQualifiedClassName) {
+ ClassFinder cr = ClassFinder.instance(context);
+ Names ns = Names.instance(context);
+ Name n = ns.fromString(fullyQualifiedClassName);
+ ClassSymbol cs = cr.loadClass(n);
+ PubapiVisitor v = new PubapiVisitor();
+ v.visit(cs);
+ return v.getCollectedPubApi();
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Source.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Source.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -373,8 +373,6 @@
return currentModule;
}
- private static boolean gurka = false;
-
static private void scanDirectory(File dir, int rootPrefix, File root,
Set<String> suffixes,
List<String> excludes, List<String> includes,
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -27,10 +27,11 @@
import java.io.PrintStream;
import java.net.URI;
+import java.util.Map;
import java.util.Set;
-import java.util.Map;
import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PubApi;
import com.sun.tools.sjavac.server.Sjavac;
/**
@@ -89,8 +90,10 @@
Map<String,Set<String>> oldPackageDependencies,
URI destRoot,
Map<String,Set<URI>> packageArtifacts,
- Map<String,Set<String>> packageDependencies,
- Map<String,String> packagePublicApis,
+ Map<String, Map<String, Set<String>>> packageDependencies, // Package name -> Fully Qualified Type [from] -> Set of fully qualified type [to]
+ Map<String, Map<String, Set<String>>> packageCpDependencies, // Package name -> Fully Qualified Type [from] -> Set of fully qualified type [to]
+ Map<String, PubApi> packagePublicApis,
+ Map<String, PubApi> dependencyApis,
int debugLevel,
boolean incremental,
int numCores,
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Util.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Util.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -30,9 +30,13 @@
import java.io.StringWriter;
import java.nio.file.Path;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
/**
* Utilities.
@@ -107,6 +111,20 @@
}
/**
+ * Extract the package name from a fully qualified class name.
+ *
+ * Example: Given "pkg.subpkg.A" this method returns ":pkg.subpkg".
+ * Given "C" this method returns ":".
+ *
+ * @returns package name of the given class name
+ */
+ public static String pkgNameOfClassName(String fqClassName) {
+ int i = fqClassName.lastIndexOf('.');
+ String pkg = i == -1 ? "" : fqClassName.substring(0, i);
+ return ":" + pkg;
+ }
+
+ /**
* Clean out unwanted sub options supplied inside a primary option.
* For example to only had portfile remaining from:
* settings="--server:id=foo,portfile=bar"
@@ -183,6 +201,13 @@
return union;
}
+ public static <E> Set<E> subtract(Set<? extends E> orig,
+ Set<? extends E> toSubtract) {
+ Set<E> difference = new HashSet<>(orig);
+ difference.removeAll(toSubtract);
+ return difference;
+ }
+
public static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
@@ -193,4 +218,16 @@
public static File pathToFile(Path path) {
return path == null ? null : path.toFile();
}
+
+ public static <E> Set<E> intersection(Collection<? extends E> c1,
+ Collection<? extends E> c2) {
+ Set<E> intersection = new HashSet<E>(c1);
+ intersection.retainAll(c2);
+ return intersection;
+ }
+
+ public static <I, T> Map<I, T> indexBy(Collection<? extends T> c,
+ Function<? super T, ? extends I> indexFunction) {
+ return c.stream().collect(Collectors.<T, I, T>toMap(indexFunction, o -> o));
+ }
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -93,6 +93,11 @@
if (hdrdir != null && !createIfMissing(hdrdir))
return -1;
+ Log.debug("==========================================================");
+ Log.debug("Launching sjavac client with the following parameters:");
+ Log.debug(" " + options.getStateArgsString());
+ Log.debug("==========================================================");
+
// Load the prev build state database.
JavacState javac_state = JavacState.load(options, out, err);
@@ -167,6 +172,9 @@
javac_state.now().checkInternalState("checking linked sources", true, sources_to_link_to);
javac_state.setVisibleSources(sources_to_link_to);
+ int round = 0;
+ printRound(round);
+
// If there is any change in the source files, taint packages
// and mark the database in need of saving.
javac_state.checkSourceStatus(false);
@@ -188,6 +196,10 @@
// Go through all sources and taint all packages that miss artifacts.
javac_state.taintPackagesThatMissArtifacts();
+ // Check recorded classpath public apis. Taint packages that depend on
+ // classpath classes whose public apis have changed.
+ javac_state.taintPackagesDependingOnChangedClasspathPackages();
+
// Now clean out all known artifacts belonging to tainted packages.
javac_state.deleteClassArtifactsInTaintedPackages();
// Copy files, for example property files, images files, xml files etc etc.
@@ -231,11 +243,22 @@
}
do {
+ if (round > 0)
+ printRound(round);
// Clean out artifacts in tainted packages.
javac_state.deleteClassArtifactsInTaintedPackages();
again = javac_state.performJavaCompilations(sjavac, options, recently_compiled, rc);
- if (!rc[0]) break;
+ if (!rc[0]) {
+ Log.debug("Compilation failed.");
+ break;
+ }
+ if (!again) {
+ Log.debug("Nothing left to do.");
+ }
+ round++;
} while (again);
+ Log.debug("No need to do another round.");
+
// Only update the state if the compile went well.
if (rc[0]) {
javac_state.save();
@@ -323,4 +346,10 @@
}
}
+ private static void printRound(int round) {
+ Log.debug("****************************************");
+ Log.debug("* Round " + round + " *");
+ Log.debug("****************************************");
+ }
+
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/Dependencies.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.sun.tools.sjavac.comp;
-
-import javax.lang.model.element.Element;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import com.sun.tools.javac.code.Symbol.ClassSymbol;
-import com.sun.tools.javac.util.Assert;
-import com.sun.tools.javac.util.Context;
-import com.sun.tools.javac.util.Log;
-import com.sun.tools.javac.util.Name;
-
-/** Utility class containing dependency information between packages
- * and the pubapi for a package.
- *
- * <p><b>This is NOT part of any supported API.
- * If you write code that depends on this, you do so at your own risk.
- * This code and its internal interfaces are subject to change or
- * deletion without notice.</b>
- */
-public class Dependencies {
- protected static final Context.Key<Dependencies> dependenciesKey = new Context.Key<>();
-
- // The log to be used for error reporting.
- protected Log log;
- // Map from package name to packages that the package depends upon.
- protected Map<Name,Set<Name>> deps;
- // This is the set of all packages that are supplied
- // through the java files at the command line.
- protected Set<Name> explicitPackages;
-
- // Map from a package name to its public api.
- // Will the Name encode the module in the future?
- // If not, this will have to change to map from Module+Name to public api.
- protected Map<Name,StringBuffer> publicApiPerClass;
-
- public static Dependencies instance(Context context) {
- Dependencies instance = context.get(dependenciesKey);
- if (instance == null)
- instance = new Dependencies(context);
- return instance;
- }
-
- private Dependencies(Context context) {
- context.put(dependenciesKey, this);
- log = Log.instance(context);
- deps = new HashMap<>();
- explicitPackages = new HashSet<>();
- publicApiPerClass = new HashMap<>();
- }
-
- /**
- * Fetch the set of dependencies that are relevant to the compile
- * that has just been performed. I.e. we are only interested in
- * dependencies for classes that were explicitly compiled.
- * @return
- */
- public Map<String,Set<String>> getDependencies() {
- Map<String,Set<String>> new_deps = new HashMap<>();
- if (explicitPackages == null) return new_deps;
- for (Name pkg : explicitPackages) {
- Set<Name> set = deps.get(pkg);
- if (set != null) {
- Set<String> new_set = new_deps.get(pkg.toString());
- if (new_set == null) {
- new_set = new HashSet<>();
- // Modules beware....
- new_deps.put(":"+pkg.toString(), new_set);
- }
- for (Name d : set) {
- new_set.add(":"+d.toString());
- }
- }
- }
- return new_deps;
- }
-
- static class CompareNames implements Comparator<Name> {
- public int compare(Name a, Name b) {
- return a.toString().compareTo(b.toString());
- }
-
- }
-
- /**
- * Convert the map from class names to their pubapi to a map
- * from package names to their pubapi (which is the sorted concatenation
- * of all the class pubapis)
- */
- public Map<String,String> getPubapis() {
- Map<String,String> publicApiPerPackage = new HashMap<>();
- if (publicApiPerClass == null) return publicApiPerPackage;
- Name[] keys = publicApiPerClass.keySet().toArray(new Name[0]);
- Arrays.sort(keys, new CompareNames());
- StringBuffer newPublicApi = new StringBuffer();
- int i=0;
- String prevPkg = "";
- for (Name k : keys) {
- String cn = k.toString();
- String pn = "";
- int dp = cn.lastIndexOf('.');
- if (dp != -1) {
- pn = cn.substring(0,dp);
- }
- if (!pn.equals(prevPkg)) {
- if (!prevPkg.equals("")) {
- // Add default module name ":"
- publicApiPerPackage.put(":"+prevPkg, newPublicApi.toString());
- }
- newPublicApi = new StringBuffer();
- prevPkg = pn;
- }
- newPublicApi.append(publicApiPerClass.get(k));
- i++;
- }
- if (!prevPkg.equals(""))
- publicApiPerPackage.put(":"+prevPkg, newPublicApi.toString());
- return publicApiPerPackage;
- }
-
- /**
- * Visit the api of a class and construct a pubapi string and
- * store it into the pubapi_perclass map.
- */
- public void visitPubapi(Element e) {
- Name n = ((ClassSymbol)e).fullname;
- Name p = ((ClassSymbol)e).packge().fullname;
- StringBuffer sb = publicApiPerClass.get(n);
- Assert.check(sb == null);
- sb = new StringBuffer();
- PubapiVisitor v = new PubapiVisitor(sb);
- v.visit(e);
- if (sb.length()>0) {
- publicApiPerClass.put(n, sb);
- }
- explicitPackages.add(p);
- }
-
- /**
- * Collect a dependency. curr_pkg is marked as depending on dep_pkg.
- */
- public void collect(Name currPkg, Name depPkg) {
- if (!currPkg.equals(depPkg)) {
- Set<Name> theset = deps.get(currPkg);
- if (theset==null) {
- theset = new HashSet<>();
- deps.put(currPkg, theset);
- }
- theset.add(depPkg);
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/FileObjectWithLocation.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.comp;
+
+import javax.tools.FileObject;
+import javax.tools.ForwardingFileObject;
+import javax.tools.JavaFileManager.Location;
+
+import com.sun.tools.javac.api.ClientCodeWrapper.Trusted;
+
+@Trusted
+public class FileObjectWithLocation<F extends FileObject> extends ForwardingFileObject<F> {
+
+ private final Location loc;
+
+ public FileObjectWithLocation(F delegate, Location loc) {
+ super(delegate);
+ this.loc = loc;
+ }
+
+ public Location getLocation() {
+ return loc;
+ }
+
+ public FileObject getDelegate() {
+ return fileObject;
+ }
+
+ public String toString() {
+ return "FileObjectWithLocation[" + fileObject + "]";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/JavaFileObjectWithLocation.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.comp;
+
+import javax.tools.ForwardingJavaFileObject;
+import javax.tools.JavaFileManager.Location;
+import javax.tools.JavaFileObject;
+
+import com.sun.tools.javac.api.ClientCodeWrapper.Trusted;
+
+@Trusted
+public class JavaFileObjectWithLocation<F extends JavaFileObject> extends ForwardingJavaFileObject<F> {
+
+ private final Location loc;
+
+ public JavaFileObjectWithLocation(F delegate, Location loc) {
+ super(delegate);
+ this.loc = loc;
+ }
+
+ public Location getLocation() {
+ return loc;
+ }
+
+ public F getDelegate() {
+ return fileObject;
+ }
+
+ public String toString() {
+ return "JavaFileObjectWithLocation[loc: " + loc + ", " + fileObject + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ return loc.hashCode() ^ fileObject.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof JavaFileObjectWithLocation))
+ return false;
+ JavaFileObjectWithLocation<?> other = (JavaFileObjectWithLocation<?>) obj;
+ return loc.equals(other.loc) && fileObject.equals(other.fileObject);
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PathAndPackageVerifier.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PathAndPackageVerifier.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,6 +41,7 @@
import com.sun.tools.javac.util.DefinedBy;
import com.sun.tools.javac.util.DefinedBy.Api;
import com.sun.tools.javac.util.Name;
+import com.sun.tools.sjavac.Log;
public class PathAndPackageVerifier implements TaskListener {
@@ -50,30 +51,37 @@
@Override
@DefinedBy(Api.COMPILER_TREE)
- public void started(TaskEvent e) {
+ public void finished(TaskEvent e) {
+ if (e.getKind() == TaskEvent.Kind.ANALYZE) {
+
+ CompilationUnitTree cu = e.getCompilationUnit();
+ if (cu == null)
+ return;
+
+ JavaFileObject jfo = cu.getSourceFile();
+ if (jfo == null)
+ return; // No source file -> package doesn't matter
+
+ JCTree pkg = (JCTree) cu.getPackageName();
+ if (pkg == null)
+ return; // Default package. See JDK-8048144.
+
+ Path dir = Paths.get(jfo.toUri()).normalize().getParent();
+ if (!checkPathAndPackage(dir, pkg))
+ misplacedCompilationUnits.add(cu);
+ }
+
+ if (e.getKind() == TaskEvent.Kind.COMPILATION) {
+ for (CompilationUnitTree cu : misplacedCompilationUnits) {
+ Log.error("Misplaced compilation unit.");
+ Log.error(" Directory: " + Paths.get(cu.getSourceFile().toUri()).getParent());
+ Log.error(" Package: " + cu.getPackageName());
+ }
+ }
}
- @Override
- @DefinedBy(Api.COMPILER_TREE)
- public void finished(TaskEvent e) {
- if (e.getKind() != TaskEvent.Kind.ANALYZE)
- return;
-
- CompilationUnitTree cu = e.getCompilationUnit();
- if (cu == null)
- return;
-
- JavaFileObject jfo = cu.getSourceFile();
- if (jfo == null)
- return; // No source file -> package doesn't matter
-
- JCTree pkg = (JCTree) cu.getPackageName();
- if (pkg == null)
- return; // Default package. See JDK-8048144.
-
- Path dir = Paths.get(jfo.toUri()).normalize().getParent();
- if (!checkPathAndPackage(dir, pkg))
- misplacedCompilationUnits.add(cu);
+ public boolean errorsDiscovered() {
+ return misplacedCompilationUnits.size() > 0;
}
/* Returns true if dir matches pkgName.
@@ -94,10 +102,6 @@
return !pkgIter.hasNext(); /*&& !pathIter.hasNext() See JDK-8059598 */
}
- public Set<CompilationUnitTree> getMisplacedCompilationUnits() {
- return misplacedCompilationUnits;
- }
-
/* Iterates over the names of the parents of the given path:
* Example: dir1/dir2/dir3 results in dir3 -> dir2 -> dir1
*/
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,12 +29,9 @@
import java.util.List;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
import com.sun.tools.sjavac.Log;
import com.sun.tools.sjavac.server.CompilationResult;
@@ -58,28 +55,13 @@
public PooledSjavac(Sjavac delegate, int poolsize) {
Objects.requireNonNull(delegate);
this.delegate = delegate;
- pool = Executors.newFixedThreadPool(poolsize, new ThreadFactory() {
- AtomicInteger count = new AtomicInteger();
- @Override
- public Thread newThread(Runnable runnable) {
- String cls = PooledSjavac.class.getSimpleName();
- int num = count.incrementAndGet();
- Thread t = new Thread(runnable, cls + "-" + num);
- t.setDaemon(true);
- return t;
- }
- });
+ pool = Executors.newFixedThreadPool(poolsize);
}
@Override
public SysInfo getSysInfo() {
try {
- return pool.submit(new Callable<SysInfo>() {
- @Override
- public SysInfo call() throws Exception {
- return delegate.getSysInfo();
- }
- }).get();
+ return pool.submit(() -> delegate.getSysInfo()).get();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("Error during getSysInfo", e);
@@ -94,16 +76,13 @@
final Set<URI> sourcesToCompile,
final Set<URI> visibleSources) {
try {
- return pool.submit(new Callable<CompilationResult>() {
- @Override
- public CompilationResult call() throws Exception {
- return delegate.compile(protocolId,
- invocationId,
- args,
- explicitSources,
- sourcesToCompile,
- visibleSources);
- }
+ return pool.submit(() -> {
+ return delegate.compile(protocolId,
+ invocationId,
+ args,
+ explicitSources,
+ sourcesToCompile,
+ visibleSources);
}).get();
} catch (Exception e) {
e.printStackTrace();
@@ -113,6 +92,7 @@
@Override
public void shutdown() {
+ Log.debug("Shutting down PooledSjavac");
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
@@ -122,8 +102,6 @@
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
Log.error("ThreadPool did not terminate");
}
- // Grace period for thread termination
- Thread.sleep(1000);
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PubAPIs.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 1999, 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 com.sun.tools.sjavac.comp;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.lang.model.element.Element;
+import javax.tools.JavaFileObject;
+
+import com.sun.tools.javac.code.Symbol.ClassSymbol;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.Log;
+import com.sun.tools.sjavac.pubapi.PubApi;
+
+/**
+ * Utility class containing public API information.
+ *
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ */
+public class PubAPIs {
+ protected static final Context.Key<PubAPIs> pubApisKey = new Context.Key<>();
+
+ // The log to be used for error reporting.
+ protected Log log;
+
+ // Map from a class name to its public api.
+ // Will the Name encode the module in the future?
+ // If not, this will have to change to map from Module+Name to public api.
+ protected Map<ClassSymbol, PubApi> publicApiPerClass = new HashMap<>();
+
+ public static PubAPIs instance(Context context) {
+ PubAPIs instance = context.get(pubApisKey);
+ if (instance == null)
+ instance = new PubAPIs(context);
+ return instance;
+ }
+
+ private PubAPIs(Context context) {
+ context.put(pubApisKey, this);
+ log = Log.instance(context);
+ }
+
+ /**
+ * Convert the map from class names to their pubapi to a map
+ * from package names to their pubapi.
+ */
+ public Map<String, PubApi> getPubapis(Collection<JavaFileObject> explicitJFOs, boolean explicits) {
+
+ // Maps ":java.lang" to a package level pub api (with only types on top level)
+ Map<String, PubApi> result = new HashMap<>();
+ for (ClassSymbol cs : publicApiPerClass.keySet()) {
+
+ boolean amongExplicits = explicitJFOs.contains(cs.sourcefile);
+ if (explicits != amongExplicits)
+ continue;
+
+ String pkg = ":" + cs.packge().fullname;
+ PubApi currentPubApi = result.getOrDefault(pkg, new PubApi());
+ result.put(pkg, PubApi.mergeTypes(currentPubApi, publicApiPerClass.get(cs)));
+ }
+
+ return result;
+ }
+
+ /**
+ * Visit the api of a class and construct a pubapi and
+ * store it into the pubapi_perclass map.
+ */
+ @SuppressWarnings("deprecation")
+ public void visitPubapi(Element e) {
+
+ // Skip anonymous classes for now
+ if (e == null)
+ return;
+
+ PubapiVisitor v = new PubapiVisitor();
+ v.visit(e);
+ publicApiPerClass.put((ClassSymbol) e, v.getCollectedPubApi());
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PubapiVisitor.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PubapiVisitor.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -25,17 +25,28 @@
package com.sun.tools.sjavac.comp;
-import java.util.Iterator;
+import static javax.lang.model.element.Modifier.PRIVATE;
+
import java.util.List;
-import javax.lang.model.element.Modifier;
+import java.util.stream.Collectors;
+
+import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
+import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.ElementScanner9;
+import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.util.DefinedBy;
import com.sun.tools.javac.util.DefinedBy.Api;
+import com.sun.tools.sjavac.pubapi.PubApi;
+import com.sun.tools.sjavac.pubapi.PubApiTypeParam;
+import com.sun.tools.sjavac.pubapi.PubMethod;
+import com.sun.tools.sjavac.pubapi.PubType;
+import com.sun.tools.sjavac.pubapi.PubVar;
+import com.sun.tools.sjavac.pubapi.TypeDesc;
/** Utility class that constructs a textual representation
* of the public api of a class.
@@ -47,40 +58,67 @@
*/
public class PubapiVisitor extends ElementScanner9<Void, Void> {
- StringBuffer sb;
- // Important that it is 1! Part of protocol over wire, silly yes.
- // Fix please.
- int indent = 1;
+ private PubApi collectedApi = new PubApi();
- public PubapiVisitor(StringBuffer sb) {
- this.sb = sb;
- }
-
- String depth(int l) {
- return " ".substring(0, l);
+ private boolean isNonPrivate(Element e) {
+ return !e.getModifiers().contains(PRIVATE);
}
@Override @DefinedBy(Api.LANGUAGE_MODEL)
public Void visitType(TypeElement e, Void p) {
- if (e.getModifiers().contains(Modifier.PUBLIC)
- || e.getModifiers().contains(Modifier.PROTECTED))
- {
- sb.append(depth(indent) + "TYPE " + e.getQualifiedName() + "\n");
- indent += 2;
- Void v = super.visitType(e, p);
- indent -= 2;
- return v;
+ if (isNonPrivate(e)) {
+ PubApi prevApi = collectedApi;
+ collectedApi = new PubApi();
+ super.visitType(e, p);
+ if (!isAnonymous(e)) {
+ String name = ((ClassSymbol) e).flatname.toString();
+ PubType t = new PubType(e.getModifiers(),
+ name,
+ //e.getQualifiedName().toString(),
+ collectedApi);
+ prevApi.types.put(t.fqName, t);
+ }
+ collectedApi = prevApi;
}
return null;
}
+ private boolean isAnonymous(TypeElement e) {
+ return e.getQualifiedName().length() == 0;
+ }
+
+ private static String encodeChar(int c) {
+ return String.format("\\u%04x", c);
+ }
+
@Override @DefinedBy(Api.LANGUAGE_MODEL)
public Void visitVariable(VariableElement e, Void p) {
- if (e.getModifiers().contains(Modifier.PUBLIC)
- || e.getModifiers().contains(Modifier.PROTECTED)) {
- sb.append(depth(indent)).append("VAR ")
- .append(makeVariableString(e)).append("\n");
+ if (isNonPrivate(e)) {
+ Object constVal = e.getConstantValue();
+ String constValStr = null;
+ // TODO: This doesn't seem to be entirely accurate. What if I change
+ // from, say, 0 to 0L? (And the field is public final static so that
+ // it could get inlined.)
+ if (constVal != null) {
+ if (e.asType().toString().equals("char")) {
+ // What type is 'value'? Is it already a char?
+ char c = constVal.toString().charAt(0);
+ constValStr = "'" + encodeChar(c) + "'";
+ } else {
+ constValStr = constVal.toString()
+ .chars()
+ .mapToObj(PubapiVisitor::encodeChar)
+ .collect(Collectors.joining("", "\"", "\""));
+ }
+ }
+
+ PubVar v = new PubVar(e.getModifiers(),
+ TypeDesc.fromType(e.asType()),
+ e.toString(),
+ constValStr);
+ collectedApi.variables.put(v.identifier, v);
}
+
// Safe to not recurse here, because the only thing
// to visit here is the constructor of a variable declaration.
// If it happens to contain an anonymous inner class (which it might)
@@ -91,70 +129,38 @@
@Override @DefinedBy(Api.LANGUAGE_MODEL)
public Void visitExecutable(ExecutableElement e, Void p) {
- if (e.getModifiers().contains(Modifier.PUBLIC)
- || e.getModifiers().contains(Modifier.PROTECTED)) {
- sb.append(depth(indent)).append("METHOD ")
- .append(makeMethodString(e)).append("\n");
+ if (isNonPrivate(e)) {
+ PubMethod m = new PubMethod(e.getModifiers(),
+ getTypeParameters(e.getTypeParameters()),
+ TypeDesc.fromType(e.getReturnType()),
+ e.getSimpleName().toString(),
+ getTypeDescs(getParamTypes(e)),
+ getTypeDescs(e.getThrownTypes()));
+ collectedApi.methods.put(m.asSignatureString(), m);
}
return null;
}
- /**
- * Creates a String representation of a method element with everything
- * necessary to track all public aspects of it in an API.
- * @param e Element to create String for.
- * @return String representation of element.
- */
- protected String makeMethodString(ExecutableElement e) {
- StringBuilder result = new StringBuilder();
- for (Modifier modifier : e.getModifiers()) {
- result.append(modifier.toString());
- result.append(" ");
- }
- result.append(e.getReturnType().toString());
- result.append(" ");
- result.append(e.toString());
-
- List<? extends TypeMirror> thrownTypes = e.getThrownTypes();
- if (!thrownTypes.isEmpty()) {
- result.append(" throws ");
- for (Iterator<? extends TypeMirror> iterator = thrownTypes
- .iterator(); iterator.hasNext();) {
- TypeMirror typeMirror = iterator.next();
- result.append(typeMirror.toString());
- if (iterator.hasNext()) {
- result.append(", ");
- }
- }
- }
- return result.toString();
+ private List<PubApiTypeParam> getTypeParameters(List<? extends TypeParameterElement> elements) {
+ return elements.stream()
+ .map(e -> new PubApiTypeParam(e.getSimpleName().toString(), getTypeDescs(e.getBounds())))
+ .collect(Collectors.toList());
}
- /**
- * Creates a String representation of a variable element with everything
- * necessary to track all public aspects of it in an API.
- * @param e Element to create String for.
- * @return String representation of element.
- */
- protected String makeVariableString(VariableElement e) {
- StringBuilder result = new StringBuilder();
- for (Modifier modifier : e.getModifiers()) {
- result.append(modifier.toString());
- result.append(" ");
- }
- result.append(e.asType().toString());
- result.append(" ");
- result.append(e.toString());
- Object value = e.getConstantValue();
- if (value != null) {
- result.append(" = ");
- if (e.asType().toString().equals("char")) {
- int v = (int)value.toString().charAt(0);
- result.append("'\\u"+Integer.toString(v,16)+"'");
- } else {
- result.append(value.toString());
- }
- }
- return result.toString();
+ private List<TypeMirror> getParamTypes(ExecutableElement e) {
+ return e.getParameters()
+ .stream()
+ .map(VariableElement::asType)
+ .collect(Collectors.toList());
+ }
+
+ private List<TypeDesc> getTypeDescs(List<? extends TypeMirror> list) {
+ return list.stream()
+ .map(TypeDesc::fromType)
+ .collect(Collectors.toList());
+ }
+
+ public PubApi getCollectedPubApi() {
+ return collectedApi;
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,24 +29,25 @@
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
-import java.nio.file.Paths;
import java.util.Arrays;
+import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.tools.JavaFileObject;
import javax.tools.StandardJavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
-import com.sun.source.tree.CompilationUnitTree;
import com.sun.tools.javac.api.JavacTaskImpl;
import com.sun.tools.javac.api.JavacTool;
-import com.sun.tools.javac.code.Symbol.ClassSymbol;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.Dependencies;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Options;
+import com.sun.tools.sjavac.Log;
import com.sun.tools.sjavac.Util;
-import com.sun.tools.sjavac.comp.dependencies.DependencyCollector;
+import com.sun.tools.sjavac.comp.dependencies.NewDependencyCollector;
import com.sun.tools.sjavac.comp.dependencies.PublicApiCollector;
import com.sun.tools.sjavac.server.CompilationResult;
import com.sun.tools.sjavac.server.Sjavac;
@@ -76,86 +77,79 @@
List<File> explicitSources,
Set<URI> sourcesToCompile,
Set<URI> visibleSources) {
- JavacTool compiler = JavacTool.create();
- try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
- SmartFileManager smartFileManager = new SmartFileManager(fileManager);
+
+ JavacTool compiler = (JavacTool) ToolProvider.getSystemJavaCompiler();
+ try (StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null)) {
+ SmartFileManager sfm = new SmartFileManager(fm);
Context context = new Context();
- // Now setup the actual compilation....
+ Dependencies.GraphDependencies.preRegister(context);
+
+ // Now setup the actual compilation
CompilationResult compilationResult = new CompilationResult(0);
- // First deal with explicit source files on cmdline and in at file.
- ListBuffer<JavaFileObject> compilationUnits = new ListBuffer<>();
- for (JavaFileObject i : fileManager.getJavaFileObjectsFromFiles(explicitSources)) {
- compilationUnits.append(i);
+ // First deal with explicit source files on cmdline and in at file
+ ListBuffer<JavaFileObject> explicitJFOs = new ListBuffer<>();
+ for (JavaFileObject jfo : fm.getJavaFileObjectsFromFiles(explicitSources)) {
+ explicitJFOs.append(SmartFileManager.locWrap(jfo, StandardLocation.SOURCE_PATH));
}
- // Now deal with sources supplied as source_to_compile.
+ // Now deal with sources supplied as source_to_compile
ListBuffer<File> sourcesToCompileFiles = new ListBuffer<>();
- for (URI u : sourcesToCompile) {
+ for (URI u : sourcesToCompile)
sourcesToCompileFiles.append(new File(u));
- }
- for (JavaFileObject i : fileManager.getJavaFileObjectsFromFiles(sourcesToCompileFiles)) {
- compilationUnits.append(i);
- }
- // Create a new logger.
+ for (JavaFileObject jfo : fm.getJavaFileObjectsFromFiles(sourcesToCompileFiles))
+ explicitJFOs.append(SmartFileManager.locWrap(jfo, StandardLocation.SOURCE_PATH));
+
+ // Create a new logger
StringWriter stdoutLog = new StringWriter();
StringWriter stderrLog = new StringWriter();
PrintWriter stdout = new PrintWriter(stdoutLog);
PrintWriter stderr = new PrintWriter(stderrLog);
com.sun.tools.javac.main.Main.Result rc = com.sun.tools.javac.main.Main.Result.OK;
- DependencyCollector depsCollector = new DependencyCollector();
- PublicApiCollector pubApiCollector = new PublicApiCollector();
+ PublicApiCollector pubApiCollector = new PublicApiCollector(context, explicitJFOs);
PathAndPackageVerifier papVerifier = new PathAndPackageVerifier();
+ NewDependencyCollector depsCollector = new NewDependencyCollector(context, explicitJFOs);
try {
- if (compilationUnits.size() > 0) {
- smartFileManager.setVisibleSources(visibleSources);
- smartFileManager.cleanArtifacts();
- smartFileManager.setLog(stdout);
+ if (explicitJFOs.size() > 0) {
+ sfm.setVisibleSources(visibleSources);
+ sfm.cleanArtifacts();
+ sfm.setLog(stdout);
// Do the compilation!
JavacTaskImpl task =
(JavacTaskImpl) compiler.getTask(stderr,
- smartFileManager,
+ sfm,
null,
Arrays.asList(args),
null,
- compilationUnits,
+ explicitJFOs,
context);
- smartFileManager.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file"));
+ sfm.setSymbolFileEnabled(!Options.instance(context).isSet("ignore.symbol.file"));
task.addTaskListener(depsCollector);
task.addTaskListener(pubApiCollector);
task.addTaskListener(papVerifier);
+ logJavacInvocation(args);
rc = task.doCall();
- smartFileManager.flush();
+ Log.debug("javac returned with code " + rc);
+ sfm.flush();
}
} catch (Exception e) {
+ Log.error(Util.getStackTrace(e));
stderrLog.append(Util.getStackTrace(e));
rc = com.sun.tools.javac.main.Main.Result.ERROR;
}
- compilationResult.packageArtifacts = smartFileManager.getPackageArtifacts();
+ compilationResult.packageArtifacts = sfm.getPackageArtifacts();
- Dependencies deps = Dependencies.instance(context);
- for (PackageSymbol from : depsCollector.getSourcePackages()) {
- for (PackageSymbol to : depsCollector.getDependenciesForPkg(from))
- deps.collect(from.fullname, to.fullname);
- }
-
- for (ClassSymbol cs : pubApiCollector.getClassSymbols())
- deps.visitPubapi(cs);
+ if (papVerifier.errorsDiscovered())
+ rc = com.sun.tools.javac.main.Main.Result.ERROR;
- if (papVerifier.getMisplacedCompilationUnits().size() > 0) {
- for (CompilationUnitTree cu : papVerifier.getMisplacedCompilationUnits()) {
- System.err.println("Misplaced compilation unit.");
- System.err.println(" Directory: " + Paths.get(cu.getSourceFile().toUri()).getParent());
- System.err.println(" Package: " + cu.getPackageName());
- }
- rc = com.sun.tools.javac.main.Main.Result.ERROR;
- }
+ compilationResult.packageDependencies = depsCollector.getDependencies(false);
+ compilationResult.packageCpDependencies = depsCollector.getDependencies(true);
- compilationResult.packageDependencies = deps.getDependencies();
- compilationResult.packagePubapis = deps.getPubapis();
+ compilationResult.packagePubapis = pubApiCollector.getPubApis(true); // pubApis.getPubapis(explicitJFOs, true);
+ compilationResult.dependencyPubapis = pubApiCollector.getPubApis(false); // pubApis.getPubapis(explicitJFOs, false);
compilationResult.stdout = stdoutLog.toString();
compilationResult.stderr = stderrLog.toString();
compilationResult.returnCode = rc.exitCode;
@@ -172,10 +166,22 @@
// ... maybe we should wait for any current request to finish?
}
-
@Override
public String serverSettings() {
return "";
}
+ private void logJavacInvocation(String[] args) {
+ Log.debug("Invoking javac with args");
+ Iterator<String> argIter = Arrays.asList(args).iterator();
+ while (argIter.hasNext()) {
+ String arg = argIter.next();
+ String line = " " + arg;
+ if (arg.matches("\\-(d|cp|classpath|sourcepath|source|target)")
+ && argIter.hasNext()) {
+ line += " " + argIter.next();
+ }
+ Log.debug(line);
+ }
+ }
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -91,6 +91,12 @@
((JavacFileManager) fileManager).setSymbolFileEnabled(b);
}
+ @DefinedBy(Api.COMPILER)
+ public String inferBinaryName(Location location, JavaFileObject file) {
+ return super.inferBinaryName(location, locUnwrap(file));
+ }
+
+
public Map<String,Set<URI>> getPackageArtifacts() {
return packageArtifacts;
}
@@ -100,10 +106,11 @@
String packageName,
Set<Kind> kinds,
boolean recurse) throws IOException {
+ // TODO: Do this lazily by returning an iterable with a filtering Iterator
// Acquire the list of files.
Iterable<JavaFileObject> files = super.list(location, packageName, kinds, recurse);
if (visibleSources.isEmpty()) {
- return files;
+ return locWrapMany(files, location);
}
// Now filter!
ListBuffer<JavaFileObject> filteredFiles = new ListBuffer<>();
@@ -116,12 +123,8 @@
filteredFiles.add(f);
}
}
- return filteredFiles;
- }
- @Override @DefinedBy(Api.COMPILER)
- public boolean hasLocation(Location location) {
- return super.hasLocation(location);
+ return locWrapMany(filteredFiles, location);
}
@Override @DefinedBy(Api.COMPILER)
@@ -129,6 +132,7 @@
String className,
Kind kind) throws IOException {
JavaFileObject file = super.getJavaFileForInput(location, className, kind);
+ file = locWrap(file, location);
if (file == null || visibleSources.isEmpty()) {
return file;
}
@@ -145,6 +149,7 @@
Kind kind,
FileObject sibling) throws IOException {
JavaFileObject file = super.getJavaFileForOutput(location, className, kind, sibling);
+ file = locWrap(file, location);
if (file == null) return file;
int dp = className.lastIndexOf('.');
String pkg_name = "";
@@ -162,6 +167,7 @@
String packageName,
String relativeName) throws IOException {
FileObject file = super.getFileForInput(location, packageName, relativeName);
+ file = locWrap(file, location);
if (file == null || visibleSources.isEmpty()) {
return file;
}
@@ -177,11 +183,12 @@
String packageName,
String relativeName,
FileObject sibling) throws IOException {
- FileObject file = super.getFileForOutput(location, packageName, relativeName, sibling);
+ FileObject superFile = super.getFileForOutput(location, packageName, relativeName, sibling);
+ FileObject file = locWrap(superFile, location);
if (file == null) return file;
- if (location.equals(StandardLocation.NATIVE_HEADER_OUTPUT) &&
- file instanceof JavaFileObject) {
- file = new SmartFileObject((JavaFileObject)file, stdout);
+
+ if (location.equals(StandardLocation.NATIVE_HEADER_OUTPUT) && superFile instanceof JavaFileObject) {
+ file = new SmartFileObject((JavaFileObject) file, stdout);
packageName = ":" + packageNameFromFileName(relativeName);
}
if (packageName.equals("")) {
@@ -191,7 +198,7 @@
return file;
}
- private String packageNameFromFileName(String fn) {
+ private static String packageNameFromFileName(String fn) {
StringBuilder sb = new StringBuilder();
int p = fn.indexOf('_'), pp = 0;
while (p != -1) {
@@ -204,16 +211,6 @@
return sb.toString();
}
- @Override @DefinedBy(Api.COMPILER)
- public void flush() throws IOException {
- super.flush();
- }
-
- @Override @DefinedBy(Api.COMPILER)
- public void close() throws IOException {
- super.close();
- }
-
void addArtifact(String pkgName, URI art) {
Set<URI> s = packageArtifacts.get(pkgName);
if (s == null) {
@@ -222,4 +219,50 @@
}
s.add(art);
}
+
+ public static JavaFileObject locWrap(JavaFileObject jfo, Location loc) {
+
+ // From sjavac's perspective platform classes are not interesting and
+ // there is no need to track the location for these file objects.
+ // Also, there exists some jfo instanceof checks which breaks if
+ // the jfos for platform classes are wrapped.
+ if (loc == StandardLocation.PLATFORM_CLASS_PATH)
+ return jfo;
+
+ return jfo == null ? null : new JavaFileObjectWithLocation<>(jfo, loc);
+ }
+
+ private static FileObject locWrap(FileObject fo, Location loc) {
+ if (fo instanceof JavaFileObject)
+ return locWrap((JavaFileObject) fo, loc);
+ return fo == null ? null : new FileObjectWithLocation<>(fo, loc);
+ }
+
+ @DefinedBy(Api.COMPILER)
+ @Override
+ public boolean isSameFile(FileObject a, FileObject b) {
+ return super.isSameFile(locUnwrap(a), locUnwrap(b));
+ }
+
+ private static ListBuffer<JavaFileObject> locWrapMany(Iterable<JavaFileObject> jfos,
+ Location loc) {
+ ListBuffer<JavaFileObject> locWrapped = new ListBuffer<>();
+ for (JavaFileObject f : jfos)
+ locWrapped.add(locWrap(f, loc));
+ return locWrapped;
+ }
+
+ private static FileObject locUnwrap(FileObject fo) {
+ if (fo instanceof FileObjectWithLocation<?>)
+ return ((FileObjectWithLocation<?>) fo).getDelegate();
+ if (fo instanceof JavaFileObjectWithLocation<?>)
+ return ((JavaFileObjectWithLocation<?>) fo).getDelegate();
+ return fo;
+ }
+
+ private static JavaFileObject locUnwrap(JavaFileObject fo) {
+ if (fo instanceof JavaFileObjectWithLocation<?>)
+ return ((JavaFileObjectWithLocation<?>) fo).getDelegate();
+ return fo;
+ }
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/Dependency.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.tools.sjavac.comp.dependencies;
-
-import java.util.Set;
-
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
-
-interface Dependency {
- Set<PackageSymbol> getPackages();
-}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/DependencyCollector.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.tools.sjavac.comp.dependencies;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import com.sun.source.util.TaskEvent;
-import com.sun.source.util.TaskListener;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
-import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
-import com.sun.tools.javac.util.DefinedBy;
-import com.sun.tools.javac.util.DefinedBy.Api;
-import com.sun.tools.sjavac.Util;
-
-public class DependencyCollector implements TaskListener {
-
- Map<PackageSymbol, Set<PackageSymbol>> collectedDependencies = new HashMap<>();
-
- @Override
- @DefinedBy(Api.COMPILER_TREE)
- public void started(TaskEvent e) {
- }
-
- @Override
- @DefinedBy(Api.COMPILER_TREE)
- public void finished(TaskEvent e) {
- if (e.getKind() == TaskEvent.Kind.ANALYZE) {
- JCCompilationUnit cu = (JCCompilationUnit) e.getCompilationUnit();
- PackageSymbol thisPkg = cu.packge;
- if (thisPkg == null) {
- // Compilation unit in default package. See JDK-8048144.
- return;
- }
- DependencyScanner ds = new DependencyScanner();
- cu.accept(ds);
- Set<PackageSymbol> pkgDeps = ds.getResult()
- .stream()
- .flatMap(dep -> dep.getPackages().stream())
- .collect(Collectors.toSet());
- collectedDependencies.merge(thisPkg, pkgDeps, Util::union);
- }
- }
-
- public Set<PackageSymbol> getSourcePackages() {
- return collectedDependencies.keySet();
- }
-
- public Set<PackageSymbol> getDependenciesForPkg(PackageSymbol ps) {
- return collectedDependencies.get(ps);
- }
-}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/DependencyScanner.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.tools.sjavac.comp.dependencies;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import com.sun.tools.javac.code.Symbol;
-import com.sun.tools.javac.code.Symbol.ClassSymbol;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
-import com.sun.tools.javac.code.Type;
-import com.sun.tools.javac.code.TypeTag;
-import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
-import com.sun.tools.javac.tree.JCTree.JCIdent;
-import com.sun.tools.javac.tree.TreeScanner;
-
-class DependencyScanner extends TreeScanner {
-
- public final Set<Dependency> dependencies = new HashSet<>();
-
- private boolean isValidDependency(Type t) {
- if (t == null || t.isPrimitiveOrVoid() || t.isErroneous())
- return false;
- TypeTag tag = t.getTag();
- return tag != TypeTag.PACKAGE
- && tag != TypeTag.METHOD
- && tag != TypeTag.ARRAY
- && tag != TypeTag.TYPEVAR;
- }
-
- @Override
- public void visitIdent(JCIdent tree) {
- if (isValidDependency(tree.type))
- dependencies.add(new TypeAndSupertypesDependency(tree.type.tsym));
- super.visitIdent(tree);
- }
-
- @Override
- public void visitSelect(JCFieldAccess tree) {
- if (tree.getIdentifier().contentEquals("*")) {
- Symbol sym = tree.selected instanceof JCIdent ? ((JCIdent) tree.selected).sym
- : ((JCFieldAccess) tree.selected).sym;
- if (sym instanceof ClassSymbol) {
- ClassSymbol clsSym = (ClassSymbol) sym;
- dependencies.add(new TypeAndSupertypesDependency(clsSym.type.tsym));
- } else {
- dependencies.add(new PackageDependency((PackageSymbol) sym));
- }
- } else if (tree.type != null && tree.type.hasTag(TypeTag.METHOD)) { // Method call? Depend on the result (even though we never access it elsewhere)
- Type retType = tree.type.getReturnType();
- if (isValidDependency(retType))
- dependencies.add(new TypeAndSupertypesDependency(retType.tsym));
- } else if (isValidDependency(tree.type)) {
- dependencies.add(new TypeAndSupertypesDependency(tree.type.tsym));
- }
- super.visitSelect(tree);
- }
-
- public Set<Dependency> getResult() {
- return dependencies;
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/NewDependencyCollector.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,158 @@
+/*
+ * 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 com.sun.tools.sjavac.comp.dependencies;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.tools.JavaFileManager.Location;
+import javax.tools.JavaFileObject;
+import javax.tools.StandardLocation;
+
+import com.sun.source.util.TaskEvent;
+import com.sun.source.util.TaskListener;
+import com.sun.tools.javac.code.Symbol.ClassSymbol;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.util.DefinedBy;
+import com.sun.tools.javac.util.DefinedBy.Api;
+import com.sun.tools.javac.util.Dependencies.GraphDependencies;
+import com.sun.tools.javac.util.Dependencies.GraphDependencies.CompletionNode;
+import com.sun.tools.javac.util.GraphUtils.Node;
+import com.sun.tools.sjavac.Util;
+import com.sun.tools.sjavac.comp.JavaFileObjectWithLocation;
+import com.sun.tools.sjavac.comp.PubAPIs;
+
+
+public class NewDependencyCollector implements TaskListener {
+
+ private final Context context;
+ private final Collection<JavaFileObject> explicitJFOs;
+
+ private Map<String, Map<String, Set<String>>> deps;
+ private Map<String, Map<String, Set<String>>> cpDeps;
+
+ public NewDependencyCollector(Context context,
+ Collection<JavaFileObject> explicitJFOs) {
+ this.context = context;
+ this.explicitJFOs = explicitJFOs;
+ }
+
+ @Override
+ @DefinedBy(Api.COMPILER_TREE)
+ public void finished(TaskEvent e) {
+ if (e.getKind() == TaskEvent.Kind.COMPILATION) {
+ collectPubApisOfDependencies(context, explicitJFOs);
+ deps = getDependencies(context, explicitJFOs, false);
+ cpDeps = getDependencies(context, explicitJFOs, true);
+ }
+ }
+
+ public Map<String, Map<String, Set<String>>> getDependencies(boolean cp) {
+ return cp ? cpDeps : deps;
+ }
+
+ private Set<CompletionNode> getDependencyNodes(Context context,
+ Collection<JavaFileObject> explicitJFOs,
+ boolean explicits) {
+ GraphDependencies deps = (GraphDependencies) GraphDependencies.instance(context);
+
+ return deps.getNodes()
+ .stream()
+ .filter(n -> n instanceof CompletionNode)
+ .map(n -> (CompletionNode) n)
+ .filter(n -> n.getClassSymbol().fullname != null)
+ .filter(n -> explicits == explicitJFOs.contains(n.getClassSymbol().classfile))
+ .collect(Collectors.toSet());
+ }
+
+ private void collectPubApisOfDependencies(Context context,
+ Collection<JavaFileObject> explicitJFOs) {
+ PubAPIs pubApis = PubAPIs.instance(context);
+ for (CompletionNode cDepNode : getDependencyNodes(context, explicitJFOs, false)) {
+ ClassSymbol cs = cDepNode.getClassSymbol().outermostClass();
+ Location loc = getLocationOf(cs);
+ // We're completely ignorant of PLATFORM_CLASS_PATH classes
+ if (loc == StandardLocation.CLASS_PATH || loc == StandardLocation.SOURCE_PATH)
+ pubApis.visitPubapi(cs);
+ }
+ }
+
+ private Location getLocationOf(ClassSymbol cs) {
+ JavaFileObject jfo = cs.outermostClass().classfile;
+ if (jfo instanceof JavaFileObjectWithLocation) {
+ return ((JavaFileObjectWithLocation<?>) jfo).getLocation();
+ }
+
+ // jfo is most likely on PLATFORM_CLASS_PATH.
+ // See notes in SmartFileManager::locWrap
+
+ return null;
+ }
+
+ // :Package -> fully qualified class name [from] -> set of fully qualified class names [to]
+ private Map<String, Map<String, Set<String>>> getDependencies(Context context,
+ Collection<JavaFileObject> explicitJFOs,
+ boolean cp) {
+ Map<String, Map<String, Set<String>>> result = new HashMap<>();
+
+ for (CompletionNode cnode : getDependencyNodes(context, explicitJFOs, true)) {
+
+ String fqDep = cnode.getClassSymbol().outermostClass().flatname.toString();
+ String depPkg = Util.pkgNameOfClassName(fqDep);
+
+ Map<String, Set<String>> depsForThisClass = result.get(depPkg);
+ if (depsForThisClass == null)
+ result.put(depPkg, depsForThisClass = new HashMap<>());
+
+ for (Node<?,?> depNode : cnode.getDependenciesByKind(GraphDependencies.Node.DependencyKind.REQUIRES)) {
+ boolean isCompletionNode = depNode instanceof CompletionNode;
+ if (isCompletionNode) {
+ CompletionNode cDepNode = (CompletionNode) depNode;
+ if (cDepNode == cnode)
+ continue;
+ if (cDepNode.getClassSymbol().fullname == null) // Anonymous class
+ continue;
+ Location depLoc = getLocationOf(cDepNode.getClassSymbol());
+ boolean relevant = (cp && depLoc == StandardLocation.CLASS_PATH)
+ || (!cp && depLoc == StandardLocation.SOURCE_PATH);
+ if (!relevant)
+ continue;
+
+ Set<String> fqDeps = depsForThisClass.get(fqDep);
+ if (fqDeps == null)
+ depsForThisClass.put(fqDep, fqDeps = new HashSet<>());
+ fqDeps.add(cDepNode.getClassSymbol().outermostClass().flatname.toString());
+ }
+ }
+ }
+ return result;
+ }
+
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/PackageDependency.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.tools.sjavac.comp.dependencies;
-
-import java.util.Collections;
-import java.util.Set;
-
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
-
-public class PackageDependency implements Dependency {
- PackageSymbol ps;
- public PackageDependency(PackageSymbol ps) {
- this.ps = ps;
- }
- @Override
- public Set<PackageSymbol> getPackages() {
- return Collections.singleton(ps);
- }
-}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/PublicApiCollector.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/PublicApiCollector.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,40 +22,91 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+
package com.sun.tools.sjavac.comp.dependencies;
+import java.util.Collection;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
+import javax.tools.JavaFileObject;
+
import com.sun.source.tree.Tree;
import com.sun.source.util.TaskEvent;
import com.sun.source.util.TaskListener;
import com.sun.tools.javac.code.Symbol.ClassSymbol;
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
+import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
+import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.DefinedBy;
import com.sun.tools.javac.util.DefinedBy.Api;
+import com.sun.tools.sjavac.Log;
+import com.sun.tools.sjavac.comp.PubAPIs;
+import com.sun.tools.sjavac.pubapi.PubApi;
+
public class PublicApiCollector implements TaskListener {
- final Set<ClassSymbol> classSymbols = new HashSet<>();
+ private Context context;
+ private final Set<ClassSymbol> classSymbols = new HashSet<>();
+ private final Collection<JavaFileObject> explicitJFOs;
- @Override
- @DefinedBy(Api.COMPILER_TREE)
- public void started(TaskEvent e) {
+ // Result collected upon compilation task finished
+ private Map<String, PubApi> explicitPubApis;
+ private Map<String, PubApi> nonExplicitPubApis;
+
+ public PublicApiCollector(Context context,
+ Collection<JavaFileObject> explicitJFOs) {
+ this.context = context;
+ this.explicitJFOs = explicitJFOs;
}
@Override
@DefinedBy(Api.COMPILER_TREE)
public void finished(TaskEvent e) {
- if (e.getKind() == TaskEvent.Kind.ANALYZE) {
- for (Tree t : e.getCompilationUnit().getTypeDecls()) {
- if (t instanceof JCClassDecl) // Can also be a JCSkip
- classSymbols.add(((JCClassDecl) t).sym);
- }
+ switch (e.getKind()) {
+ case ANALYZE:
+ collectClassSymbols((JCCompilationUnit) e.getCompilationUnit());
+ break;
+ case COMPILATION:
+ Log.debug("Compilation finished");
+ Log.debug("Extracting pub APIs for the following symbols:");
+ for (ClassSymbol cs : classSymbols)
+ Log.debug(" " + cs.fullname);
+ extractPubApis();
+
+ // Save result for later retrieval. (Important that we do this
+ // before we return from this method, because we may not access
+ // symbols after compilation is finished.)
+ PubAPIs pa = PubAPIs.instance(context);
+ explicitPubApis = pa.getPubapis(explicitJFOs, true);
+ nonExplicitPubApis = pa.getPubapis(explicitJFOs, false);
+
+ Log.debug("done");
+ break;
}
}
- public Set<ClassSymbol> getClassSymbols() {
- return classSymbols;
+ private void collectClassSymbols(JCCompilationUnit cu) {
+ for (Tree t : cu.getTypeDecls()) {
+ if (t instanceof JCClassDecl) // Can also be a JCSkip
+ classSymbols.add(((JCClassDecl) t).sym);
+ }
+ }
+
+ private void extractPubApis() {
+ // To handle incremental builds (subsequent sjavac invocations) we need
+ // to keep track of the public API of what we depend upon.
+ //
+ // During the recompilation loop (within a single sjavac invocation) we
+ // need to keep track of public API of what we're compiling to decide if
+ // any dependants needs to be tainted.
+ PubAPIs pubApis = PubAPIs.instance(context);
+ classSymbols.forEach(pubApis::visitPubapi);
+ }
+
+ public Map<String, PubApi> getPubApis(boolean explicit) {
+ return explicit ? explicitPubApis : nonExplicitPubApis;
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/TypeAndSupertypesDependency.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.sun.tools.sjavac.comp.dependencies;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import com.sun.tools.javac.code.Symbol.ClassSymbol;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
-import com.sun.tools.javac.code.Symbol.TypeSymbol;
-import com.sun.tools.javac.code.Kinds;
-import com.sun.tools.javac.code.Type;
-
-import static com.sun.tools.javac.code.Kinds.Kind.*;
-
-public class TypeAndSupertypesDependency implements Dependency {
-
- protected TypeSymbol type;
-
- public TypeAndSupertypesDependency(TypeSymbol type) {
- this.type = Objects.requireNonNull(type);
- }
-
- private Set<TypeSymbol> allSupertypes(TypeSymbol t) {
- if (t == null)
- return Collections.emptySet();
- Set<TypeSymbol> result = new HashSet<>();
- result.add(t);
- if (t instanceof ClassSymbol) {
- ClassSymbol cs = (ClassSymbol) t;
- result.addAll(allSupertypes(cs.getSuperclass().tsym));
- for (Type it : cs.getInterfaces())
- result.addAll(allSupertypes(it.tsym));
- }
- return result;
- }
-
- @Override
- public Set<PackageSymbol> getPackages() {
- if (type.kind == ERR)
- return Collections.emptySet();
- if (type instanceof ClassSymbol) {
- return allSupertypes(type).stream()
- .map(TypeSymbol::packge)
- .collect(Collectors.toSet());
- }
- throw new AssertionError("Could not get package name for " + type);
- }
-}
-
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/options/Options.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/options/Options.java Thu Jun 25 07:13:27 2015 +0000
@@ -316,9 +316,19 @@
args.add(concatenateSourceLocations(classSearchPaths));
}
+ // Enable dependency generation
+ args.add("-XDcompletionDeps=source,class");
+
// This can't be anything but 'none'. Enforced by sjavac main method.
args.add("-implicit:" + implicitPolicy);
+ // If this option is not used, Object for instance is erroneously
+ // picked up from PLATFORM_CLASS_PATH instead of CLASS_PATH.
+ //
+ // Discussing this further led to the decision of letting bootclasspath
+ // be a dummy (empty) directory when building the JDK.
+ //args.add("-XXuserPathsFirst");
+
// Append javac-options (i.e. pass through options not recognized by
// sjavac to javac.)
args.addAll(javacArgs);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/ArrayTypeDesc.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+
+import javax.lang.model.type.TypeKind;
+
+public class ArrayTypeDesc extends TypeDesc implements Serializable {
+
+ private static final long serialVersionUID = -1177329549163314996L;
+
+ TypeDesc compTypeDesc;
+
+ public ArrayTypeDesc(TypeDesc compTypeDesc) {
+ super(TypeKind.ARRAY);
+ this.compTypeDesc = compTypeDesc;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!super.equals(obj))
+ return false;
+ return compTypeDesc.equals(((ArrayTypeDesc) obj).compTypeDesc);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() ^ compTypeDesc.hashCode();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/PrimitiveTypeDesc.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+
+import javax.lang.model.type.TypeKind;
+
+import com.sun.tools.javac.util.StringUtils;
+
+public class PrimitiveTypeDesc extends TypeDesc implements Serializable {
+
+ private static final long serialVersionUID = 6051065543149129106L;
+
+ public PrimitiveTypeDesc(TypeKind typeKind) {
+ super(typeKind);
+ if (!typeKind.isPrimitive() && typeKind != TypeKind.VOID)
+ throw new IllegalArgumentException("Only primitives or void accepted");
+ }
+
+ // This class has no fields, so the inherited hashCode and equals should do fine.
+
+ @Override
+ public String toString() {
+ return StringUtils.toLowerCase(typeKind.toString());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/PubApi.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,434 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+
+import static com.sun.tools.sjavac.Util.union;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.lang.model.element.Modifier;
+
+import com.sun.tools.javac.util.Assert;
+import com.sun.tools.javac.util.StringUtils;
+
+public class PubApi implements Serializable {
+
+ private static final long serialVersionUID = 5926627347801986850L;
+
+ // Used to have Set here. Problem is that the objects are mutated during
+ // javac_state loading, causing them to change hash codes. We could probably
+ // change back to Set once javac_state loading is cleaned up.
+ public final Map<String, PubType> types = new HashMap<>();
+ public final Map<String, PubVar> variables = new HashMap<>();
+ public final Map<String, PubMethod> methods = new HashMap<>();
+
+ public PubApi() {
+ }
+
+ public PubApi(Collection<PubType> types,
+ Collection<PubVar> variables,
+ Collection<PubMethod> methods) {
+ types.forEach(this::addPubType);
+ variables.forEach(this::addPubVar);
+ methods.forEach(this::addPubMethod);
+ }
+
+ // Currently this is implemented as equality. This is far from optimal. It
+ // should preferably make sure that all previous methods are still available
+ // and no abstract methods are added. It should also be aware of inheritance
+ // of course.
+ public boolean isBackwardCompatibleWith(PubApi older) {
+ return equals(older);
+ }
+
+ private static String typeLine(PubType type) {
+ if (type.fqName.isEmpty())
+ throw new RuntimeException("empty class name " + type);
+ return String.format("TYPE %s%s", asString(type.modifiers), type.fqName);
+ }
+
+ private static String varLine(PubVar var) {
+ return String.format("VAR %s%s %s%s",
+ asString(var.modifiers),
+ TypeDesc.encodeAsString(var.type),
+ var.identifier,
+ var.getConstValue().map(v -> " = " + v).orElse(""));
+ }
+
+ private static String methodLine(PubMethod method) {
+ return String.format("METHOD %s%s%s %s(%s)%s",
+ asString(method.modifiers),
+ method.typeParams.isEmpty() ? "" : ("<" + method.typeParams.stream().map(PubApiTypeParam::asString).collect(Collectors.joining(",")) + "> "),
+ TypeDesc.encodeAsString(method.returnType),
+ method.identifier,
+ commaSeparated(method.paramTypes),
+ method.throwDecls.isEmpty()
+ ? ""
+ : " throws " + commaSeparated(method.throwDecls));
+ }
+
+ public List<String> asListOfStrings() {
+ List<String> lines = new ArrayList<>();
+
+ // Types
+ types.values()
+ .stream()
+ .sorted(Comparator.comparing(PubApi::typeLine))
+ .forEach(type -> {
+ lines.add(typeLine(type));
+ for (String subline : type.pubApi.asListOfStrings())
+ lines.add(" " + subline);
+ });
+
+ // Variables
+ variables.values()
+ .stream()
+ .map(PubApi::varLine)
+ .sorted()
+ .forEach(lines::add);
+
+ // Methods
+ methods.values()
+ .stream()
+ .map(PubApi::methodLine)
+ .sorted()
+ .forEach(lines::add);
+
+ return lines;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (getClass() != obj.getClass())
+ return false;
+ PubApi other = (PubApi) obj;
+ return types.equals(other.types)
+ && variables.equals(other.variables)
+ && methods.equals(other.methods);
+ }
+
+ @Override
+ public int hashCode() {
+ return types.keySet().hashCode()
+ ^ variables.keySet().hashCode()
+ ^ methods.keySet().hashCode();
+ }
+
+ private static String commaSeparated(List<TypeDesc> typeDescs) {
+ return typeDescs.stream()
+ .map(TypeDesc::encodeAsString)
+ .collect(Collectors.joining(","));
+ }
+
+ // Create space separated list of modifiers (with a trailing space)
+ private static String asString(Set<Modifier> modifiers) {
+ return modifiers.stream()
+ .map(mod -> mod + " ")
+ .sorted()
+ .collect(Collectors.joining());
+ }
+
+ // Used to combine class PubApis to package level PubApis
+ public static PubApi mergeTypes(PubApi api1, PubApi api2) {
+ Assert.check(api1.methods.isEmpty(), "Can only merge types.");
+ Assert.check(api2.methods.isEmpty(), "Can only merge types.");
+ Assert.check(api1.variables.isEmpty(), "Can only merge types.");
+ Assert.check(api2.variables.isEmpty(), "Can only merge types.");
+ PubApi merged = new PubApi();
+ merged.types.putAll(api1.types);
+ merged.types.putAll(api2.types);
+ return merged;
+ }
+
+
+ // Used for line-by-line parsing
+ private PubType lastInsertedType = null;
+
+ private final static String MODIFIERS = Stream.of(Modifier.values())
+ .map(Modifier::name)
+ .map(StringUtils::toLowerCase)
+ .collect(Collectors.joining("|", "(", ")"));
+
+ private final static Pattern MOD_PATTERN = Pattern.compile("(" + MODIFIERS + " )*");
+ private final static Pattern METHOD_PATTERN = Pattern.compile("(?<ret>.+?) (?<name>\\S+)\\((?<params>.*)\\)( throws (?<throws>.*))?");
+ private final static Pattern VAR_PATTERN = Pattern.compile("VAR (?<modifiers>("+MODIFIERS+" )*)(?<type>.+?) (?<id>\\S+)( = (?<val>.*))?");
+ private final static Pattern TYPE_PATTERN = Pattern.compile("TYPE (?<modifiers>("+MODIFIERS+" )*)(?<fullyQualified>\\S+)");
+
+ public void appendItem(String l) {
+ try {
+ if (l.startsWith(" ")) {
+ lastInsertedType.pubApi.appendItem(l.substring(2));
+ return;
+ }
+
+ if (l.startsWith("METHOD")) {
+ l = l.substring("METHOD ".length());
+ Set<Modifier> modifiers = new HashSet<>();
+ Matcher modMatcher = MOD_PATTERN.matcher(l);
+ if (modMatcher.find()) {
+ String modifiersStr = modMatcher.group();
+ modifiers.addAll(parseModifiers(modifiersStr));
+ l = l.substring(modifiersStr.length());
+ }
+ List<PubApiTypeParam> typeParams = new ArrayList<>();
+ if (l.startsWith("<")) {
+ int closingPos = findClosingTag(l, 0);
+ String str = l.substring(1, closingPos);
+ l = l.substring(closingPos+1);
+ typeParams.addAll(parseTypeParams(splitOnTopLevelCommas(str)));
+ }
+ Matcher mm = METHOD_PATTERN.matcher(l);
+ if (!mm.matches())
+ throw new AssertionError("Could not parse return type, identifier, parameter types or throws declaration of method: " + l);
+
+ List<String> params = splitOnTopLevelCommas(mm.group("params"));
+ String th = Optional.ofNullable(mm.group("throws")).orElse("");
+ List<String> throwz = splitOnTopLevelCommas(th);
+ PubMethod m = new PubMethod(modifiers,
+ typeParams,
+ TypeDesc.decodeString(mm.group("ret")),
+ mm.group("name"),
+ parseTypeDescs(params),
+ parseTypeDescs(throwz));
+ addPubMethod(m);
+ return;
+ }
+
+ Matcher vm = VAR_PATTERN.matcher(l);
+ if (vm.matches()) {
+ addPubVar(new PubVar(parseModifiers(vm.group("modifiers")),
+ TypeDesc.decodeString(vm.group("type")),
+ vm.group("id"),
+ vm.group("val")));
+ return;
+ }
+
+ Matcher tm = TYPE_PATTERN.matcher(l);
+ if (tm.matches()) {
+ addPubType(new PubType(parseModifiers(tm.group("modifiers")),
+ tm.group("fullyQualified"),
+ new PubApi()));
+ return;
+ }
+
+ throw new AssertionError("No matching line pattern.");
+ } catch (Throwable e) {
+ throw new AssertionError("Could not parse API line: " + l, e);
+ }
+ }
+
+ public void addPubType(PubType t) {
+ types.put(t.fqName, t);
+ lastInsertedType = t;
+ }
+
+ public void addPubVar(PubVar v) {
+ variables.put(v.identifier, v);
+ }
+
+ public void addPubMethod(PubMethod m) {
+ methods.put(m.asSignatureString(), m);
+ }
+
+ private static List<TypeDesc> parseTypeDescs(List<String> strs) {
+ return strs.stream()
+ .map(TypeDesc::decodeString)
+ .collect(Collectors.toList());
+ }
+
+ private static List<PubApiTypeParam> parseTypeParams(List<String> strs) {
+ return strs.stream().map(PubApi::parseTypeParam).collect(Collectors.toList());
+ }
+
+ // Parse a type parameter string. Example input:
+ // identifier
+ // identifier extends Type (& Type)*
+ private static PubApiTypeParam parseTypeParam(String typeParamString) {
+ int extPos = typeParamString.indexOf(" extends ");
+ if (extPos == -1)
+ return new PubApiTypeParam(typeParamString, Collections.emptyList());
+ String identifier = typeParamString.substring(0, extPos);
+ String rest = typeParamString.substring(extPos + " extends ".length());
+ List<TypeDesc> bounds = parseTypeDescs(splitOnTopLevelChars(rest, '&'));
+ return new PubApiTypeParam(identifier, bounds);
+ }
+
+ public Set<Modifier> parseModifiers(String modifiers) {
+ if (modifiers == null)
+ return Collections.emptySet();
+ return Stream.of(modifiers.split(" "))
+ .map(String::trim)
+ .map(StringUtils::toUpperCase)
+ .filter(s -> !s.isEmpty())
+ .map(Modifier::valueOf)
+ .collect(Collectors.toSet());
+ }
+
+ // Find closing tag of the opening tag at the given 'pos'.
+ private static int findClosingTag(String l, int pos) {
+ while (true) {
+ pos = pos + 1;
+ if (l.charAt(pos) == '>')
+ return pos;
+ if (l.charAt(pos) == '<')
+ pos = findClosingTag(l, pos);
+ }
+ }
+
+ public List<String> splitOnTopLevelCommas(String s) {
+ return splitOnTopLevelChars(s, ',');
+ }
+
+ public static List<String> splitOnTopLevelChars(String s, char split) {
+ if (s.isEmpty())
+ return Collections.emptyList();
+ List<String> result = new ArrayList<>();
+ StringBuilder buf = new StringBuilder();
+ int depth = 0;
+ for (char c : s.toCharArray()) {
+ if (c == split && depth == 0) {
+ result.add(buf.toString().trim());
+ buf = new StringBuilder();
+ } else {
+ if (c == '<') depth++;
+ if (c == '>') depth--;
+ buf.append(c);
+ }
+ }
+ result.add(buf.toString().trim());
+ return result;
+ }
+
+ public boolean isEmpty() {
+ return types.isEmpty() && variables.isEmpty() && methods.isEmpty();
+ }
+
+ // Used for descriptive debug messages when figuring out what triggers
+ // recompilation.
+ public List<String> diff(PubApi prevApi) {
+ return diff("", prevApi);
+ }
+ private List<String> diff(String scopePrefix, PubApi prevApi) {
+
+ List<String> diffs = new ArrayList<>();
+
+ for (String typeKey : union(types.keySet(), prevApi.types.keySet())) {
+ PubType type = types.get(typeKey);
+ PubType prevType = prevApi.types.get(typeKey);
+ if (prevType == null) {
+ diffs.add("Type " + scopePrefix + typeKey + " was added");
+ } else if (type == null) {
+ diffs.add("Type " + scopePrefix + typeKey + " was removed");
+ } else {
+ // Check modifiers
+ if (!type.modifiers.equals(prevType.modifiers)) {
+ diffs.add("Modifiers for type " + scopePrefix + typeKey
+ + " changed from " + prevType.modifiers + " to "
+ + type.modifiers);
+ }
+
+ // Recursively check types pub API
+ diffs.addAll(type.pubApi.diff(prevType.pubApi));
+ }
+ }
+
+ for (String varKey : union(variables.keySet(), prevApi.variables.keySet())) {
+ PubVar var = variables.get(varKey);
+ PubVar prevVar = prevApi.variables.get(varKey);
+ if (prevVar == null) {
+ diffs.add("Variable " + scopePrefix + varKey + " was added");
+ } else if (var == null) {
+ diffs.add("Variable " + scopePrefix + varKey + " was removed");
+ } else {
+ if (!var.modifiers.equals(prevVar.modifiers)) {
+ diffs.add("Modifiers for var " + scopePrefix + varKey
+ + " changed from " + prevVar.modifiers + " to "
+ + var.modifiers);
+ }
+ if (!var.type.equals(prevVar.type)) {
+ diffs.add("Type of " + scopePrefix + varKey
+ + " changed from " + prevVar.type + " to "
+ + var.type);
+ }
+ if (!var.getConstValue().equals(prevVar.getConstValue())) {
+ diffs.add("Const value of " + scopePrefix + varKey
+ + " changed from " + prevVar.getConstValue().orElse("<none>")
+ + " to " + var.getConstValue().orElse("<none>"));
+ }
+ }
+ }
+
+ for (String methodKey : union(methods.keySet(), prevApi.methods.keySet())) {
+ PubMethod method = methods.get(methodKey);
+ PubMethod prevMethod = prevApi.methods.get(methodKey);
+ if (prevMethod == null) {
+ diffs.add("Method " + scopePrefix + methodKey + " was added");
+ } else if (method == null) {
+ diffs.add("Method " + scopePrefix + methodKey + " was removed");
+ } else {
+ if (!method.modifiers.equals(prevMethod.modifiers)) {
+ diffs.add("Modifiers for method " + scopePrefix + methodKey
+ + " changed from " + prevMethod.modifiers + " to "
+ + method.modifiers);
+ }
+ if (!method.typeParams.equals(prevMethod.typeParams)) {
+ diffs.add("Type parameters for method " + scopePrefix
+ + methodKey + " changed from " + prevMethod.typeParams
+ + " to " + method.typeParams);
+ }
+ if (!method.throwDecls.equals(prevMethod.throwDecls)) {
+ diffs.add("Throw decl for method " + scopePrefix + methodKey
+ + " changed from " + prevMethod.throwDecls + " to "
+ + " to " + method.throwDecls);
+ }
+ }
+ }
+
+ return diffs;
+ }
+
+ public String toString() {
+ return String.format("%s[types: %s, variables: %s, methods: %s]",
+ getClass().getSimpleName(),
+ types.values(),
+ variables.values(),
+ methods.values());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/PubApiTypeParam.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,49 @@
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PubApiTypeParam implements Serializable {
+
+ private static final long serialVersionUID = 8899204612014329162L;
+
+ private final String identifier;
+ private final List<TypeDesc> bounds;
+
+ public PubApiTypeParam(String identifier, List<TypeDesc> bounds) {
+ this.identifier = identifier;
+ this.bounds = bounds;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (getClass() != obj.getClass())
+ return false;
+ PubApiTypeParam other = (PubApiTypeParam) obj;
+ return identifier.equals(other.identifier)
+ && bounds.equals(other.bounds);
+ }
+
+ @Override
+ public int hashCode() {
+ return identifier.hashCode() ^ bounds.hashCode();
+ }
+
+ public String asString() {
+ if (bounds.isEmpty())
+ return identifier;
+ String boundsStr = bounds.stream()
+ .map(TypeDesc::encodeAsString)
+ .collect(Collectors.joining(" & "));
+ return identifier + " extends " + boundsStr;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s[id: %s, bounds: %s]",
+ getClass().getSimpleName(),
+ identifier,
+ bounds);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/PubMethod.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.lang.model.element.Modifier;
+
+public class PubMethod implements Serializable {
+
+ private static final long serialVersionUID = -7813050194553446243L;
+
+ Set<Modifier> modifiers;
+ List<PubApiTypeParam> typeParams;
+ TypeDesc returnType;
+ String identifier;
+ List<TypeDesc> paramTypes;
+ List<TypeDesc> throwDecls;
+
+ public PubMethod(Set<Modifier> modifiers,
+ List<PubApiTypeParam> typeParams,
+ TypeDesc returnType,
+ String identifier,
+ List<TypeDesc> paramTypes,
+ List<TypeDesc> throwDecls) {
+ this.modifiers = modifiers;
+ this.typeParams = typeParams;
+ this.returnType = returnType;
+ this.identifier = identifier;
+ this.paramTypes = paramTypes;
+ this.throwDecls = throwDecls;
+ }
+
+ // We need to include return type and type parameters to be sure to have
+ // different values for different methods. (A method can be overloaded with
+ // the only difference being the upper bound of the return type.)
+ public String asSignatureString() {
+ StringBuilder sb = new StringBuilder();
+
+ // <A extends String, Serializable, B extends List>
+ if (typeParams.size() > 0) {
+ sb.append(typeParams.stream()
+ .map(PubApiTypeParam::asString)
+ .collect(Collectors.joining(",", "<", "> ")));
+ }
+ sb.append(TypeDesc.encodeAsString(returnType));
+ sb.append(" ");
+ sb.append(identifier);
+ sb.append("(");
+ sb.append(paramTypes.stream()
+ .map(TypeDesc::encodeAsString)
+ .collect(Collectors.joining(",")));
+ sb.append(")");
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (getClass() != obj.getClass())
+ return false;
+ PubMethod other = (PubMethod) obj;
+ return modifiers.equals(other.modifiers)
+ && typeParams.equals(other.typeParams)
+ && returnType.equals(other.returnType)
+ && identifier.equals(other.identifier)
+ && paramTypes.equals(other.paramTypes)
+ && throwDecls.equals(other.throwDecls);
+ }
+
+ @Override
+ public int hashCode() {
+ return modifiers.hashCode()
+ ^ typeParams.hashCode()
+ ^ returnType.hashCode()
+ ^ identifier.hashCode()
+ ^ paramTypes.hashCode()
+ ^ throwDecls.hashCode();
+ }
+
+ public String toString() {
+ return String.format("%s[modifiers: %s, typeParams: %s, retType: %s, identifier: %s, params: %s, throws: %s]",
+ getClass().getSimpleName(),
+ modifiers,
+ typeParams,
+ returnType,
+ identifier,
+ paramTypes,
+ throwDecls);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/PubType.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+import java.util.Set;
+
+import javax.lang.model.element.Modifier;
+
+public class PubType implements Serializable {
+
+ private static final long serialVersionUID = -7423416049253889793L;
+
+ public final Set<Modifier> modifiers;
+ public final String fqName;
+ public final PubApi pubApi;
+
+ public PubType(Set<Modifier> modifiers,
+ String fqName,
+ PubApi pubApi) {
+ this.modifiers = modifiers;
+ this.fqName = fqName;
+ this.pubApi = pubApi;
+ }
+
+ public String getFqName() {
+ return fqName.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (getClass() != obj.getClass())
+ return false;
+ PubType other = (PubType) obj;
+ return modifiers.equals(other.modifiers)
+ && fqName.equals(other.fqName)
+ && pubApi.equals(other.pubApi);
+ }
+
+ @Override
+ public int hashCode() {
+ return modifiers.hashCode() ^ fqName.hashCode() ^ pubApi.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s[modifiers: %s, fqName: %s, pubApi: %s]",
+ getClass().getSimpleName(),
+ modifiers,
+ fqName,
+ pubApi);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/PubVar.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+import java.util.Optional;
+import java.util.Set;
+
+import javax.lang.model.element.Modifier;
+
+public class PubVar implements Serializable {
+
+ private static final long serialVersionUID = 5806536061153374575L;
+
+ public final Set<Modifier> modifiers;
+ public final TypeDesc type;
+ public final String identifier;
+ private final String constValue;
+
+ public PubVar(Set<Modifier> modifiers,
+ TypeDesc type,
+ String identifier,
+ String constValue) {
+ this.modifiers = modifiers;
+ this.type = type;
+ this.identifier = identifier;
+ this.constValue = constValue;
+ }
+
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (getClass() != obj.getClass())
+ return false;
+ PubVar other = (PubVar) obj;
+ return modifiers.equals(other.modifiers)
+ && type.equals(other.type)
+ && identifier.equals(other.identifier)
+ && getConstValue().equals(other.getConstValue());
+ }
+
+ @Override
+ public int hashCode() {
+ return modifiers.hashCode()
+ ^ type.hashCode()
+ ^ identifier.hashCode()
+ ^ getConstValue().hashCode();
+ }
+
+ public String toString() {
+ return String.format("%s[modifiers: %s, type: %s, identifier: %s, constValue: %s]",
+ getClass().getSimpleName(),
+ modifiers,
+ type,
+ identifier,
+ constValue);
+ }
+
+ public Optional<String> getConstValue() {
+ return Optional.ofNullable(constValue);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/ReferenceTypeDesc.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+
+import javax.lang.model.type.TypeKind;
+
+public class ReferenceTypeDesc extends TypeDesc implements Serializable {
+
+ private static final long serialVersionUID = 3357616754544796372L;
+
+ // Example: "java.util.Vector<java.lang.String>"
+ String javaType;
+
+ public ReferenceTypeDesc(String javaType) {
+ super(TypeKind.DECLARED);
+ this.javaType = javaType;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!super.equals(obj))
+ return false;
+ return javaType.equals(((ReferenceTypeDesc) obj).javaType);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() ^ javaType.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s[type: %s]", getClass().getSimpleName(), javaType);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/TypeDesc.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+
+import javax.lang.model.type.ArrayType;
+import javax.lang.model.type.DeclaredType;
+import javax.lang.model.type.ErrorType;
+import javax.lang.model.type.NoType;
+import javax.lang.model.type.PrimitiveType;
+import javax.lang.model.type.TypeKind;
+import javax.lang.model.type.TypeMirror;
+import javax.lang.model.type.TypeVariable;
+import javax.lang.model.type.TypeVisitor;
+import javax.lang.model.util.SimpleTypeVisitor9;
+
+import com.sun.tools.javac.code.Type.ClassType;
+import com.sun.tools.javac.util.DefinedBy;
+import com.sun.tools.javac.util.DefinedBy.Api;
+import com.sun.tools.javac.util.StringUtils;
+
+public abstract class TypeDesc implements Serializable {
+
+ private static final long serialVersionUID = -8201634143915519172L;
+
+ TypeKind typeKind;
+
+ public TypeDesc(TypeKind typeKind) {
+ this.typeKind = typeKind;
+ }
+
+ public static TypeDesc decodeString(String s) {
+ s = s.trim();
+ if (s.endsWith("[]")) {
+ String componentPart = s.substring(0, s.length()-2);
+ return new ArrayTypeDesc(decodeString(componentPart));
+ }
+
+ if (s.startsWith("#"))
+ return new TypeVarTypeDesc(s.substring(1));
+
+ if (s.matches("boolean|byte|char|double|float|int|long|short|void")) {
+ TypeKind tk = TypeKind.valueOf(StringUtils.toUpperCase(s));
+ return new PrimitiveTypeDesc(tk);
+ }
+
+ return new ReferenceTypeDesc(s);
+ }
+
+ public static String encodeAsString(TypeDesc td) {
+ if (td.typeKind.isPrimitive() || td.typeKind == TypeKind.VOID)
+ return StringUtils.toLowerCase(td.typeKind.toString());
+
+ if (td.typeKind == TypeKind.ARRAY)
+ return encodeAsString(((ArrayTypeDesc) td).compTypeDesc) + "[]";
+
+ if (td.typeKind == TypeKind.TYPEVAR)
+ return "#" + ((TypeVarTypeDesc) td).identifier;
+
+ if (td.typeKind == TypeKind.DECLARED)
+ return ((ReferenceTypeDesc) td).javaType.toString();
+
+ throw new AssertionError("Unhandled type: " + td.typeKind);
+ }
+
+ public static TypeDesc fromType(TypeMirror type) {
+ TypeVisitor<TypeDesc, Void> v = new SimpleTypeVisitor9<TypeDesc, Void>() {
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public TypeDesc visitArray(ArrayType t, Void p) {
+ return new ArrayTypeDesc(t.getComponentType().accept(this, p));
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public TypeDesc visitDeclared(DeclaredType t, Void p) {
+ return new ReferenceTypeDesc(((ClassType) t).tsym.flatName().toString());
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public TypeDesc visitNoType(NoType t, Void p) {
+ return new PrimitiveTypeDesc(TypeKind.VOID);
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public TypeDesc visitTypeVariable(TypeVariable t, Void p) {
+ return new TypeVarTypeDesc(t.toString());
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public TypeDesc visitPrimitive(PrimitiveType t, Void p) {
+ return new PrimitiveTypeDesc(t.getKind());
+ }
+
+ @Override @DefinedBy(Api.LANGUAGE_MODEL)
+ public TypeDesc visitError(ErrorType t, Void p) {
+ return new ReferenceTypeDesc("<error type>");
+ }
+ };
+
+ TypeDesc td = v.visit(type);
+ if (td == null)
+ throw new AssertionError("Unhandled type mirror: " + type + " (" + type.getClass() + ")");
+ return td;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (getClass() != obj.getClass())
+ return false;
+ return typeKind.equals(((TypeDesc) obj).typeKind);
+ }
+
+ @Override
+ public int hashCode() {
+ return typeKind.hashCode();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/pubapi/TypeVarTypeDesc.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.sjavac.pubapi;
+
+import java.io.Serializable;
+
+import javax.lang.model.type.TypeKind;
+
+public class TypeVarTypeDesc extends TypeDesc implements Serializable {
+
+ private static final long serialVersionUID = 3357616754544796373L;
+
+ String identifier; // Example: "T"
+
+ public TypeVarTypeDesc(String identifier) {
+ super(TypeKind.TYPEVAR);
+ this.identifier = identifier;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!super.equals(obj))
+ return false;
+ return identifier.equals(((TypeVarTypeDesc) obj).identifier);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() ^ identifier.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s[identifier: %s]",
+ getClass().getSimpleName(),
+ identifier);
+ }
+}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/CompilationResult.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/CompilationResult.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,8 @@
import java.util.Map;
import java.util.Set;
+import com.sun.tools.sjavac.pubapi.PubApi;
+
/**
*
* <p><b>This is NOT part of any supported API.
@@ -47,8 +49,10 @@
public int returnCode;
public Map<String, Set<URI>> packageArtifacts = new HashMap<>();
- public Map<String, Set<String>> packageDependencies = new HashMap<>();
- public Map<String, String> packagePubapis = new HashMap<>();
+ public Map<String, Map<String, Set<String>>> packageDependencies = new HashMap<>();
+ public Map<String, Map<String, Set<String>>> packageCpDependencies = new HashMap<>();
+ public Map<String, PubApi> packagePubapis = new HashMap<>();
+ public Map<String, PubApi> dependencyPubapis = new HashMap<>();
public String stdout = "";
public String stderr = "";
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,8 @@
import java.io.IOException;
+import com.sun.tools.sjavac.Log;
+
/**
* <p><b>This is NOT part of any supported API.
* If you write code that depends on this, you do so at your own risk.
@@ -36,6 +38,8 @@
public class ServerMain {
public static int run(String[] args) {
+ Log.initializeLog(System.out, System.err);
+
// Any options other than --startserver?
if (args.length > 1) {
System.err.println("When spawning a background server, only a single --startserver argument is allowed.");
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,12 +1,12 @@
/*
* @test /nodynamiccopyright/
- * @bug 8026564
+ * @bug 8026564 8074346
* @summary The parts of a fully-qualified type can't be annotated.
* @author Werner Dietl
- * @ignore 8057679 clarify error messages trying to annotate scoping
* @compile/fail/ref=CantAnnotatePackages.out -XDrawDiagnostics CantAnnotatePackages.java
*/
+
import java.lang.annotation.*;
import java.util.List;
@@ -21,6 +21,8 @@
java. @TA lang.Object of3;
List<java. @TA lang.Object> of4;
+ List<@CantAnnotatePackages_TB java.lang.Object> of5; // test that we do reasonable things for missing types.
+
// TODO: also note the order of error messages.
}
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotatePackages.out Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,7 @@
-CantAnnotatePackages.java:14:13: compiler.err.cant.type.annotate.scoping.1: @TA
-CantAnnotatePackages.java:19:18: compiler.err.cant.type.annotate.scoping.1: @TA
-CantAnnotatePackages.java:20:19: compiler.err.cant.type.annotate.scoping.1: @TA
-CantAnnotatePackages.java:21:24: compiler.err.cant.type.annotate.scoping.1: @TA
-4 errors
+CantAnnotatePackages.java:20:14: compiler.err.cant.type.annotate.scoping.1: TA
+CantAnnotatePackages.java:21:9: compiler.err.cant.type.annotate.scoping.1: TA
+CantAnnotatePackages.java:22:14: compiler.err.cant.type.annotate.scoping.1: TA
+CantAnnotatePackages.java:24:11: compiler.err.cant.resolve.location: kindname.class, CantAnnotatePackages_TB, , , (compiler.misc.location: kindname.class, CantAnnotatePackages, null)
+CantAnnotatePackages.java:24:35: compiler.err.cant.type.annotate.scoping.1: CantAnnotatePackages_TB
+CantAnnotatePackages.java:15:18: compiler.err.cant.type.annotate.scoping.1: @TA
+6 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,18 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8074346
+ * @author sadayapalam
+ * @summary Test that type annotation on a qualified type doesn't cause spurious 'cannot find symbol' errors
+ * @compile/fail/ref=T8074346.out -XDrawDiagnostics T8074346.java
+*/
+
+abstract class T8074346 implements
+ @T8074346_TA @T8074346_TB java.util.Map<@T8074346_TA java.lang.String, java.lang.@T8074346_TA String>,
+ java.util.@T8074346_TA List {
+}
+
+@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE)
+@interface T8074346_TA { }
+
+@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE)
+@interface T8074346_TB { }
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/T8074346.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,3 @@
+T8074346.java:10:35: compiler.err.cant.type.annotate.scoping: T8074346_TA,T8074346_TB
+T8074346.java:10:62: compiler.err.cant.type.annotate.scoping.1: T8074346_TA
+2 errors
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/pos/NestedDiamondAllocationTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8081521
+ * @summary Ensure that anonymous class construction using <> can be nested within another
+ * @compile NestedDiamondAllocationTest.java
+ * @run main NestedDiamondAllocationTest
+ *
+ */
+
+public class NestedDiamondAllocationTest {
+ static class Clazz2 {
+ static class A {
+ };
+ public A a;
+ }
+ static class FooNest<Q> {
+ FooNest(Q q, Foo<Q> foo) {
+ }
+ }
+
+ static class Foo<T> {
+ }
+
+ static Clazz2 clazz = new Clazz2();
+
+ public static void main(String [] args) {
+ FooNest fooNest = new FooNest<>(clazz.a, new Foo<>() {
+ });
+ }
+}
--- a/langtools/test/tools/javac/generics/typeargs/Metharg1.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typeargs/Metharg1.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,33 +1,10 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4851039
* @summary explicit type arguments
* @author gafter
*
- * @compile/fail Metharg1.java
+ * @compile/fail/ref=Metharg1.out -XDrawDiagnostics Metharg1.java
*/
// Test type mismatch on type argument for method call
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typeargs/Metharg1.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+Metharg1.java:33:13: compiler.err.cant.apply.symbol: kindname.method, f, K, java.lang.String, kindname.class, T<X>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
+1 error
--- a/langtools/test/tools/javac/generics/typeargs/Metharg2.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typeargs/Metharg2.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,33 +1,10 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4851039
* @summary explicit type arguments
* @author gafter
*
- * @compile/fail Metharg2.java
+ * @compile/fail/ref=Metharg2.out -XDrawDiagnostics Metharg2.java
*/
// Test type mismatch on type argument for qualified method call
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typeargs/Metharg2.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+Metharg2.java:39:10: compiler.err.cant.apply.symbol: kindname.method, f, K, java.lang.String, kindname.class, T<X>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
+1 error
--- a/langtools/test/tools/javac/generics/typeargs/Newarg1.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typeargs/Newarg1.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,33 +1,10 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4851039
* @summary explicit type arguments
* @author gafter
*
- * @compile/fail Newarg1.java
+ * @compile/fail/ref=Newarg1.out -XDrawDiagnostics Newarg1.java
*/
// Test type mismatch on type argument for constructor
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typeargs/Newarg1.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+Newarg1.java:18:9: compiler.err.cant.apply.symbol: kindname.constructor, T, K, java.lang.String, kindname.class, T<X>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
+1 error
--- a/langtools/test/tools/javac/generics/typeargs/Newarg2.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typeargs/Newarg2.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,33 +1,10 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4851039
* @summary explicit type arguments
* @author gafter
*
- * @compile/fail Newarg2.java
+ * @compile/fail/ref=Newarg2.out -XDrawDiagnostics Newarg2.java
*/
// Test type mismatch on type argument for inner constructor
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typeargs/Newarg2.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+Newarg2.java:19:17: compiler.err.cant.apply.symbol: kindname.constructor, U, B, java.lang.String, kindname.class, T.U<Y>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
+1 error
--- a/langtools/test/tools/javac/generics/typeargs/Superarg1.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typeargs/Superarg1.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,33 +1,10 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4851039
* @summary explicit type arguments
* @author gafter
*
- * @compile/fail Superarg1.java
+ * @compile/fail/ref=Superarg1.out -XDrawDiagnostics Superarg1.java
*/
// Test type mismatch on type argument for super constructor
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typeargs/Superarg1.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+Superarg1.java:16:13: compiler.err.cant.apply.symbol: kindname.constructor, T, A, java.lang.String, kindname.class, T<X>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))
+1 error
--- a/langtools/test/tools/javac/generics/typeargs/Superarg2.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typeargs/Superarg2.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,33 +1,10 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4851039
* @summary explicit type arguments
* @author gafter
*
- * @compile/fail Superarg2.java
+ * @compile/fail/ref=Superarg2.out -XDrawDiagnostics Superarg2.java
*/
// Test type mismatch on type argument for inner super constructor
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typeargs/Superarg2.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+Superarg2.java:25:14: compiler.err.cant.apply.symbols: kindname.constructor, U, java.lang.String,{(compiler.misc.inapplicable.method: kindname.constructor, T.U, <B>T.U(B), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))),(compiler.misc.inapplicable.method: kindname.constructor, T.U, T.U(int), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, int)))}
+1 error
--- a/langtools/test/tools/javac/generics/typeargs/ThisArg.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typeargs/ThisArg.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,33 +1,10 @@
/*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4851039
* @summary explicit type arguments
* @author gafter
*
- * @compile/fail ThisArg.java
+ * @compile/fail/ref=ThisArg.out -XDrawDiagnostics ThisArg.java
*/
// Test type mismatch on type argument for this constructor
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typeargs/ThisArg.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+ThisArg.java:19:13: compiler.err.cant.apply.symbols: kindname.constructor, U, java.lang.String,{(compiler.misc.inapplicable.method: kindname.constructor, T.U, <B>T.U(B), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, java.lang.Integer))),(compiler.misc.inapplicable.method: kindname.constructor, T.U, T.U(int), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: java.lang.String, int)))}
+1 error
--- a/langtools/test/tools/javac/generics/typevars/4856983/T4856983.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typevars/4856983/T4856983.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 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
--- a/langtools/test/tools/javac/generics/typevars/4856983/T4856983a.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typevars/4856983/T4856983a.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,32 +1,9 @@
/*
- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4856983
* @summary (crash) mutually f-bounded type vars with multiple bounds may crash javac
* @author Peter von der Ah\u00e9
- * @compile/fail T4856983a.java
+ * @compile/fail/ref=T4856983a.out -XDrawDiagnostics T4856983a.java
*/
interface I1 { Number m(); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typevars/4856983/T4856983a.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+T4856983a.java:13:6: compiler.err.types.incompatible.diff.ret: I2, I1, m()
+1 error
--- a/langtools/test/tools/javac/generics/typevars/4856983/T4856983b.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typevars/4856983/T4856983b.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,32 +1,9 @@
/*
- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 4856983
* @summary (crash) mutually f-bounded type vars with multiple bounds may crash javac
* @author Peter von der Ah\u00e9
- * @compile/fail T4856983b.java
+ * @compile/fail/ref=T4856983b.out -XDrawDiagnostics T4856983b.java
*/
interface I1 { Number m(); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typevars/4856983/T4856983b.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,2 @@
+T4856983b.java:12:24: compiler.err.types.incompatible.diff.ret: I2, I1, m()
+1 error
--- a/langtools/test/tools/javac/generics/typevars/6182630/T6182630.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/javac/generics/typevars/6182630/T6182630.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,39 +1,9 @@
/*
- * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved.
- * 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
+ * @test /nodynamiccopyright/
* @bug 6182630
* @summary Method with parameter bound to raw type avoids unchecked warning
* @author Peter von der Ah\u00e9
- * @compile -Xlint:unchecked T6182630.java
- * @compile/fail -Werror -Xlint:unchecked T6182630.java
- * @compile/fail -Werror -Xlint:unchecked T6182630a.java
- * @compile/fail -Werror -Xlint:unchecked T6182630b.java
- * @compile/fail -Werror -Xlint:unchecked T6182630c.java
- * @compile/fail -Werror -Xlint:unchecked T6182630d.java
- * @compile/fail -Werror -Xlint:unchecked T6182630e.java
- * @compile/fail -Werror -Xlint:unchecked T6182630f.java
+ * @compile/ref=T6182630.out -XDrawDiagnostics -Xlint:unchecked T6182630.java
*/
public class T6182630 {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/typevars/6182630/T6182630.out Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,7 @@
+T6182630.java:16:10: compiler.warn.unchecked.assign.to.var: x, T6182630.Foo
+T6182630.java:17:12: compiler.warn.unchecked.call.mbr.of.raw.type: m(X), T6182630.Foo
+T6182630.java:18:12: compiler.warn.unchecked.call.mbr.of.raw.type: m(X), T6182630.Foo
+T6182630.java:19:10: compiler.warn.unchecked.assign.to.var: x, T6182630.Foo
+T6182630.java:20:12: compiler.warn.unchecked.call.mbr.of.raw.type: m(X), T6182630.Foo
+T6182630.java:21:12: compiler.warn.unchecked.call.mbr.of.raw.type: m(X), T6182630.Foo
+6 warnings
--- a/langtools/test/tools/javac/generics/typevars/6182630/T6182630a.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.
- */
-
-public class T6182630a {
- static class Foo<X> {
- public X x;
- public void m(X x) { }
- }
- interface Bar {}
- <T extends Foo, S extends Foo & Bar> void test1(T t, S s) {
- t.x = "BAD";
- }
-}
--- a/langtools/test/tools/javac/generics/typevars/6182630/T6182630b.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.
- */
-
-public class T6182630b {
- static class Foo<X> {
- public X x;
- public void m(X x) { }
- }
- interface Bar {}
- <T extends Foo, S extends Foo & Bar> void test1(T t, S s) {
- t.m("BAD");
- }
-}
--- a/langtools/test/tools/javac/generics/typevars/6182630/T6182630c.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.
- */
-
-public class T6182630c {
- static class Foo<X> {
- public X x;
- public void m(X x) { }
- }
- interface Bar {}
- <T extends Foo, S extends Foo & Bar> void test1(T t, S s) {
- t.m(t.x);
- }
-}
--- a/langtools/test/tools/javac/generics/typevars/6182630/T6182630d.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.
- */
-
-public class T6182630d {
- static class Foo<X> {
- public X x;
- public void m(X x) { }
- }
- interface Bar {}
- <T extends Foo, S extends Foo & Bar> void test1(T t, S s) {
- s.x = "BAD";
- }
-}
--- a/langtools/test/tools/javac/generics/typevars/6182630/T6182630e.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.
- */
-
-public class T6182630e {
- static class Foo<X> {
- public X x;
- public void m(X x) { }
- }
- interface Bar {}
- <T extends Foo, S extends Foo & Bar> void test1(T t, S s) {
- s.m("BAD");
- }
-}
--- a/langtools/test/tools/javac/generics/typevars/6182630/T6182630f.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
- * 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.
- */
-
-public class T6182630f {
- static class Foo<X> {
- public X x;
- public void m(X x) { }
- }
- interface Bar {}
- <T extends Foo, S extends Foo & Bar> void test1(T t, S s) {
- s.m(s.x);
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/resolve/BitWiseOperators.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**@test
+ * @bug 8082311
+ * @summary Verify that bitwise operators don't allow to mix numeric and boolean operands.
+ * @library ../lib
+ */
+
+import com.sun.tools.javac.util.StringUtils;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
+import javax.tools.DiagnosticCollector;
+import javax.tools.JavaFileObject;
+import javax.tools.SimpleJavaFileObject;
+
+public class BitWiseOperators extends JavacTestingAbstractThreadedTest {
+ public static void main(String... args) {
+ new BitWiseOperators().run();
+ }
+
+ void run() {
+ for (TYPE type1 : TYPE.values()) {
+ for (OPERATION op : OPERATION.values()) {
+ for (TYPE type2 : TYPE.values()) {
+ runTest(type1, op, type2);
+ }
+ }
+ }
+ }
+
+ void runTest(TYPE type1, OPERATION op, TYPE type2) {
+ DiagnosticCollector<JavaFileObject> dc = new DiagnosticCollector<>();
+ List<JavaSource> files = Arrays.asList(new JavaSource(type1, op, type2));
+ comp.getTask(null, null, dc, null, null, files).call();
+ if (dc.getDiagnostics().isEmpty() ^ TYPE.compatible(type1, type2)) {
+ throw new AssertionError("Unexpected behavior. Type1: " + type1 +
+ "; type2: " + type2 +
+ "; diagnostics: " + dc.getDiagnostics());
+ }
+ }
+
+ enum TYPE {
+ BYTE,
+ CHAR,
+ SHORT,
+ INT,
+ LONG,
+ BOOLEAN;
+
+ public static boolean compatible(TYPE op1, TYPE op2) {
+ return !(op1 == BOOLEAN ^ op2 == BOOLEAN);
+ }
+ }
+
+ enum OPERATION {
+ BITAND("&"),
+ BITOR("|"),
+ BITXOR("^");
+
+ String op;
+
+ private OPERATION(String op) {
+ this.op = op;
+ }
+
+ }
+
+ class JavaSource extends SimpleJavaFileObject {
+
+ String template = "class Test {\n" +
+ " public Object test(#TYPE1 var1, #TYPE2 var2) {\n" +
+ " return var1 #OP var2;\n" +
+ " }\n" +
+ "}";
+
+ String source;
+
+ public JavaSource(TYPE type1, OPERATION op, TYPE type2) {
+ super(URI.create("myfo:/Test.java"), JavaFileObject.Kind.SOURCE);
+ source = template.replaceAll("#TYPE1", StringUtils.toLowerCase(type1.name()))
+ .replaceAll("#OP", StringUtils.toLowerCase(op.op))
+ .replaceAll("#TYPE2", StringUtils.toLowerCase(type2.name()));
+ }
+
+ @Override
+ public CharSequence getCharContent(boolean ignoreEncodingErrors) {
+ return source;
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/sjavac/ApiExtraction.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,214 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8054717
+ * @summary Make sure extraction of non-private APIs work as expected.
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.file
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.compiler/com.sun.tools.sjavac
+ * @build Wrapper ToolBox
+ * @run main Wrapper ApiExtraction
+ */
+import static java.util.Arrays.asList;
+import static java.util.Collections.emptyList;
+import static javax.lang.model.element.Modifier.FINAL;
+import static javax.lang.model.element.Modifier.PROTECTED;
+import static javax.lang.model.element.Modifier.PUBLIC;
+import static javax.lang.model.element.Modifier.STATIC;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.lang.model.type.TypeKind;
+
+import com.sun.tools.sjavac.PubApiExtractor;
+import com.sun.tools.sjavac.options.Options;
+import com.sun.tools.sjavac.pubapi.PrimitiveTypeDesc;
+import com.sun.tools.sjavac.pubapi.PubApi;
+import com.sun.tools.sjavac.pubapi.PubMethod;
+import com.sun.tools.sjavac.pubapi.PubType;
+import com.sun.tools.sjavac.pubapi.PubVar;
+import com.sun.tools.sjavac.pubapi.ReferenceTypeDesc;
+
+
+public class ApiExtraction {
+ public static void main(String[] args) throws IOException {
+
+ String testSrc = String.join("\n",
+ "import java.util.*;",
+ "public final class TestClass extends Thread {",
+
+ // Fields with various combination of modifiers
+ " private String s1 = \"str 1\";",
+ " public String s2 = \"str 2\";",
+ " protected final String s3 = \"str 3\";",
+ " static String s4 = \"str 4\";",
+
+ // Methods with various combinations of types and modifiers
+ " protected void m1() {}",
+ " public static Map<Integer, List<String>> m2() {",
+ " return null;",
+ " }",
+ " final void m3(Set<Map<Integer, Map<String, String>>> s) {}",
+
+ // Some inner classes
+ " static class DummyInner1 implements Runnable {",
+ " protected int field;",
+ " public void run() {}",
+ " }",
+ " final class DummyInner2 { }",
+ "}");
+
+ // Create class file to extract API from
+ new ToolBox().new JavacTask().sources(testSrc).run();
+
+ // Extract PubApi
+ Options options = Options.parseArgs("-d", "bin", "-cp", ".");
+ PubApiExtractor pubApiExtr = new PubApiExtractor(options);
+ PubApi actualApi = pubApiExtr.getPubApi("TestClass");
+
+ // Validate result
+ PubApi expectedApi = getExpectedPubApi();
+ if (!expectedApi.equals(actualApi)) {
+ List<String> diffs = expectedApi.diff(actualApi);
+ System.out.println(diffs.size() + " differences found.");
+ for (String diff : diffs) {
+ System.out.println(diff);
+ }
+ throw new AssertionError("Actual API differs from expected API.");
+ }
+ }
+
+ private static PubApi getExpectedPubApi() {
+
+ ReferenceTypeDesc string = new ReferenceTypeDesc("java.lang.String");
+
+ // Fields
+ // (s1 is private and therefore not included)
+ PubVar s2 = new PubVar(setOf(PUBLIC), string, "s2", null);
+ PubVar s4 = new PubVar(setOf(STATIC), string, "s4", null);
+ PubVar s3 = new PubVar(setOf(PROTECTED, FINAL), string, "s3",
+ "\"\\u0073\\u0074\\u0072\\u0020\\u0033\"");
+
+ // Methods
+ PubMethod init = new PubMethod(setOf(PUBLIC),
+ emptyList(),
+ new PrimitiveTypeDesc(TypeKind.VOID),
+ "<init>",
+ emptyList(),
+ emptyList());
+
+ PubMethod clinit = new PubMethod(setOf(STATIC),
+ emptyList(),
+ new PrimitiveTypeDesc(TypeKind.VOID),
+ "<clinit>",
+ emptyList(),
+ emptyList());
+
+ PubMethod m1 = new PubMethod(setOf(PROTECTED),
+ emptyList(),
+ new PrimitiveTypeDesc(TypeKind.VOID),
+ "m1",
+ emptyList(),
+ emptyList());
+
+ PubMethod m2 = new PubMethod(setOf(PUBLIC, STATIC),
+ emptyList(),
+ new ReferenceTypeDesc("java.util.Map"),
+ "m2",
+ emptyList(),
+ emptyList());
+
+ PubMethod m3 = new PubMethod(setOf(FINAL),
+ emptyList(),
+ new PrimitiveTypeDesc(TypeKind.VOID),
+ "m3",
+ asList(new ReferenceTypeDesc("java.util.Set")),
+ emptyList());
+
+ // Complete class
+ PubType testClass = new PubType(setOf(PUBLIC, FINAL),
+ "TestClass",
+ new PubApi(asList(getDummyInner1(), getDummyInner2()),
+ asList(s2, s3, s4),
+ asList(init, clinit, m1, m2, m3)));
+
+ // Wrap in "package level" PubApi
+ return new PubApi(asList(testClass), emptyList(), emptyList());
+ }
+
+ private static PubType getDummyInner1() {
+ PubMethod init = new PubMethod(setOf(),
+ emptyList(),
+ new PrimitiveTypeDesc(TypeKind.VOID),
+ "<init>",
+ emptyList(),
+ emptyList());
+
+ PubMethod run = new PubMethod(setOf(PUBLIC),
+ emptyList(),
+ new PrimitiveTypeDesc(TypeKind.VOID),
+ "run",
+ emptyList(),
+ emptyList());
+
+ PubVar field = new PubVar(setOf(PROTECTED),
+ new PrimitiveTypeDesc(TypeKind.INT),
+ "field",
+ null);
+
+ return new PubType(setOf(STATIC),
+ "TestClass$DummyInner1",
+ new PubApi(emptyList(),
+ asList(field),
+ asList(init, run)));
+ }
+
+ private static PubType getDummyInner2() {
+ PubMethod init = new PubMethod(setOf(),
+ emptyList(),
+ new PrimitiveTypeDesc(TypeKind.VOID),
+ "<init>",
+ emptyList(),
+ emptyList());
+
+ return new PubType(setOf(FINAL),
+ "TestClass$DummyInner2",
+ new PubApi(emptyList(),
+ emptyList(),
+ asList(init)));
+ }
+
+ @SafeVarargs
+ private static <T> Set<T> setOf(T... elements) {
+ return new HashSet<>(asList(elements));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/sjavac/ClasspathDependencies.java Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,142 @@
+/*
+ * 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.
+ */
+
+/*
+ * @test
+ * @bug 8054717
+ * @summary Make sure changes of public API on classpath triggers recompilation
+ * @library /tools/lib
+ * @modules jdk.compiler/com.sun.tools.javac.api
+ * jdk.compiler/com.sun.tools.javac.file
+ * jdk.compiler/com.sun.tools.javac.main
+ * jdk.compiler/com.sun.tools.sjavac
+ * @build Wrapper ToolBox
+ * @run main Wrapper ClasspathDependencies
+ */
+
+import static com.sun.tools.javac.util.Assert.check;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
+
+public class ClasspathDependencies extends SjavacBase {
+
+ static final String server = "--server:portfile=testserver,background=false";
+
+ public static void main(String... args) throws Exception {
+
+ Path root = Paths.get(ClasspathDependencies.class.getSimpleName() + "Test");
+
+ delete(root);
+
+ Path src = root.resolve("src");
+ Path classes = root.resolve("classes");
+ Path srcDep = root.resolve("srcDep");
+ Path classesDep = root.resolve("classesDep");
+
+ ////////////////////////////////////////////////////////////////////////
+ headline("Create a test dependency, Dep.class, and put it in the classpath dir");
+ String depCode = "package dep; public class Dep { public void m1() {} }";
+ toolbox.writeFile(srcDep.resolve("dep/Dep.java"), depCode);
+ int rc = compile(server, "-d", classesDep, srcDep);
+ check(rc == 0, "Compilation failed unexpectedly");
+
+ ////////////////////////////////////////////////////////////////////////
+ headline("Compile and link against the Dep.class");
+ toolbox.writeFile(src.resolve("pkg/C.java"),
+ "package pkg;" +
+ "import dep.Dep;" +
+ "public class C { Dep dep; public void m() { new Dep().m1(); } }");
+ rc = compile(server, "-d", classes, src, "-cp", classesDep);
+ check(rc == 0, "Compilation failed unexpectedly");
+ FileTime modTime1 = Files.getLastModifiedTime(classes.resolve("pkg/C.class"));
+
+ ////////////////////////////////////////////////////////////////////////
+ headline("Update dependency (without changing the public api)");
+ Thread.sleep(2000);
+ depCode = depCode.replaceAll("}$", "private void m2() {} }");
+ toolbox.writeFile(srcDep.resolve("dep/Dep.java"), depCode);
+ rc = compile(server, "-d", classesDep, srcDep);
+ check(rc == 0, "Compilation failed unexpectedly");
+
+ ////////////////////////////////////////////////////////////////////////
+ headline("Make sure that this does not trigger recompilation of C.java");
+ rc = compile(server, "-d", classes, src, "-cp", classesDep);
+ check(rc == 0, "Compilation failed unexpectedly");
+ FileTime modTime2 = Files.getLastModifiedTime(classes.resolve("pkg/C.class"));
+ check(modTime1.equals(modTime2), "Recompilation erroneously triggered");
+
+ ////////////////////////////////////////////////////////////////////////
+ headline("Update public API of dependency");
+ Thread.sleep(2000);
+ depCode = depCode.replace("m1()", "m1(String... arg)");
+ toolbox.writeFile(srcDep.resolve("dep/Dep.java"), depCode);
+ rc = compile(server, "-d", classesDep, srcDep);
+ check(rc == 0, "Compilation failed unexpectedly");
+
+ ////////////////////////////////////////////////////////////////////////
+ headline("Make sure that recompilation of C.java is triggered");
+ rc = compile(server, "-d", classes, src, "-cp", classesDep);
+ check(rc == 0, "Compilation failed unexpectedly");
+ FileTime modTime3 = Files.getLastModifiedTime(classes.resolve("pkg/C.class"));
+ check(modTime2.compareTo(modTime3) < 0, "Recompilation not triggered");
+ }
+
+ static void headline(String str) {
+ System.out.println();
+ System.out.println(str);
+ System.out.println(str.replaceAll(".", "-"));
+ }
+
+ static void delete(Path root) throws IOException {
+ if (!Files.exists(root))
+ return;
+ Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path f, BasicFileAttributes a)
+ throws IOException {
+ Files.delete(f);
+ return FileVisitResult.CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException e)
+ throws IOException {
+ if (e != null)
+ throw e;
+ if (!dir.equals(root))
+ Files.delete(dir);
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ }
+
+}
--- a/langtools/test/tools/sjavac/CompileCircularSources.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/CompileCircularSources.java Thu Jun 25 07:13:27 2015 +0000
@@ -48,27 +48,33 @@
}
void test() throws Exception {
- Files.createDirectory(BIN);
+ clean(TEST_ROOT);
+ Files.createDirectories(BIN);
clean(GENSRC, BIN);
Map<String,Long> previous_bin_state = collectState(BIN);
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; public class A { beta.B b; }");
+ "package alfa.omega; public class A { beta.B b; }");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; public class B { gamma.C c; }");
+ "package beta; public class B { gamma.C c; }");
tb.writeFile(GENSRC.resolve("gamma/C.java"),
- "package gamma; public class C { alfa.omega.A a; }");
+ "package gamma; public class C { alfa.omega.A a; }");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "3",
- SERVER_ARG,"--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "3",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
- verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class",
- "bin/beta/B.class",
- "bin/gamma/C.class",
- "bin/javac_state");
+ verifyThatFilesHaveBeenAdded(previous_bin_state,
+ new_bin_state,
+ BIN + "/alfa/omega/A.class",
+ BIN + "/beta/B.class",
+ BIN + "/gamma/C.class",
+ BIN + "/javac_state");
clean(GENSRC, BIN);
}
}
--- a/langtools/test/tools/sjavac/CompileExcludingDependency.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/CompileExcludingDependency.java Thu Jun 25 07:13:27 2015 +0000
@@ -49,22 +49,27 @@
// Verify that excluding classes from compilation but not from linking works
void test() throws Exception {
- Files.createDirectory(BIN);
+ clean(TEST_ROOT);
+ Files.createDirectories(BIN);
clean(GENSRC,BIN);
Map<String,Long> previous_bin_state = collectState(BIN);
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; public class A { beta.B b; }");
+ "package alfa.omega; public class A { beta.B b; }");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; public class B { }");
+ "package beta; public class B { }");
- compile("-x", "beta", "-src", "gensrc", "-x", "alfa/omega", "-sourcepath", "gensrc",
- "-d", "bin", SERVER_ARG);
+ compile("-x", "beta",
+ "-src", GENSRC.toString(),
+ "-x", "alfa/omega",
+ "-sourcepath", GENSRC.toString(),
+ "-d", BIN.toString(),
+ SERVER_ARG);
Map<String,Long> new_bin_state = collectState(BIN);
verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class",
- "bin/javac_state");
+ BIN + "/alfa/omega/A.class",
+ BIN + "/javac_state");
clean(GENSRC, BIN);
}
}
--- a/langtools/test/tools/sjavac/CompileWithAtFile.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/CompileWithAtFile.java Thu Jun 25 07:13:27 2015 +0000
@@ -48,9 +48,13 @@
}
void test() throws Exception {
+ clean(TEST_ROOT);
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("list.txt"),
- "-if */alfa/omega/A.java\n-if */beta/B.java\ngensrc\n-d bin\n");
+ "-if */alfa/omega/A.java\n" +
+ "-if */beta/B.java\n" +
+ GENSRC + "\n" +
+ "-d " + BIN + "\n");
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
"package alfa.omega; import beta.B; public class A { B b; }");
tb.writeFile(GENSRC.resolve("beta/B.java"),
@@ -60,13 +64,14 @@
Files.createDirectory(BIN);
Map<String,Long> previous_bin_state = collectState(BIN);
- compile("@gensrc/list.txt", "--server:portfile=testserver,background=false");
+
+ compile("@" + GENSRC + "/list.txt", "--server:portfile=testserver,background=false");
Map<String,Long> new_bin_state = collectState(BIN);
verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
- "bin/javac_state",
- "bin/alfa/omega/A.class",
- "bin/beta/B.class");
+ BIN + "/javac_state",
+ BIN + "/alfa/omega/A.class",
+ BIN + "/beta/B.class");
clean(GENSRC, BIN);
}
}
--- a/langtools/test/tools/sjavac/CompileWithInvisibleSources.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/CompileWithInvisibleSources.java Thu Jun 25 07:13:27 2015 +0000
@@ -51,35 +51,45 @@
// gensrc2 contains broken code in beta.B, thus exclude that package
// gensrc3 contains a proper beta.B
void test() throws Exception {
- Files.createDirectory(BIN);
+ clean(TEST_ROOT);
+ Files.createDirectories(BIN);
clean(GENSRC, GENSRC2, GENSRC3, BIN);
Map<String,Long> previous_bin_state = collectState(BIN);
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; import beta.B; import gamma.C; public class A { B b; C c; }");
+ "package alfa.omega; import beta.B; import gamma.C; public class A { B b; C c; }");
tb.writeFile(GENSRC2.resolve("beta/B.java"),
- "package beta; public class B { broken");
+ "package beta; public class B { broken");
tb.writeFile(GENSRC2.resolve("gamma/C.java"),
- "package gamma; public class C { }");
+ "package gamma; public class C { }");
tb.writeFile(GENSRC3.resolve("beta/B.java"),
- "package beta; public class B { }");
+ "package beta; public class B { }");
- compile("gensrc", "-x", "beta", "-sourcepath", "gensrc2",
- "-sourcepath", "gensrc3", "-d", "bin", "-h", "headers", "-j", "1",
+ compile(GENSRC.toString(),
+ "-x", "beta",
+ "-sourcepath", GENSRC2.toString(),
+ "-sourcepath", GENSRC3.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
SERVER_ARG);
System.out.println("The first compile went well!");
Map<String,Long> new_bin_state = collectState(BIN);
verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class",
- "bin/javac_state");
+ BIN + "/alfa/omega/A.class",
+ BIN + "/javac_state");
System.out.println("----- Compile with exluded beta went well!");
clean(BIN);
- compileExpectFailure("gensrc", "-sourcepath", "gensrc2", "-sourcepath", "gensrc3",
- "-d", "bin", "-h", "headers", "-j", "1",
+ compileExpectFailure(GENSRC.toString(),
+ "-sourcepath", GENSRC2.toString(),
+ "-sourcepath", GENSRC3.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
SERVER_ARG);
System.out.println("----- Compile without exluded beta failed, as expected! Good!");
--- a/langtools/test/tools/sjavac/CompileWithOverrideSources.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/CompileWithOverrideSources.java Thu Jun 25 07:13:27 2015 +0000
@@ -50,33 +50,43 @@
// Compile gensrc and gensrc2. However do not compile broken beta.B in gensrc,
// only compile ok beta.B in gensrc2
void test() throws Exception {
- Files.createDirectory(BIN);
+ clean(TEST_ROOT);
+ Files.createDirectories(BIN);
clean(GENSRC, GENSRC2, GENSRC3, BIN);
Map<String,Long> previous_bin_state = collectState(BIN);
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; import beta.B; import gamma.C; public class A { B b; C c; }");
+ "package alfa.omega; import beta.B; import gamma.C; public class A { B b; C c; }");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; public class B { broken");
+ "package beta; public class B { broken");
tb.writeFile(GENSRC.resolve("gamma/C.java"),
- "package gamma; public class C { }");
+ "package gamma; public class C { }");
tb.writeFile(GENSRC2.resolve("beta/B.java"),
- "package beta; public class B { }");
+ "package beta; public class B { }");
- compile("-x", "beta", "gensrc", "gensrc2", "-d", "bin", "-h", "headers", "-j", "1",
+ compile("-x", "beta",
+ GENSRC.toString(),
+ GENSRC2.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
SERVER_ARG);
Map<String,Long> new_bin_state = collectState(BIN);
verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class",
- "bin/beta/B.class",
- "bin/gamma/C.class",
- "bin/javac_state");
+ BIN + "/alfa/omega/A.class",
+ BIN + "/beta/B.class",
+ BIN + "/gamma/C.class",
+ BIN + "/javac_state");
System.out.println("----- Compile with exluded beta went well!");
clean(BIN);
- compileExpectFailure("gensrc", "gensrc2", "-d", "bin", "-h", "headers", "-j", "1",
+ compileExpectFailure(GENSRC.toString(),
+ GENSRC2.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
SERVER_ARG);
System.out.println("----- Compile without exluded beta failed, as expected! Good!");
--- a/langtools/test/tools/sjavac/DependencyCollection.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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.
- */
-
-/*
- * @test
- * @bug 8056258 8048609
- * @summary Ensures that the DependencyCollector covers various cases.
- * @library /tools/lib
- * @modules jdk.compiler/com.sun.tools.javac.api
- * jdk.compiler/com.sun.tools.javac.code
- * jdk.compiler/com.sun.tools.javac.file
- * jdk.compiler/com.sun.tools.javac.main
- * jdk.compiler/com.sun.tools.javac.util
- * jdk.compiler/com.sun.tools.sjavac.comp
- * jdk.compiler/com.sun.tools.sjavac.comp.dependencies
- * @build Wrapper ToolBox
- * @run main Wrapper DependencyCollection
- */
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-import javax.tools.JavaCompiler;
-import javax.tools.JavaFileObject;
-import javax.tools.StandardJavaFileManager;
-import javax.tools.ToolProvider;
-
-import com.sun.tools.javac.api.JavacTaskImpl;
-import com.sun.tools.javac.code.Symbol.PackageSymbol;
-import com.sun.tools.sjavac.comp.SmartFileManager;
-import com.sun.tools.sjavac.comp.dependencies.DependencyCollector;
-
-public class DependencyCollection {
-
- public static void main(String[] args) throws IOException {
- Path src = Paths.get(ToolBox.testSrc, "test-input", "src");
-
- JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
- try (StandardJavaFileManager fileManager = javac.getStandardFileManager(null, null, null)) {
- SmartFileManager smartFileManager = new SmartFileManager(fileManager);
- smartFileManager.setSymbolFileEnabled(false);
- Iterable<? extends JavaFileObject> fileObjects =
- fileManager.getJavaFileObjectsFromFiles(Arrays.asList(src.resolve("pkg/Test.java").toFile()));
- JavacTaskImpl task = (JavacTaskImpl) javac.getTask(new PrintWriter(System.out),
- smartFileManager,
- null,
- Arrays.asList("-d", "classes",
- "-sourcepath", src.toAbsolutePath().toString()),
- null,
- fileObjects);
- DependencyCollector depsCollector = new DependencyCollector();
- task.addTaskListener(depsCollector);
- task.doCall();
-
- // Find pkg symbol
- PackageSymbol pkg = findPkgSymbolWithName(depsCollector.getSourcePackages(), "pkg");
- Set<PackageSymbol> foundDependencies = depsCollector.getDependenciesForPkg(pkg);
-
- // Print dependencies
- System.out.println("Found dependencies:");
- foundDependencies.stream()
- .sorted(Comparator.comparing(DependencyCollection::extractNumber))
- .forEach(p -> System.out.println(" " + p));
-
- // Check result
- Set<Integer> found = foundDependencies.stream()
- .map(DependencyCollection::extractNumber)
- .collect(Collectors.toSet());
- found.remove(-1); // Dependencies with no number (java.lang etc)
- Set<Integer> expected = new HashSet<>();
- for (int i = 2; i <= 30; i++) {
- if (i == 15) continue; // Case 15 correspond to the type of a throw-away return value.
- expected.add(i);
- }
-
- Set<Integer> missing = new HashSet<>(expected);
- missing.removeAll(found);
- if (missing.size() > 0) {
- System.out.println("Missing dependencies:");
- missing.forEach(i -> System.out.println(" Dependency " + i));
- }
-
- Set<Integer> unexpected = new HashSet<>(found);
- unexpected.removeAll(expected);
- if (unexpected.size() > 0) {
- System.out.println("Unexpected dependencies found:");
- unexpected.forEach(i -> System.out.println(" Dependency " + i));
- }
-
- if (missing.size() > 0 || unexpected.size() > 0)
- throw new AssertionError("Missing and/or unexpected dependencies found.");
- }
- }
-
- private static PackageSymbol findPkgSymbolWithName(Set<PackageSymbol> syms, String name) {
- for (PackageSymbol ps : syms)
- if (ps.fullname.toString().equals("pkg"))
- return ps;
- throw new AssertionError("Could not find package named \"pkg\".");
- }
-
- public static int extractNumber(PackageSymbol p) {
- Matcher m = Pattern.compile("\\d+").matcher(p.fullname.toString());
- if (!m.find())
- return -1;
- return Integer.parseInt(m.group());
- }
-}
--- a/langtools/test/tools/sjavac/IncCompInheritance.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/IncCompInheritance.java Thu Jun 25 07:13:27 2015 +0000
@@ -60,6 +60,7 @@
throw new AssertionError("Compilation failed unexpectedly");
// Remove method A.m
+ Thread.sleep(2500); // Make sure we get a new timestamp
String aModified = "package pkga; public class A { }";
toolbox.writeFile(src.resolve("pkga/A.java"), aModified);
--- a/langtools/test/tools/sjavac/IncCompileChangeNative.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/IncCompileChangeNative.java Thu Jun 25 07:13:27 2015 +0000
@@ -51,9 +51,10 @@
ToolBox tb = new ToolBox();
void test() throws Exception {
- Files.createDirectory(GENSRC);
- Files.createDirectory(BIN);
- Files.createDirectory(HEADERS);
+ clean(TEST_ROOT);
+ Files.createDirectories(GENSRC);
+ Files.createDirectories(BIN);
+ Files.createDirectories(HEADERS);
initialCompile();
incrementalCompileDropAllNatives();
@@ -70,21 +71,25 @@
System.out.println("\nIn incrementalCompileDropAllNatives() ");
System.out.println("Verify that beta_B.h is removed");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; import alfa.omega.A; public class B {"+
- "private int b() { return A.DEFINITION; } }");
+ "package beta; import alfa.omega.A; " +
+ "public class B { private int b() { return A.DEFINITION; } }");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
verifyNewerFiles(previous_bin_state, new_bin_state,
- "bin/beta/B.class",
- "bin/beta/BINT.class",
- "bin/javac_state");
+ BIN + "/beta/B.class",
+ BIN + "/beta/BINT.class",
+ BIN + "/javac_state");
previous_bin_state = new_bin_state;
Map<String,Long> new_headers_state = collectState(HEADERS);
verifyThatFilesHaveBeenRemoved(previous_headers_state, new_headers_state,
- "headers/beta_B.h");
+ HEADERS + "/beta_B.h");
previous_headers_state = new_headers_state;
}
@@ -94,22 +99,26 @@
System.out.println("\nIn incrementalCompileAddNative() ");
System.out.println("Verify that beta_B.h is added again");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; import alfa.omega.A; public class B {"+
- "private int b() { return A.DEFINITION; } "+
- "@java.lang.annotation.Native final static int alfa = 42; }");
+ "package beta; import alfa.omega.A; public class B {"+
+ "private int b() { return A.DEFINITION; } "+
+ "@java.lang.annotation.Native final static int alfa = 42; }");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
verifyNewerFiles(previous_bin_state, new_bin_state,
- "bin/beta/B.class",
- "bin/beta/BINT.class",
- "bin/javac_state");
+ BIN + "/beta/B.class",
+ BIN + "/beta/BINT.class",
+ BIN + "/javac_state");
previous_bin_state = new_bin_state;
Map<String,Long> new_headers_state = collectState(HEADERS);
verifyThatFilesHaveBeenAdded(previous_headers_state, new_headers_state,
- "headers/beta_B.h");
+ HEADERS + "/beta_B.h");
previous_headers_state = new_headers_state;
}
}
--- a/langtools/test/tools/sjavac/IncCompileDropClasses.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/IncCompileDropClasses.java Thu Jun 25 07:13:27 2015 +0000
@@ -51,9 +51,10 @@
ToolBox tb = new ToolBox();
void test() throws Exception {
- Files.createDirectory(GENSRC);
- Files.createDirectory(BIN);
- Files.createDirectory(HEADERS);
+ clean(TEST_ROOT);
+ Files.createDirectories(GENSRC);
+ Files.createDirectories(BIN);
+ Files.createDirectories(HEADERS);
initialCompile();
incrementalCompileDroppingClasses();
@@ -68,15 +69,19 @@
System.out.println("\nIn incrementalCompileDroppingClasses() ");
System.out.println("Testing that deleting AA.java deletes all generated inner class including AA.class");
removeFrom(GENSRC, "alfa/omega/AA.java");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
verifyThatFilesHaveBeenRemoved(previous_bin_state, new_bin_state,
- "bin/alfa/omega/AA$1.class",
- "bin/alfa/omega/AA$AAAA.class",
- "bin/alfa/omega/AA$AAA.class",
- "bin/alfa/omega/AAAAA.class",
- "bin/alfa/omega/AA.class");
+ BIN + "/alfa/omega/AA$1.class",
+ BIN + "/alfa/omega/AA$AAAA.class",
+ BIN + "/alfa/omega/AA$AAA.class",
+ BIN + "/alfa/omega/AAAAA.class",
+ BIN + "/alfa/omega/AA.class");
previous_bin_state = new_bin_state;
Map<String,Long> new_headers_state = collectState(HEADERS);
--- a/langtools/test/tools/sjavac/IncCompileFullyQualifiedRef.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/IncCompileFullyQualifiedRef.java Thu Jun 25 07:13:27 2015 +0000
@@ -27,6 +27,7 @@
* @test
* @summary Verify that "alfa.omega.A a" does create a proper dependency
* @bug 8054689
+ * @ignore Requires dependency code to deal with in-method dependencies.
* @author Fredrik O
* @author sogoel (rewrite)
* @library /tools/lib
@@ -38,8 +39,7 @@
* @run main Wrapper IncCompileFullyQualifiedRef
*/
-import java.util.*;
-import java.nio.file.*;
+import java.util.Map;
public class IncCompileFullyQualifiedRef extends SJavacTester {
public static void main(String... args) throws Exception {
@@ -48,36 +48,43 @@
}
void test() throws Exception {
+ clean(TEST_ROOT);
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; public class A { "+
- " public final static int DEFINITION = 18; "+
- " public void hello() { }"+
- "}");
+ "package alfa.omega; public class A { "+
+ " public final static int DEFINITION = 18; "+
+ " public void hello() { }"+
+ "}");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; public class B { "+
- " public void world() { alfa.omega.A a; }"+
- "}");
+ "package beta; public class B { "+
+ " public void world() { alfa.omega.A a; }"+
+ "}");
- compile("gensrc", "-d", "bin", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> previous_bin_state = collectState(BIN);
// Change pubapi of A, this should trigger a recompile of B.
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; public class A { "+
- " public final static int DEFINITION = 19; "+
- " public void hello() { }"+
- "}");
+ "package alfa.omega; public class A { "+
+ " public final static int DEFINITION = 19; "+
+ " public void hello() { }"+
+ "}");
- compile("gensrc", "-d", "bin", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
verifyNewerFiles(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class",
- "bin/beta/B.class",
- "bin/javac_state");
+ BIN + "/alfa/omega/A.class",
+ BIN + "/beta/B.class",
+ BIN + "/javac_state");
clean(GENSRC,BIN);
}
}
--- a/langtools/test/tools/sjavac/IncCompileNoChanges.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/IncCompileNoChanges.java Thu Jun 25 07:13:27 2015 +0000
@@ -50,9 +50,10 @@
Map<String,Long> previous_headers_state;
void test() throws Exception {
- Files.createDirectory(GENSRC);
- Files.createDirectory(BIN);
- Files.createDirectory(HEADERS);
+ clean(Paths.get(getClass().getSimpleName()));
+ Files.createDirectories(GENSRC);
+ Files.createDirectories(BIN);
+ Files.createDirectories(HEADERS);
initialCompile();
incrementalCompileNoChanges();
@@ -66,8 +67,12 @@
previous_headers_state = collectState(HEADERS);
System.out.println("\nIn incrementalCompileNoChanges() ");
System.out.println("Testing that no change in sources implies no change in binaries");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
verifyEqual(new_bin_state, previous_bin_state);
Map<String,Long> new_headers_state = collectState(HEADERS);
--- a/langtools/test/tools/sjavac/IncCompileUpdateNative.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/IncCompileUpdateNative.java Thu Jun 25 07:13:27 2015 +0000
@@ -51,9 +51,10 @@
ToolBox tb = new ToolBox();
void test() throws Exception {
- Files.createDirectory(GENSRC);
- Files.createDirectory(BIN);
- Files.createDirectory(HEADERS);
+ clean(TEST_ROOT);
+ Files.createDirectories(GENSRC);
+ Files.createDirectories(BIN);
+ Files.createDirectories(HEADERS);
initialCompile();
incrementalCompileChangeNative();
@@ -69,22 +70,26 @@
System.out.println("\nIn incrementalCompileChangeNative() ");
System.out.println("Verify that beta_B.h is rewritten again");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; import alfa.omega.A; public class B {"+
- "private int b() { return A.DEFINITION; } "+
- "@java.lang.annotation.Native final static int alfa = 43; }");
+ "package beta; import alfa.omega.A; public class B {"+
+ "private int b() { return A.DEFINITION; } "+
+ "@java.lang.annotation.Native final static int alfa = 43; }");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
verifyNewerFiles(previous_bin_state, new_bin_state,
- "bin/beta/B.class",
- "bin/beta/BINT.class",
- "bin/javac_state");
+ BIN + "/beta/B.class",
+ BIN + "/beta/BINT.class",
+ BIN + "/javac_state");
previous_bin_state = new_bin_state;
Map<String,Long> new_headers_state = collectState(HEADERS);
verifyNewerFiles(previous_headers_state, new_headers_state,
- "headers/beta_B.h");
+ HEADERS + "/beta_B.h");
previous_headers_state = new_headers_state;
}
}
--- a/langtools/test/tools/sjavac/IncCompileWithChanges.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/IncCompileWithChanges.java Thu Jun 25 07:13:27 2015 +0000
@@ -24,6 +24,7 @@
/*
* @test
* @summary Verify incremental changes in gensrc are handled as expected
+ * @ignore Requires dependency code to deal with in-method dependencies.
* @bug 8054689
* @author Fredrik O
* @author sogoel (rewrite)
@@ -51,14 +52,13 @@
ToolBox tb = new ToolBox();
void test() throws Exception {
- Files.createDirectory(GENSRC);
- Files.createDirectory(BIN);
- Files.createDirectory(HEADERS);
+ clean(TEST_ROOT);
+ Files.createDirectories(GENSRC);
+ Files.createDirectories(BIN);
+ Files.createDirectories(HEADERS);
initialCompile();
incrementalCompileWithChange();
-
- clean(GENSRC, BIN, HEADERS);
}
/* Update A.java with a new timestamp and new final static definition.
@@ -72,24 +72,29 @@
System.out.println("A.java updated to trigger a recompile");
System.out.println("Generated native header should not be updated since native api of B was not modified");
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; public class A implements AINT { "+
- "public final static int DEFINITION = 18; public void aint() { } private void foo() { } }");
+ "package alfa.omega; public class A implements AINT { " +
+ "public final static int DEFINITION = 18;" +
+ "public void aint() { } private void foo() { } }");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
Map<String,Long> new_bin_state = collectState(BIN);
verifyNewerFiles(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class",
- "bin/alfa/omega/AINT.class",
- "bin/alfa/omega/AA$AAAA.class",
- "bin/alfa/omega/AAAAA.class",
- "bin/alfa/omega/AA$AAA.class",
- "bin/alfa/omega/AA.class",
- "bin/alfa/omega/AA$1.class",
- "bin/beta/B.class",
- "bin/beta/BINT.class",
- "bin/javac_state");
+ BIN + "/alfa/omega/A.class",
+ BIN + "/alfa/omega/AINT.class",
+ BIN + "/alfa/omega/AA$AAAA.class",
+ BIN + "/alfa/omega/AAAAA.class",
+ BIN + "/alfa/omega/AA$AAA.class",
+ BIN + "/alfa/omega/AA.class",
+ BIN + "/alfa/omega/AA$1.class",
+ BIN + "/beta/B.class",
+ BIN + "/beta/BINT.class",
+ BIN + "/javac_state");
previous_bin_state = new_bin_state;
Map<String,Long> new_headers_state = collectState(HEADERS);
--- a/langtools/test/tools/sjavac/JavacOptionPrep.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/JavacOptionPrep.java Thu Jun 25 07:13:27 2015 +0000
@@ -83,6 +83,7 @@
// Check the result
boolean destDirFound = false;
+ boolean userPathsFirst = false;
boolean headerDirFound = false;
boolean gensrcDirFound = false;
boolean classPathFound = false;
@@ -95,6 +96,11 @@
String option = javacArgIter.next();
+ // Ignore this option for now. When the file=... requirement goes
+ // away, this will be easier to handle.
+ if (option.startsWith("-XDcompletionDeps"))
+ continue;
+
switch (option) {
case "-classpath":
case "-cp":
@@ -166,7 +172,6 @@
if (!implicitNoneFound)
throw new AssertionError("\"-implicit:none\" not found.");
-
}
static void assertEquals(Object expected, Object actual) {
--- a/langtools/test/tools/sjavac/PermittedArtifact.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/PermittedArtifact.java Thu Jun 25 07:13:27 2015 +0000
@@ -38,12 +38,8 @@
* @run main Wrapper PermittedArtifact
*/
-import java.lang.reflect.Method;
-import java.util.*;
-import java.io.*;
-import java.nio.file.*;
-import java.nio.file.attribute.*;
-import java.nio.charset.*;
+import java.nio.file.Files;
+import java.util.Map;
public class PermittedArtifact extends SJavacTester {
public static void main(String... args) throws Exception {
@@ -53,26 +49,31 @@
//Verify that --permit-artifact=bin works
void test() throws Exception {
- Files.createDirectory(BIN);
+ clean(TEST_ROOT);
+ Files.createDirectories(BIN);
clean(GENSRC, BIN);
Map<String,Long> previous_bin_state = collectState(BIN);
- new ToolBox().writeFile(GENSRC+"/alfa/omega/A.java",
- "package alfa.omega; public class A { }");
+ ToolBox tb = new ToolBox();
+ tb.writeFile(GENSRC + "/alfa/omega/A.java",
+ "package alfa.omega; public class A { }");
- new ToolBox().writeFile(BIN+"/alfa/omega/AA.class",
- "Ugh, a messy build system (tobefixed) wrote this class file, "
- + "sjavac must not delete it.");
+ tb.writeFile(BIN + "/alfa/omega/AA.class",
+ "Ugh, a messy build system (tobefixed) wrote this class file, " +
+ "sjavac must not delete it.");
- compile("--log=debug", "--permit-artifact=bin/alfa/omega/AA.class",
- "-src", "gensrc", "-d", "bin", SERVER_ARG);
+ compile("--log=debug",
+ "--permit-artifact=" + BIN + "/alfa/omega/AA.class",
+ "-src", GENSRC.toString(),
+ "-d", BIN.toString(),
+ SERVER_ARG);
Map<String,Long> new_bin_state = collectState(BIN);
verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class",
- "bin/alfa/omega/AA.class",
- "bin/javac_state");
+ BIN + "/alfa/omega/A.class",
+ BIN + "/alfa/omega/AA.class",
+ BIN + "/javac_state");
clean(GENSRC, BIN);
}
}
--- a/langtools/test/tools/sjavac/SJavacTester.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/SJavacTester.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,7 +25,6 @@
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
-import java.nio.charset.*;
import com.sun.tools.sjavac.Main;
@@ -35,16 +34,18 @@
+ "portfile=testportfile,"
+ "background=false";
+ final Path TEST_ROOT = Paths.get(getClass().getSimpleName());
+
// Generated sources that will test aspects of sjavac
- static final Path GENSRC = Paths.get("gensrc");
+ final Path GENSRC = TEST_ROOT.resolve("gensrc");
// Gensrc dirs used to test merging of serveral source roots.
- static final Path GENSRC2 = Paths.get("gensrc2");
- static final Path GENSRC3= Paths.get("gensrc3");
+ final Path GENSRC2 = TEST_ROOT.resolve("gensrc2");
+ final Path GENSRC3 = TEST_ROOT.resolve("gensrc3");
// Dir for compiled classes.
- static final Path BIN = Paths.get("bin");
+ final Path BIN = TEST_ROOT.resolve("bin");
// Dir for c-header files.
- Path HEADERS = Paths.get("headers");
+ final Path HEADERS = TEST_ROOT.resolve("headers");
// Remember the previous bin and headers state here.
Map<String,Long> previous_bin_state;
@@ -54,10 +55,10 @@
System.out.println("\nInitial compile of gensrc.");
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("alfa/omega/AINT.java"),
- "package alfa.omega; public interface AINT { void aint(); }");
+ "package alfa.omega; public interface AINT { void aint(); }");
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; public class A implements AINT { "+
- "public final static int DEFINITION = 17; public void aint() { } }");
+ "package alfa.omega; public class A implements AINT { "+
+ "public final static int DEFINITION = 17; public void aint() { } }");
tb.writeFile(GENSRC.resolve("alfa/omega/AA.java"),
"package alfa.omega;"+
"// A package private class, not contributing to the public api.\n"+
@@ -79,13 +80,17 @@
" // from outside of this source file, therefore it is ok.\n"+
"}\n");
tb.writeFile(GENSRC.resolve("beta/BINT.java"),
- "package beta;public interface BINT { void foo(); }");
+ "package beta;public interface BINT { void foo(); }");
tb.writeFile(GENSRC.resolve("beta/B.java"),
- "package beta; import alfa.omega.A; public class B {"+
- "private int b() { return A.DEFINITION; } native void foo(); }");
+ "package beta; import alfa.omega.A; public class B {"+
+ "private int b() { return A.DEFINITION; } native void foo(); }");
- compile("gensrc", "-d", "bin", "-h", "headers", "-j", "1",
- SERVER_ARG, "--log=debug");
+ compile(GENSRC.toString(),
+ "-d", BIN.toString(),
+ "-h", HEADERS.toString(),
+ "-j", "1",
+ SERVER_ARG,
+ "--log=debug");
}
void removeFrom(Path dir, String... args) throws IOException {
--- a/langtools/test/tools/sjavac/SjavacBase.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/SjavacBase.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,7 @@
*/
public static int compile(Object... args) throws ReflectiveOperationException {
// Use reflection to avoid a compile-time dependency on sjavac Main
- System.err.println("compile: " + Arrays.toString(args));
+ System.out.println("compile: " + Arrays.toString(args));
Class<?> c = Class.forName("com.sun.tools.sjavac.Main");
Method m = c.getDeclaredMethod("go", String[].class);
String[] strArgs = new String[args.length];
--- a/langtools/test/tools/sjavac/StateDir.java Wed Jun 24 17:45:44 2015 +0200
+++ b/langtools/test/tools/sjavac/StateDir.java Thu Jun 25 07:13:27 2015 +0000
@@ -48,28 +48,29 @@
}
void test() throws Exception {
- Path bar = Paths.get("bar");
- Files.createDirectory(bar);
- Files.createDirectory(BIN);
-
- clean(GENSRC, BIN, bar);
+ clean(TEST_ROOT);
+ Path BAR = TEST_ROOT.resolve("bar");
+ Files.createDirectories(BAR);
+ Files.createDirectories(BIN);
Map<String,Long> previous_bin_state = collectState(BIN);
- Map<String,Long> previous_bar_state = collectState(bar);
+ Map<String,Long> previous_bar_state = collectState(BAR);
ToolBox tb = new ToolBox();
tb.writeFile(GENSRC.resolve("alfa/omega/A.java"),
- "package alfa.omega; public class A { }");
+ "package alfa.omega; public class A { }");
- compile("--state-dir=bar", "-src", "gensrc", "-d", "bin",
+ compile("--state-dir=" + BAR,
+ "-src", GENSRC.toString(),
+ "-d", BIN.toString(),
SJavacTester.SERVER_ARG);
Map<String,Long> new_bin_state = collectState(BIN);
verifyThatFilesHaveBeenAdded(previous_bin_state, new_bin_state,
- "bin/alfa/omega/A.class");
- Map<String,Long> new_bar_state = collectState(bar);
+ BIN + "/alfa/omega/A.class");
+ Map<String,Long> new_bar_state = collectState(BAR);
verifyThatFilesHaveBeenAdded(previous_bar_state, new_bar_state,
- "bar/javac_state");
- clean(GENSRC, BIN, bar);
+ BAR + "/javac_state");
+ clean(GENSRC, BIN, BAR);
}
}
--- a/langtools/test/tools/sjavac/test-input/src/nondependency/pkg26/Cls26.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 nondependency.pkg26;
-
-public class Cls26 {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg/Test.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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.
- */
-// Use fully qualified names to avoid accidentally capturing dependencies in import statements.
-
-package pkg;
-
-import pkg2.*; // pkg2 as a whole
-import pkg3.Cls3; // pkg3.Cls3
-import pkg25.Cls25; // pkg25.Cls25
-import nondependency.pkg26.Cls26; // pkg26.Cls26 (but not nondependency)
-import pkg28.Cls28.Inner28; // pkg29.Cls28, pkg29.Cls28.Inner28
-import static pkg29.Cls29.Inner29; // pkg29.Cls29, pkg29.Cls29.Inner29
-import static pkg30.Cls30.*; // pkg30.Cls30 as a whole
-
-@pkg5.Anno5 // pkg5.Anno5
-public class Test<S extends pkg23.Cls23> // pkg23.Cls23
- extends pkg4.Cls4/*extends pkg11.Cls11*/<pkg6.Cls6/*extends pkg12.Cls12*/> // pkg4.Cls4, pkg11.Cls11, pkg6.Cls6, pkg12.Cls12
- implements pkg7.Cls7, pkg8.Cls8<pkg9.Cls9> { // pkg7.Cls7, pkg8.Cls8, pkg9.Cls9
-
- pkg27.Cls27 cls27[][][] = new pkg27.Cls27[0][0][0]; // pkg27.Cls27
-
- pkg2.Cls2 cls2;
- pkg19.Cls19 f19; // pkg19.Cls19
-
- public static void main(String[] args) { // java.lang.String
- pkg10.Cls10 o = new pkg10.Cls10(); // pkg10.Cls10
-
- o.getCls13().getCls14().getCls15(); // pkg13.Cls13, pkg14.Cls14, pkg15.Cls15
- pkg23.Cls23.f24 = null; // pkg23.Cls23, pkg24.Cls24
- }
-
- static pkg16.Cls16 m1(pkg17.Cls17 o) { // pkg16.Cls16, pkg17.Cls17
- return null;
- }
-
- public <T extends pkg18.Cls18> void m2() { // pkg18.Cls18
- }
-
- public <T> T m3() {
- T t;
- t = null;
- return t;
- }
-
- @pkg20.Anno20(pkg21.Cls21.class) // pkg20.Anno20, pkg21.Cls21
- private void m3(@pkg22.Anno22 String s) { // pkg22.Anno22
- Runnable r = () -> { System.out.println("hello"); };
- }
-
- private void m4() throws Cls25 { // pkg25.Cls25
- }
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg10/Cls10.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg10;
-public class Cls10 {
- public pkg13.Cls13 getCls13() {
- return null;
- }
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg11/Cls11.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg11; public class Cls11 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg12/Cls12.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg12; public class Cls12 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg13/Cls13.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg13;
-public class Cls13 {
- public pkg14.Cls14 getCls14() {
- return null;
- }
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg14/Cls14.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg14;
-public class Cls14 {
- public int[] getCls15() {
- return null;
- }
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg15/Cls15.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg15; public class Cls15 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg16/Cls16.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg16; public class Cls16 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg17/Cls17.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg17; public class Cls17 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg18/Cls18.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg18; public class Cls18 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg19/Cls19.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg19; public class Cls19 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg2/Cls2.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg2; public class Cls2 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg20/Anno20.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg20;
-public @interface Anno20 {
- Class<?> value();
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg21/Cls21.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg21; public class Cls21 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg22/Anno22.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg22;
-public @interface Anno22 {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg23/Cls23.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg23;
-public class Cls23 {
- public static pkg24.Cls24 f24;
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg24/Cls24.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg24; public class Cls24 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg25/Cls25.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg25;
-
-public class Cls25 extends Throwable {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg27/Cls27.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg27;
-public class Cls27 {}
--- a/langtools/test/tools/sjavac/test-input/src/pkg28/Cls28.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg28;
-public class Cls28 {
- public static class Inner28 {}
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg29/Cls29.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg29;
-public class Cls29 {
- public static class Inner29 {}
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg3/Cls3.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg3; public class Cls3 { }
--- a/langtools/test/tools/sjavac/test-input/src/pkg30/Cls30.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg30;
-
-public class Cls30 {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg4/Cls4.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg4;
-public class Cls4<T> extends pkg11.Cls11 {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg5/Anno5.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg5;
-public @interface Anno5 {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg6/Cls6.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg6;
-public class Cls6 extends pkg12.Cls12 {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg7/Cls7.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg7;
-public interface Cls7 {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg8/Cls8.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg8;
-public interface Cls8<T> {
-}
--- a/langtools/test/tools/sjavac/test-input/src/pkg9/Cls9.java Wed Jun 24 17:45:44 2015 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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 pkg9; public class Cls9 { }
--- a/make/MacBundles.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/make/MacBundles.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -25,6 +25,7 @@
include $(SPEC)
include MakeBase.gmk
+include TextFileProcessing.gmk
default: bundles
--- a/make/common/CORE_PKGS.gmk Wed Jun 24 17:45:44 2015 +0200
+++ b/make/common/CORE_PKGS.gmk Thu Jun 25 07:13:27 2015 +0000
@@ -222,7 +222,6 @@
javax.swing.plaf.nimbus \
javax.swing.plaf.synth \
javax.tools \
- javax.tools.annotation \
javax.transaction \
javax.transaction.xa \
javax.xml.parsers \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/make/devkit/createMacosxDevkit.sh Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,147 @@
+#!/bin/bash
+#
+# 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.
+#
+
+# This script copies part of an Xcode installer into a devkit suitable
+# for building OpenJDK and OracleJDK. The installation .dmg files for Xcode
+# and the aux tools need to be available.
+# erik.joelsson@oracle.com
+
+USAGE="$0 <Xcode.dmg> <XQuartz.dmg> [<auxtools.dmg>]"
+
+if [ "$1" = "" ] || [ "$2" = "" ]; then
+ echo $USAGE
+ exit 1
+fi
+
+XCODE_DMG="$1"
+XQUARTZ_DMG="$2"
+AUXTOOLS_DMG="$3"
+
+SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)"
+BUILD_DIR="${SCRIPT_DIR}/../../build/devkit"
+
+# Mount XCODE_DMG
+if [ -e "/Volumes/Xcode" ]; then
+ hdiutil detach /Volumes/Xcode
+fi
+hdiutil attach $XCODE_DMG
+
+# Find the version of Xcode
+XCODE_VERSION="$(/Volumes/Xcode/Xcode.app/Contents/Developer/usr/bin/xcodebuild -version \
+ | awk '/Xcode/ { print $2 }' )"
+
+DEVKIT_ROOT="${BUILD_DIR}/Xcode${XCODE_VERSION}-devkit"
+DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz"
+
+echo "Xcode version: $XCODE_VERSION"
+echo "Creating devkit in $DEVKIT_ROOT"
+
+################################################################################
+# Copy files to root
+mkdir -p $DEVKIT_ROOT
+if [ ! -d $DEVKIT_ROOT/Xcode.app ]; then
+ echo "Copying Xcode.app..."
+ cp -RH "/Volumes/Xcode/Xcode.app" $DEVKIT_ROOT/
+fi
+# Trim out some seemingly unneeded parts to save space.
+rm -rf $DEVKIT_ROOT/Xcode.app/Contents/Applications
+rm -rf $DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/iPhone*
+rm -rf $DEVKIT_ROOT/Xcode.app/Contents/Developer/Documentation
+rm -rf $DEVKIT_ROOT/Xcode.app/Contents/Developer/usr/share/man
+if [ -e $DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk ]; then
+ rm -rf $DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
+ rm -rf $DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/share/man
+fi
+
+hdiutil detach /Volumes/Xcode
+
+################################################################################
+# Copy Freetype into sysroot
+if [ -e "/Volumes/XQuartz-*" ]; then
+ hdiutil detach /Volumes/XQuartz-*
+fi
+hdiutil attach $XQUARTZ_DMG
+
+echo "Copying freetype..."
+rm -rf /tmp/XQuartz
+pkgutil --expand /Volumes/XQuartz-*/XQuartz.pkg /tmp/XQuartz/
+rm -rf /tmp/x11
+mkdir /tmp/x11
+cd /tmp/x11
+cat /tmp/XQuartz-*/x11.pkg/Payload | gunzip -dc |cpio -i
+
+cp -RH opt/X11/include/freetype2 \
+ $DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/
+cp -RH opt/X11/include/ft2build.h \
+ $DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/
+cp -RH opt/X11/lib/libfreetype.* \
+ $DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib/
+
+cd -
+
+hdiutil detach /Volumes/XQuartz-*
+
+################################################################################
+# Optionally copy PackageMaker
+
+if [ -e "$AUXTOOLS_DMG" ]; then
+ if [ -e "/Volumes/Auxiliary Tools" ]; then
+ hdiutil detach "/Volumes/Auxiliary Tools"
+ fi
+ hdiutil attach $AUXTOOLS_DMG
+
+ echo "Copying PackageMaker.app..."
+ cp -RH "/Volumes/Auxiliary Tools/PackageMaker.app" $DEVKIT_ROOT/
+
+ hdiutil detach "/Volumes/Auxiliary Tools"
+fi
+
+################################################################################
+# Generate devkit.info
+
+echo-info() {
+ echo "$1" >> $DEVKIT_ROOT/devkit.info
+}
+
+echo "Generating devkit.info..."
+rm -f $DEVKIT_ROOT/devkit.info
+echo-info "# This file describes to configure how to interpret the contents of this devkit"
+echo-info "DEVKIT_NAME=\"Xcode $XCODE_VERSION (devkit)\""
+echo-info "DEVKIT_TOOLCHAIN_PATH=\"\$DEVKIT_ROOT/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:\$DEVKIT_ROOT/Xcode.app/Contents/Developer/usr/bin\""
+echo-info "DEVKIT_SYSROOT=\"\$DEVKIT_ROOT/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk\""
+echo-info "DEVKIT_EXTRA_PATH=\"\$DEVKIT_ROOT/PackageMaker.app/Contents/MacOS:\$DEVKIT_TOOLCHAIN_PATH\""
+
+################################################################################
+# Copy this script
+
+echo "Copying this script..."
+cp $0 $DEVKIT_ROOT/
+
+################################################################################
+# Create bundle
+
+echo "Creating bundle..."
+(cd $DEVKIT_ROOT && tar c - . | gzip - > "$DEVKIT_BUNDLE")
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/make/devkit/createWindowsDevkit.sh Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,131 @@
+#!/bin/bash
+#
+# 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.
+#
+
+# This script copies parts of a Visual Studio 2013 installation into a devkit
+# suitable for building OpenJDK and OracleJDK. Needs to run in Cygwin.
+# erik.joelsson@oracle.com
+
+VS_VERSION="2013"
+VS_VERSION_NUM="12.0"
+VS_VERSION_NUM_NODOT="120"
+SDK_VERSION="8.1"
+
+SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)"
+BUILD_DIR="${SCRIPT_DIR}/../../build/devkit"
+DEVKIT_ROOT="${BUILD_DIR}/VS${VS_VERSION}-devkit"
+DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz"
+
+echo "Creating devkit in $DEVKIT_ROOT"
+
+MSVCR_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/msvcr${VS_VERSION_NUM_NODOT}.dll
+MSVCP_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/msvcp${VS_VERSION_NUM_NODOT}.dll
+
+################################################################################
+# Copy Visual Studio files
+
+eval VSNNNCOMNTOOLS="\"\${VS${VS_VERSION_NUM_NODOT}COMNTOOLS}\""
+VS_INSTALL_DIR="$(cygpath "$VSNNNCOMNTOOLS/../..")"
+echo "VS_INSTALL_DIR: $VS_INSTALL_DIR"
+
+if [ ! -d $DEVKIT_ROOT/VC ]; then
+ echo "Copying VC..."
+ mkdir -p $DEVKIT_ROOT/VC/bin
+ cp -r "$VS_INSTALL_DIR/VC/bin/amd64" $DEVKIT_ROOT/VC/bin/
+ cp "$VS_INSTALL_DIR/VC/bin/"*.* $DEVKIT_ROOT/VC/bin/
+ cp -r "$VS_INSTALL_DIR/VC/bin/1033/" $DEVKIT_ROOT/VC/bin/
+ mkdir -p $DEVKIT_ROOT/VC/lib
+ cp -r "$VS_INSTALL_DIR/VC/lib/amd64" $DEVKIT_ROOT/VC/lib/
+ cp "$VS_INSTALL_DIR/VC/lib/"*.* $DEVKIT_ROOT/VC/lib/
+ cp -r "$VS_INSTALL_DIR/VC/include" $DEVKIT_ROOT/VC/
+ mkdir -p $DEVKIT_ROOT/VC/atlmfc/lib
+ cp -r "$VS_INSTALL_DIR/VC/atlmfc/include" $DEVKIT_ROOT/VC/atlmfc/
+ cp -r "$VS_INSTALL_DIR/VC/atlmfc/lib/amd64" $DEVKIT_ROOT/VC/atlmfc/lib/
+ cp "$VS_INSTALL_DIR/VC/atlmfc/lib/"*.* $DEVKIT_ROOT/VC/atlmfc/lib/
+ mkdir -p $DEVKIT_ROOT/VC/redist
+ cp -r "$VS_INSTALL_DIR/VC/redist/x64" $DEVKIT_ROOT/VC/redist/
+ cp -r "$VS_INSTALL_DIR/VC/redist/x86" $DEVKIT_ROOT/VC/redist/
+ # The redist runtime libs are needed to run the compiler but may not be
+ # installed on the machine where the devkit will be used.
+ cp $DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/
+ cp $DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/
+ cp $DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/amd64/
+ cp $DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/amd64/
+fi
+
+################################################################################
+# Copy SDK files
+
+PROGRAMFILES_X86="`env | sed -n 's/^ProgramFiles(x86)=//p'`"
+SDK_INSTALL_DIR="$(cygpath "$PROGRAMFILES_X86/Windows Kits/$SDK_VERSION")"
+echo "SDK_INSTALL_DIR: $SDK_INSTALL_DIR"
+
+if [ ! -d $DEVKIT_ROOT/$SDK_VERSION ]; then
+ echo "Copying SDK..."
+ mkdir -p $DEVKIT_ROOT/$SDK_VERSION/bin
+ cp -r "$SDK_INSTALL_DIR/bin/x64" $DEVKIT_ROOT/$SDK_VERSION/bin/
+ cp -r "$SDK_INSTALL_DIR/bin/x86" $DEVKIT_ROOT/$SDK_VERSION/bin/
+ mkdir -p $DEVKIT_ROOT/$SDK_VERSION/lib
+ cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x64 $DEVKIT_ROOT/$SDK_VERSION/lib/
+ cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x86 $DEVKIT_ROOT/$SDK_VERSION/lib/
+ cp -r "$SDK_INSTALL_DIR/include" $DEVKIT_ROOT/$SDK_VERSION/
+fi
+
+################################################################################
+# Generate devkit.info
+
+echo-info() {
+ echo "$1" >> $DEVKIT_ROOT/devkit.info
+}
+
+echo "Generating devkit.info..."
+rm -f $DEVKIT_ROOT/devkit.info
+echo-info "# This file describes to configure how to interpret the contents of this devkit"
+echo-info "DEVKIT_NAME=\"Microsoft Visual Studio $VS_VERSION (devkit)\""
+echo-info "DEVKIT_VS_VERSION=\"$VS_VERSION\""
+echo-info ""
+echo-info "DEVKIT_TOOLCHAIN_PATH_x86=\"\$DEVKIT_ROOT/VC/bin:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\""
+echo-info "DEVKIT_VS_INCLUDE_x86=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\""
+echo-info "DEVKIT_VS_LIB_x86=\"\$DEVKIT_ROOT/VC/lib;\$DEVKIT_ROOT/VC/atlmfc/lib;\$DEVKIT_ROOT/$SDK_VERSION/lib/x86\""
+echo-info "DEVKIT_MSVCR_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL\""
+echo-info "DEVKIT_MSVCP_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL\""
+echo-info ""
+echo-info "DEVKIT_TOOLCHAIN_PATH_x86_64=\"\$DEVKIT_ROOT/VC/bin/amd64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\""
+echo-info "DEVKIT_VS_INCLUDE_x86_64=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\""
+echo-info "DEVKIT_VS_LIB_x86_64=\"\$DEVKIT_ROOT/VC/lib/amd64;\$DEVKIT_ROOT/VC/atlmfc/lib/amd64;\$DEVKIT_ROOT/$SDK_VERSION/lib/x64\""
+echo-info "DEVKIT_MSVCR_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL\""
+echo-info "DEVKIT_MSVCP_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL\""
+
+################################################################################
+# Copy this script
+
+echo "Copying this script..."
+cp $0 $DEVKIT_ROOT/
+
+################################################################################
+# Create bundle
+
+echo "Creating bundle: $DEVKIT_BUNDLE"
+(cd "$DEVKIT_ROOT" && tar zcf "$DEVKIT_BUNDLE" .)
--- a/make/jprt.properties Wed Jun 24 17:45:44 2015 +0200
+++ b/make/jprt.properties Thu Jun 25 07:13:27 2015 +0000
@@ -281,12 +281,7 @@
solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_SerialGC, \
solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_ParallelGC, \
solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_CMS, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_G1, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_default_nontiered, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_SerialGC, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_ParallelGC, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_CMS, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_G1
+ solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_G1
my.test.targets.hotspot.solaris.x64= \
solaris_x64_5.11-{product|fastdebug}-c2-jvm98, \
@@ -298,10 +293,7 @@
solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_SerialGC, \
solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_ParallelGC, \
solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_CMS, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_G1, \
- solaris_x64_5.11-{product|fastdebug}-c2-jbb_default_nontiered, \
- solaris_x64_5.11-{product|fastdebug}-c2-jbb_SerialGC, \
- solaris_x64_5.11-{product|fastdebug}-c2-jbb_ParallelGC,
+ solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_G1
my.test.targets.hotspot.linux.i586= \
linux_i586_2.6-{product|fastdebug}-{c1|c2}-jvm98, \
@@ -315,12 +307,7 @@
linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
- linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
- linux_i586_2.6-{product|fastdebug}-c1-jbb_SerialGC, \
- linux_i586_2.6-{product|fastdebug}-c2-jbb_default_nontiered, \
- linux_i586_2.6-{product|fastdebug}-c1-jbb_ParallelGC, \
- linux_i586_2.6-{product|fastdebug}-c1-jbb_CMS, \
- linux_i586_2.6-{product|fastdebug}-c1-jbb_G1
+ linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_G1
my.test.targets.hotspot.linux.x64= \
linux_x64_2.6-{product|fastdebug}-c2-jvm98, \
@@ -329,10 +316,7 @@
linux_x64_2.6-{product|fastdebug}-c2-GCBasher_SerialGC, \
linux_x64_2.6-{product|fastdebug}-c2-GCBasher_ParallelGC, \
linux_x64_2.6-{product|fastdebug}-c2-GCBasher_CMS, \
- linux_x64_2.6-{product|fastdebug}-c2-GCBasher_G1, \
- linux_x64_2.6-{product|fastdebug}-c2-jbb_default_nontiered, \
- linux_x64_2.6-{product|fastdebug}-c2-jbb_ParallelGC, \
- linux_x64_2.6-{product|fastdebug}-c2-jbb_G1
+ linux_x64_2.6-{product|fastdebug}-c2-GCBasher_G1
my.test.targets.hotspot.macosx.x64= \
macosx_x64_10.9-{product|fastdebug}-c2-jvm98, \
@@ -341,10 +325,7 @@
macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_SerialGC, \
macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_ParallelGC, \
macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_CMS, \
- macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_G1, \
- macosx_x64_10.9-{product|fastdebug}-c2-jbb_default_nontiered, \
- macosx_x64_10.9-{product|fastdebug}-c2-jbb_ParallelGC, \
- macosx_x64_10.9-{product|fastdebug}-c2-jbb_G1
+ macosx_x64_10.9-{product|fastdebug}-c2-GCBasher_G1
my.test.targets.hotspot.windows.i586= \
windows_i586_6.2-{product|fastdebug}-{c1|c2}-jvm98, \
@@ -357,12 +338,7 @@
windows_i586_6.2-{product|fastdebug}-{c1|c2}-GCBasher_SerialGC, \
windows_i586_6.2-{product|fastdebug}-{c1|c2}-GCBasher_ParallelGC, \
windows_i586_6.2-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
- windows_i586_6.2-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
- windows_i586_6.2-{product|fastdebug}-{c1|c2}-jbb_default, \
- windows_i586_6.2-{product|fastdebug}-c2-jbb_default_nontiered, \
- windows_i586_6.2-product-{c1|c2}-jbb_ParallelGC, \
- windows_i586_6.2-product-{c1|c2}-jbb_CMS, \
- windows_i586_6.2-product-{c1|c2}-jbb_G1
+ windows_i586_6.2-{product|fastdebug}-{c1|c2}-GCBasher_G1
my.test.targets.hotspot.windows.x64= \
windows_x64_6.2-{product|fastdebug}-c2-jvm98, \
@@ -374,12 +350,7 @@
windows_x64_6.2-{product|fastdebug}-c2-GCBasher_SerialGC, \
windows_x64_6.2-{product|fastdebug}-c2-GCBasher_ParallelGC, \
windows_x64_6.2-{product|fastdebug}-c2-GCBasher_CMS, \
- windows_x64_6.2-{product|fastdebug}-c2-GCBasher_G1, \
- windows_x64_6.2-{product|fastdebug}-c2-jbb_default, \
- windows_x64_6.2-{product|fastdebug}-c2-jbb_default_nontiered, \
- windows_x64_6.2-product-c2-jbb_CMS, \
- windows_x64_6.2-product-c2-jbb_ParallelGC, \
- windows_x64_6.2-product-c2-jbb_G1
+ windows_x64_6.2-{product|fastdebug}-c2-GCBasher_G1
# Some basic "smoke" tests for OpenJDK builds
my.test.targets.hotspot.open= \
--- a/nashorn/.hgtags Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/.hgtags Thu Jun 25 07:13:27 2015 +0000
@@ -301,3 +301,5 @@
2054d01ae32649d3179e93d14108fdd6259c1c0d jdk9-b65
9dd95cff9dae897e8dee712f1f0303c460262288 jdk9-b66
f822b749821e364cae0b7bd7c8f667d9437e6d83 jdk9-b67
+dd6dd848b854dbd3f3cc422668276b1ae0834179 jdk9-b68
+194b74467afcab3ca0096f04570def424977215d jdk9-b69
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ConstructorGenerator.java Thu Jun 25 07:13:27 2015 +0000
@@ -152,6 +152,7 @@
}
if (constructor != null) {
+ initPrototype(mi);
final int arity = constructor.getArity();
if (arity != MemberInfo.DEFAULT_ARITY) {
mi.loadThis();
@@ -193,6 +194,7 @@
}
private void initFunctionFields(final MethodGenerator mi) {
+ assert memberCount > 0;
for (final MemberInfo memInfo : scriptClassInfo.getMembers()) {
if (!memInfo.isConstructorFunction()) {
continue;
@@ -204,37 +206,39 @@
}
private void initDataFields(final MethodGenerator mi) {
- for (final MemberInfo memInfo : scriptClassInfo.getMembers()) {
- if (!memInfo.isConstructorProperty() || memInfo.isFinal()) {
- continue;
- }
- final Object value = memInfo.getValue();
- if (value != null) {
- mi.loadThis();
- mi.loadLiteral(value);
- mi.putField(className, memInfo.getJavaName(), memInfo.getJavaDesc());
- } else if (!memInfo.getInitClass().isEmpty()) {
- final String clazz = memInfo.getInitClass();
- mi.loadThis();
- mi.newObject(clazz);
- mi.dup();
- mi.invokeSpecial(clazz, INIT, DEFAULT_INIT_DESC);
- mi.putField(className, memInfo.getJavaName(), memInfo.getJavaDesc());
- }
+ assert memberCount > 0;
+ for (final MemberInfo memInfo : scriptClassInfo.getMembers()) {
+ if (!memInfo.isConstructorProperty() || memInfo.isFinal()) {
+ continue;
+ }
+ final Object value = memInfo.getValue();
+ if (value != null) {
+ mi.loadThis();
+ mi.loadLiteral(value);
+ mi.putField(className, memInfo.getJavaName(), memInfo.getJavaDesc());
+ } else if (!memInfo.getInitClass().isEmpty()) {
+ final String clazz = memInfo.getInitClass();
+ mi.loadThis();
+ mi.newObject(clazz);
+ mi.dup();
+ mi.invokeSpecial(clazz, INIT, DEFAULT_INIT_DESC);
+ mi.putField(className, memInfo.getJavaName(), memInfo.getJavaDesc());
+ }
}
+ }
- if (constructor != null) {
- mi.loadThis();
- final String protoName = scriptClassInfo.getPrototypeClassName();
- mi.newObject(protoName);
- mi.dup();
- mi.invokeSpecial(protoName, INIT, DEFAULT_INIT_DESC);
- mi.dup();
- mi.loadThis();
- mi.invokeStatic(PROTOTYPEOBJECT_TYPE, PROTOTYPEOBJECT_SETCONSTRUCTOR,
- PROTOTYPEOBJECT_SETCONSTRUCTOR_DESC);
- mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETPROTOTYPE, SCRIPTFUNCTION_SETPROTOTYPE_DESC);
- }
+ private void initPrototype(final MethodGenerator mi) {
+ assert constructor != null;
+ mi.loadThis();
+ final String protoName = scriptClassInfo.getPrototypeClassName();
+ mi.newObject(protoName);
+ mi.dup();
+ mi.invokeSpecial(protoName, INIT, DEFAULT_INIT_DESC);
+ mi.dup();
+ mi.loadThis();
+ mi.invokeStatic(PROTOTYPEOBJECT_TYPE, PROTOTYPEOBJECT_SETCONSTRUCTOR,
+ PROTOTYPEOBJECT_SETCONSTRUCTOR_DESC);
+ mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETPROTOTYPE, SCRIPTFUNCTION_SETPROTOTYPE_DESC);
}
/**
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/Main.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/Main.java Thu Jun 25 07:13:27 2015 +0000
@@ -140,7 +140,7 @@
String simpleName = inFile.getName();
simpleName = simpleName.substring(0, simpleName.indexOf(".class"));
- if (sci.getPrototypeMemberCount() > 0) {
+ if (sci.isPrototypeNeeded()) {
// generate prototype class
final PrototypeGenerator protGen = new PrototypeGenerator(sci);
buf = protGen.getClassBytes();
@@ -152,7 +152,7 @@
}
}
- if (sci.getConstructorMemberCount() > 0 || sci.getConstructor() != null) {
+ if (sci.isConstructorNeeded()) {
// generate constructor class
final ConstructorGenerator consGen = new ConstructorGenerator(sci);
buf = consGen.getClassBytes();
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfo.java Thu Jun 25 07:13:27 2015 +0000
@@ -126,10 +126,42 @@
return Collections.unmodifiableList(res);
}
+ boolean isConstructorNeeded() {
+ // Constructor class generation is needed if we one or
+ // more constructor properties are defined or @Constructor
+ // is defined in the class.
+ for (final MemberInfo memInfo : members) {
+ if (memInfo.getKind() == Kind.CONSTRUCTOR ||
+ memInfo.getWhere() == Where.CONSTRUCTOR) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ boolean isPrototypeNeeded() {
+ // Prototype class generation is needed if we have atleast one
+ // prototype property or @Constructor defined in the class.
+ for (final MemberInfo memInfo : members) {
+ if (memInfo.getWhere() == Where.PROTOTYPE || memInfo.isConstructor()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
int getPrototypeMemberCount() {
int count = 0;
for (final MemberInfo memInfo : members) {
- if (memInfo.getWhere() == Where.PROTOTYPE || memInfo.isConstructor()) {
+ switch (memInfo.getKind()) {
+ case SETTER:
+ case SPECIALIZED_FUNCTION:
+ // SETTER was counted when GETTER was encountered.
+ // SPECIALIZED_FUNCTION was counted as FUNCTION already.
+ continue;
+ }
+
+ if (memInfo.getWhere() == Where.PROTOTYPE) {
count++;
}
}
@@ -139,6 +171,16 @@
int getConstructorMemberCount() {
int count = 0;
for (final MemberInfo memInfo : members) {
+ switch (memInfo.getKind()) {
+ case CONSTRUCTOR:
+ case SETTER:
+ case SPECIALIZED_FUNCTION:
+ // SETTER was counted when GETTER was encountered.
+ // Constructor and constructor SpecializedFunctions
+ // are not added as members and so not counted.
+ continue;
+ }
+
if (memInfo.getWhere() == Where.CONSTRUCTOR) {
count++;
}
@@ -149,6 +191,14 @@
int getInstancePropertyCount() {
int count = 0;
for (final MemberInfo memInfo : members) {
+ switch (memInfo.getKind()) {
+ case SETTER:
+ case SPECIALIZED_FUNCTION:
+ // SETTER was counted when GETTER was encountered.
+ // SPECIALIZED_FUNCTION was counted as FUNCTION already.
+ continue;
+ }
+
if (memInfo.getWhere() == Where.INSTANCE) {
count++;
}
--- a/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfoCollector.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/buildtools/nasgen/src/jdk/nashorn/internal/tools/nasgen/ScriptClassInfoCollector.java Thu Jun 25 07:13:27 2015 +0000
@@ -288,9 +288,7 @@
where = Where.PROTOTYPE;
break;
case SPECIALIZED_FUNCTION:
- if (isSpecializedConstructor) {
- where = Where.CONSTRUCTOR;
- }
+ where = isSpecializedConstructor? Where.CONSTRUCTOR : Where.PROTOTYPE;
//fallthru
default:
break;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/autoimports.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,151 @@
+# autoimports script requires -scripting mode
+
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * It is tedious to import Java classes used in a script. Sometimes it is easier
+ * use simple names of java classes and have a script auto import Java classes.
+ * You can load this script at the start of an interactive jjs session or at the
+ * start of your script. This script defines a __noSuchProperty__ hook to auto
+ * import Java classes as needed and when they are referred to for the first time
+ * in your script. You can also call the "autoimports" function to print script
+ * statements that you need to use in your script, i.e., have the function generate
+ * a script to import Java classes used by your script so far. After running your
+ * script, you can call autoimports to get the exact Java imports you need and replace
+ * the autoimports load with the generated import statements (to avoid costly init of
+ * the autoimports script).
+ */
+
+(function() {
+ var ArrayList = Java.type("java.util.ArrayList");
+ var HashMap = Java.type("java.util.HashMap");
+ var Files = Java.type("java.nio.file.Files");
+ var FileSystems = Java.type("java.nio.file.FileSystems");
+ var URI = Java.type("java.net.URI");
+
+ // initialize a class to package map by iterating all
+ // classes available in the system by walking through "jrt fs"
+ var fs = FileSystems.getFileSystem(URI.create("jrt:/"));
+ var root = fs.getPath('/');
+
+ var clsToPkg = new HashMap();
+
+ function addToClsToPkg(c, p) {
+ if (clsToPkg.containsKey(c)) {
+ var val = clsToPkg.get(c);
+ if (val instanceof ArrayList) {
+ val.add(p);
+ } else {
+ var al = new ArrayList();
+ al.add(val);
+ al.add(p);
+ clsToPkg.put(c, al);
+ }
+ } else {
+ clsToPkg.put(c, p);
+ }
+ }
+
+ // handle collision and allow user to choose package
+ function getPkgOfCls(c) {
+ var val = clsToPkg.get(c);
+ if (val instanceof ArrayList) {
+ var count = 1;
+ print("Multiple matches for " + c + ", choose package:");
+ for each (var v in val) {
+ print(count + ". " + v);
+ count++;
+ }
+ var choice = parseInt(readLine());
+ if (isNaN(choice) || choice < 1 || choice > val.size()) {
+ print("invalid choice: " + choice);
+ return undefined;
+ }
+ return val.get(choice - 1);
+ } else {
+ return val;
+ }
+ }
+
+ Files.walk(root).forEach(function(p) {
+ if (Files.isRegularFile(p)) {
+ var str = p.toString();
+ if (str.endsWith(".class")) {
+ str = str.substring(1);
+ var idx = str.indexOf('/');
+ if (idx != -1) {
+ str = str.substring(idx + 1);
+ if (str.startsWith("java") ||
+ str.startsWith("javax") ||
+ str.startsWith("org")) {
+ var lastIdx = str.lastIndexOf('/');
+ if (lastIdx != -1) {
+ var pkg = str.substring(0, lastIdx).replaceAll('/', '.');
+ var cls = str.substring(lastIdx + 1, str.lastIndexOf(".class"));
+ addToClsToPkg(cls, pkg);
+ }
+ }
+ }
+ }
+ }
+ });
+
+ var imports = new ArrayList();
+ var global = this;
+ var oldNoSuchProp = global.__noSuchProperty__;
+ this.__noSuchProperty__ = function(name) {
+ 'use strict';
+
+ if (clsToPkg.containsKey(name)) {
+ var pkg = getPkgOfCls(name);
+ if (pkg) {
+ var clsName = pkg + "." + name;
+ imports.add("var " + name + " = Java.type('" + clsName + "');");
+ return global[name] = Java.type(clsName);
+ }
+ } else if (typeof oldNoSuchProp == 'function') {
+ return oldNoSuchProp.call(this, name);
+ }
+
+ if (typeof this == 'undefined') {
+ throw new ReferenceError(name);
+ } else {
+ return undefined;
+ }
+ }
+
+ this.autoimports = function() {
+ for each (var im in imports) {
+ print(im);
+ }
+ }
+})();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/dateconversion.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Converting between #javascript Date and #java8 LocalDateTime with #nashorn
+
+// JavaScript Date with current time
+var d = new Date();
+print(d);
+
+// Java 8 java.time classes used
+var Instant = java.time.Instant;
+var LocalDateTime = java.time.LocalDateTime;
+var ZoneId = java.time.ZoneId;
+
+// Date.prototype.getTime
+
+// getTime() method returns the numeric value corresponding to the time
+// for the specified date according to universal time. The value returned
+// by the getTime() method is the number of milliseconds since 1 January 1970 00:00:00 UTC.
+// See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime
+
+// Java Instant.ofEpochMilli to convert time in milliseconds to Instant object
+// https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#ofEpochMilli-long-
+
+var instant = Instant.ofEpochMilli(d.getTime());
+
+// Instant to LocalDateTime using LocalDateTime.ofInstant
+// https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#ofInstant-java.time.Instant-java.time.ZoneId-
+
+var ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+print(ldt);
+
+// converting a LocalDateTime to JavaScript Date
+// convert LocalDateTime to Instant first
+// https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#atZone-java.time.ZoneId-
+
+var instant = ldt.atZone(ZoneId.systemDefault()).toInstant();
+
+// instant to to epoch milliseconds
+// https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#toEpochMilli--
+// and then to JavaScript Date from time in milliseconds
+// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date
+
+var d1 = new Date(instant.toEpochMilli());
+print(d1);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/exec.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,50 @@
+# exec script requires -scripting mode
+
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// The $EXEC builtin function can be used to run external commands:
+$EXEC("ls")
+$EXEC("ls -la")
+
+// It can also be given a string to use as stdin:
+$EXEC("cat", "Hello, world!")
+
+// Additional arguments can be passed after the stdin argument, as an array of
+// strings, or a sequence of varargs:
+$EXEC("ls", "" /* no stdin */, "-l", "-a")
+$EXEC("ls", "" /* no stdin */, ["-l", "-a"])
+
+// Output of running external commands is returned from $EXEC:
+print($EXEC("ls"))
+
+// apply on $EXEC
+print($EXEC.apply(this, ["ls"]));
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/javahelp.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// script helpers to print meta info on Java instances and classes
+
+// print instance methods info on a Java object or static methods info of a Java class
+function methods(jobj) {
+ if (! Java.isJavaObject(jobj)) {
+ throw new TypeError("not a Java object");
+ }
+
+ var isStatic = Java.isType(jobj);
+ var obj = Object.bindProperties({}, jobj);
+ for each (var i in obj) {
+ if (Java.isJavaMethod(i)) {
+ var str = String(i);
+ var idx = str.indexOf(' ');
+ var overloaded = str.substring(0, idx).endsWith("OverloadedDynamicMethod");
+ var lastIdx = isStatic? str.lastIndexOf('] on') : str.lastIndexOf(']');
+ print(str.substring(idx + 1, lastIdx) + (overloaded? "*" : ""))
+ }
+ }
+}
+
+// print instance field names of a Java object or static field names of a Java class
+function fields(jobj) {
+ if (! Java.isJavaObject(jobj)) {
+ throw new TypeError("not a Java object");
+ }
+
+ var obj = Object.bindProperties({}, jobj);
+ for (var i in obj) {
+ if (! Java.isJavaMethod(obj[i])) {
+ print(i);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/secondssince.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,43 @@
+# usage: jjs secondssince.js
+
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of Oracle nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+// Number of seconds elapsed since the specified Instance #nashorn #javascript #java
+// Input date and time in ISO 8601 format
+// Example: 2001-01-01T00:00:00Z for 1 Jan 2001, 0 GMT
+
+var Instant = java.time.Instant;
+var ChronoUnit = java.time.temporal.ChronoUnit;
+print("Enter date time:");
+var sec = Instant.parse(readLine()).
+ until(Instant.now(), ChronoUnit.SECONDS);
+print(sec);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Thu Jun 25 07:13:27 2015 +0000
@@ -99,10 +99,12 @@
import jdk.internal.dynalink.support.RuntimeContextLinkRequestImpl;
/**
- * The linker for {@link RelinkableCallSite} objects. Users of it (scripting frameworks and language runtimes) have to
- * create a linker using the {@link DynamicLinkerFactory} and invoke its link method from the invokedynamic bootstrap
- * methods to set the target of all the call sites in the code they generate. Usual usage would be to create one class
- * per language runtime to contain one linker instance as:
+ * The linker for {@link RelinkableCallSite} objects. Users of it (scripting
+ * frameworks and language runtimes) have to create a linker using the
+ * {@link DynamicLinkerFactory} and invoke its link method from the invokedynamic
+ * bootstrap methods to set the target of all the call sites in the code they
+ * generate. Usual usage would be to create one class per language runtime to
+ * contain one linker instance as:
*
* <pre>
* class MyLanguageRuntime {
@@ -123,19 +125,27 @@
*
* Note how there are three components you will need to provide here:
* <ul>
- * <li>You're expected to provide a {@link GuardingDynamicLinker} for your own language. If your runtime doesn't
- * have its own language and/or object model (i.e. it's a generic scripting shell), you don't need to implement a
- * dynamic linker; you would simply not invoke the {@code setPrioritizedLinker} method on the factory, or even better,
- * simply use {@link DefaultBootstrapper}.</li>
- * <li>The performance of the programs can depend on your choice of the class to represent call sites. The above
- * example used {@link MonomorphicCallSite}, but you might want to use {@link ChainedCallSite} instead. You'll need to
- * experiment and decide what fits your language runtime the best. You can subclass either of these or roll your own if
- * you need to.</li>
- * <li>You also need to provide {@link CallSiteDescriptor}s to your call sites. They are immutable objects that contain
- * all the information about the call site: the class performing the lookups, the name of the method being invoked, and
- * the method signature. The library has a default {@link CallSiteDescriptorFactory} for descriptors that you can use,
- * or you can create your own descriptor classes, especially if you need to add further information (values passed in
+ *
+ * <li>You're expected to provide a {@link GuardingDynamicLinker} for your own
+ * language. If your runtime doesn't have its own language and/or object model
+ * (i.e., it's a generic scripting shell), you don't need to implement a dynamic
+ * linker; you would simply not invoke the {@code setPrioritizedLinker} method
+ * on the factory, or even better, simply use {@link DefaultBootstrapper}.</li>
+ *
+ * <li>The performance of the programs can depend on your choice of the class to
+ * represent call sites. The above example used {@link MonomorphicCallSite}, but
+ * you might want to use {@link ChainedCallSite} instead. You'll need to
+ * experiment and decide what fits your language runtime the best. You can
+ * subclass either of these or roll your own if you need to.</li>
+ *
+ * <li>You also need to provide {@link CallSiteDescriptor}s to your call sites.
+ * They are immutable objects that contain all the information about the call
+ * site: the class performing the lookups, the name of the method being invoked,
+ * and the method signature. The library has a default {@link CallSiteDescriptorFactory}
+ * for descriptors that you can use, or you can create your own descriptor
+ * classes, especially if you need to add further information (values passed in
* additional parameters to the bootstrap method) to them.</li>
+ *
* </ul>
*
* @author Attila Szegedi
@@ -176,11 +186,15 @@
}
/**
- * Links an invokedynamic call site. It will install a method handle into the call site that invokes the relinking
- * mechanism of this linker. Next time the call site is invoked, it will be linked for the actual arguments it was
- * invoked with.
+ * Links an invokedynamic call site. It will install a method handle into
+ * the call site that invokes the relinking mechanism of this linker. Next
+ * time the call site is invoked, it will be linked for the actual arguments
+ * it was invoked with.
*
+ * @param <T> the particular subclass of {@link RelinkableCallSite} for
+ * which to create a link.
* @param callSite the call site to link.
+ *
* @return the callSite, for easy call chaining.
*/
public <T extends RelinkableCallSite> T link(final T callSite) {
@@ -189,10 +203,13 @@
}
/**
- * Returns the object representing the lower level linker services of this class that are normally exposed to
- * individual language-specific linkers. While as a user of this class you normally only care about the
- * {@link #link(RelinkableCallSite)} method, in certain circumstances you might want to use the lower level services
- * directly; either to lookup specific method handles, to access the type converters, and so on.
+ * Returns the object representing the lower level linker services of this
+ * class that are normally exposed to individual language-specific linkers.
+ * While as a user of this class you normally only care about the
+ * {@link #link(RelinkableCallSite)} method, in certain circumstances you
+ * might want to use the lower level services directly; either to lookup
+ * specific method handles, to access the type converters, and so on.
+ *
* @return the object representing the linker services of this class.
*/
public LinkerServices getLinkerServices() {
@@ -218,7 +235,9 @@
*
* @param callSite the call site itself
* @param arguments arguments to the invocation
+ *
* @return return the method handle for the invocation
+ *
* @throws Exception rethrows any exception thrown by the linkers
*/
@SuppressWarnings("unused")
@@ -272,11 +291,15 @@
}
/**
- * Returns a stack trace element describing the location of the call site currently being linked on the current
- * thread. The operation internally creates a Throwable object and inspects its stack trace, so it's potentially
- * expensive. The recommended usage for it is in writing diagnostics code.
- * @return a stack trace element describing the location of the call site currently being linked, or null if it is
- * not invoked while a call site is being linked.
+ * Returns a stack trace element describing the location of the call site
+ * currently being linked on the current thread. The operation internally
+ * creates a Throwable object and inspects its stack trace, so it's
+ * potentially expensive. The recommended usage for it is in writing
+ * diagnostics code.
+ *
+ * @return a stack trace element describing the location of the call site
+ * currently being linked, or null if it is not invoked while a call
+ * site is being linked.
*/
public static StackTraceElement getLinkedCallSiteLocation() {
final StackTraceElement[] trace = new Throwable().getStackTrace();
@@ -290,8 +313,10 @@
}
/**
- * Deprecated because of not precise name.
+ * Deprecated because of imprecise name.
+ *
* @deprecated Use {@link #getLinkedCallSiteLocation()} instead.
+ *
* @return see non-deprecated method
*/
@Deprecated
@@ -300,20 +325,26 @@
}
/**
- * Returns true if the frame represents {@code MethodHandleNatives.linkCallSite()}, the frame immediately on top of
- * the call site frame when the call site is being linked for the first time.
+ * Returns {@code true} if the frame represents {@code MethodHandleNatives.linkCallSite()},
+ * the frame immediately on top of the call site frame when the call site is
+ * being linked for the first time.
+ *
* @param frame the frame
- * @return true if this frame represents {@code MethodHandleNatives.linkCallSite()}
+ *
+ * @return {@code true} if this frame represents {@code MethodHandleNatives.linkCallSite()}.
*/
private static boolean isInitialLinkFrame(final StackTraceElement frame) {
return testFrame(frame, INITIAL_LINK_METHOD_NAME, INITIAL_LINK_CLASS_NAME);
}
/**
- * Returns true if the frame represents {@code DynamicLinker.relink()}, the frame immediately on top of the call
- * site frame when the call site is being relinked (linked for second and subsequent times).
+ * Returns {@code true} if the frame represents {@code DynamicLinker.relink()},
+ * the frame immediately on top of the call site frame when the call site is
+ * being relinked (linked for second and subsequent times).
+ *
* @param frame the frame
- * @return true if this frame represents {@code DynamicLinker.relink()}
+ *
+ * @return {@code true} if this frame represents {@code DynamicLinker.relink()}.
*/
private static boolean isRelinkFrame(final StackTraceElement frame) {
return testFrame(frame, RELINK_METHOD_NAME, CLASS_NAME);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java Thu Jun 25 07:13:27 2015 +0000
@@ -178,8 +178,7 @@
* denies {@code RuntimePermission("nashorn.setConfig")}
*/
public ScriptEngine getScriptEngine(final ClassFilter classFilter) {
- Objects.requireNonNull(classFilter);
- return newEngine(DEFAULT_OPTIONS, getAppClassLoader(), classFilter);
+ return newEngine(DEFAULT_OPTIONS, getAppClassLoader(), Objects.requireNonNull(classFilter));
}
/**
@@ -193,8 +192,7 @@
* denies {@code RuntimePermission("nashorn.setConfig")}
*/
public ScriptEngine getScriptEngine(final String... args) {
- Objects.requireNonNull(args);
- return newEngine(args, getAppClassLoader(), null);
+ return newEngine(Objects.requireNonNull(args), getAppClassLoader(), null);
}
/**
@@ -209,8 +207,7 @@
* denies {@code RuntimePermission("nashorn.setConfig")}
*/
public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader) {
- Objects.requireNonNull(args);
- return newEngine(args, appLoader, null);
+ return newEngine(Objects.requireNonNull(args), appLoader, null);
}
/**
@@ -226,9 +223,7 @@
* denies {@code RuntimePermission("nashorn.setConfig")}
*/
public ScriptEngine getScriptEngine(final String[] args, final ClassLoader appLoader, final ClassFilter classFilter) {
- Objects.requireNonNull(args);
- Objects.requireNonNull(classFilter);
- return newEngine(args, appLoader, classFilter);
+ return newEngine(Objects.requireNonNull(args), appLoader, Objects.requireNonNull(classFilter));
}
private ScriptEngine newEngine(final String[] args, final ClassLoader appLoader, final ClassFilter classFilter) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptObjectMirror.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptObjectMirror.java Thu Jun 25 07:13:27 2015 +0000
@@ -172,7 +172,7 @@
return Context.getContext();
}
}, GET_CONTEXT_ACC_CTXT);
- return wrapLikeMe(context.eval(global, s, sobj, null, false));
+ return wrapLikeMe(context.eval(global, s, sobj, null));
}
});
}
@@ -255,14 +255,12 @@
@Override
public void removeMember(final String name) {
- Objects.requireNonNull(name);
- remove(name);
+ remove(Objects.requireNonNull(name));
}
@Override
public void setMember(final String name, final Object value) {
- Objects.requireNonNull(name);
- put(name, value);
+ put(Objects.requireNonNull(name), value);
}
@Override
@@ -429,7 +427,7 @@
@Override
public void putAll(final Map<? extends String, ? extends Object> map) {
- Objects.requireNonNull(map, "map is null");
+ Objects.requireNonNull(map);
final ScriptObject oldGlobal = Context.getGlobal();
final boolean globalChanged = (oldGlobal != global);
inGlobal(new Callable<Object>() {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Thu Jun 25 07:13:27 2015 +0000
@@ -78,8 +78,7 @@
* @throws NullPointerException if url is null
*/
public URLReader(final URL url, final Charset cs) {
- Objects.requireNonNull(url);
- this.url = url;
+ this.url = Objects.requireNonNull(url);
this.cs = cs;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java Thu Jun 25 07:13:27 2015 +0000
@@ -58,15 +58,13 @@
@Override
public CompilationUnitTree parse(final File file, final DiagnosticListener listener) throws IOException, NashornException {
- Objects.requireNonNull(file);
- final Source src = Source.sourceFor(file.getName(), file);
+ final Source src = Source.sourceFor(Objects.requireNonNull(file).getName(), file);
return translate(makeParser(src, listener).parse());
}
@Override
public CompilationUnitTree parse(final Path path, final DiagnosticListener listener) throws IOException, NashornException {
- Objects.requireNonNull(path);
- final Source src = Source.sourceFor(path.toString(), path);
+ final Source src = Source.sourceFor(Objects.requireNonNull(path).toString(), path);
return translate(makeParser(src, listener).parse());
}
@@ -78,9 +76,7 @@
@Override
public CompilationUnitTree parse(final String name, final Reader reader, final DiagnosticListener listener) throws IOException, NashornException {
- Objects.requireNonNull(name);
- Objects.requireNonNull(reader);
- final Source src = Source.sourceFor(name, reader);
+ final Source src = Source.sourceFor(Objects.requireNonNull(name), Objects.requireNonNull(reader));
return translate(makeParser(src, listener).parse());
}
@@ -92,8 +88,7 @@
@Override
public CompilationUnitTree parse(final ScriptObjectMirror scriptObj, final DiagnosticListener listener) throws NashornException {
- Objects.requireNonNull(scriptObj);
- final Map<?,?> map = scriptObj;
+ final Map<?,?> map = Objects.requireNonNull(scriptObj);
if (map.containsKey("script") && map.containsKey("name")) {
final String script = JSType.toString(map.get("script"));
final String name = JSType.toString(map.get("name"));
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ClassEmitter.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ClassEmitter.java Thu Jun 25 07:13:27 2015 +0000
@@ -100,7 +100,6 @@
* There is also a very nice debug interface that can emit formatted
* bytecodes that have been written. This is enabled by setting the
* environment "nashorn.codegen.debug" to true, or --log=codegen:{@literal <level>}
- * <p>
*
* @see Compiler
*/
@@ -144,7 +143,7 @@
/**
* Constructor - only used internally in this class as it breaks
- * abstraction towards ASM or other code generator below
+ * abstraction towards ASM or other code generator below.
*
* @param env script environment
* @param cw ASM classwriter
@@ -157,7 +156,8 @@
}
/**
- * Return the method names encountered
+ * Return the method names encountered.
+ *
* @return method names
*/
public Set<String> getMethodNames() {
@@ -165,12 +165,13 @@
}
/**
- * Constructor
+ * Constructor.
*
* @param env script environment
* @param className name of class to weave
* @param superClassName super class name for class
- * @param interfaceNames names of interfaces implemented by this class, or null if none
+ * @param interfaceNames names of interfaces implemented by this class, or
+ * {@code null} if none
*/
ClassEmitter(final Context context, final String className, final String superClassName, final String... interfaceNames) {
this(context, new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS));
@@ -178,7 +179,7 @@
}
/**
- * Constructor from the compiler
+ * Constructor from the compiler.
*
* @param env Script environment
* @param sourceName Source name
@@ -217,7 +218,6 @@
}
/**
- * Returns the name of the compile unit class name.
* @return the name of the compile unit class name.
*/
String getUnitClassName() {
@@ -225,7 +225,8 @@
}
/**
- * Get the method count, including init and clinit methods
+ * Get the method count, including init and clinit methods.
+ *
* @return method count
*/
public int getMethodCount() {
@@ -233,7 +234,8 @@
}
/**
- * Get the clinit count
+ * Get the clinit count.
+ *
* @return clinit count
*/
public int getClinitCount() {
@@ -241,7 +243,8 @@
}
/**
- * Get the init count
+ * Get the init count.
+ *
* @return init count
*/
public int getInitCount() {
@@ -249,7 +252,8 @@
}
/**
- * Get the field count
+ * Get the field count.
+ *
* @return field count
*/
public int getFieldCount() {
@@ -260,6 +264,7 @@
* Convert a binary name to a package/class name.
*
* @param name Binary name.
+ *
* @return Package/class name.
*/
private static String pathName(final String name) {
@@ -268,6 +273,7 @@
/**
* Define the static fields common in all scripts.
+ *
* @param strictMode Should we generate this method in strict mode
*/
private void defineCommonStatics(final boolean strictMode) {
@@ -284,8 +290,8 @@
}
/**
- * Define static utilities common needed in scripts. These are per compile unit
- * and therefore have to be defined here and not in code gen.
+ * Define static utilities common needed in scripts. These are per compile
+ * unit and therefore have to be defined here and not in code gen.
*/
private void defineCommonUtilities() {
assert unitClassName != null;
@@ -333,7 +339,9 @@
}
/**
- * Constructs a primitive specific method for getting the ith entry from the constants table as an array.
+ * Constructs a primitive specific method for getting the ith entry from the
+ * constants table as an array.
+ *
* @param clazz Array class.
*/
private void defineGetArrayMethod(final Class<?> clazz) {
@@ -356,7 +364,9 @@
/**
* Generate the name of a get array from constant pool method.
+ *
* @param clazz Name of array class.
+ *
* @return Method name.
*/
static String getArrayMethodName(final Class<?> clazz) {
@@ -366,6 +376,7 @@
/**
* Ensure a get constant method is issued for the class.
+ *
* @param clazz Class of constant.
*/
void needGetConstantMethod(final Class<?> clazz) {
@@ -373,12 +384,12 @@
}
/**
- * Inspect class name and decide whether we are generating a ScriptObject class
+ * Inspect class name and decide whether we are generating a ScriptObject class.
*
* @param scriptPrefix the script class prefix for the current script
* @param type the type to check
*
- * @return true if type is ScriptObject
+ * @return {@code true} if type is ScriptObject
*/
private static boolean isScriptObject(final String scriptPrefix, final String type) {
if (type.startsWith(scriptPrefix)) {
@@ -393,14 +404,14 @@
}
/**
- * Call at beginning of class emission
+ * Call at beginning of class emission.
*/
public void begin() {
classStarted = true;
}
/**
- * Call at end of class emission
+ * Call at end of class emission.
*/
public void end() {
assert classStarted : "class not started for " + unitClassName;
@@ -424,7 +435,9 @@
/**
* Disassemble an array of byte code.
+ *
* @param bytecode byte array representing bytecode
+ *
* @return disassembly as human readable string
*/
static String disassemble(final byte[] bytecode) {
@@ -446,7 +459,7 @@
}
/**
- * Call back from MethodEmitter for method start
+ * Call back from MethodEmitter for method start.
*
* @see MethodEmitter
*
@@ -458,7 +471,7 @@
}
/**
- * Call back from MethodEmitter for method end
+ * Call back from MethodEmitter for method end.
*
* @see MethodEmitter
*
@@ -470,7 +483,7 @@
}
/**
- * Add a new method to the class - defaults to public method
+ * Add a new method to the class - defaults to public method.
*
* @param methodName name of method
* @param rtype return type of the method
@@ -483,7 +496,7 @@
}
/**
- * Add a new method to the class - defaults to public method
+ * Add a new method to the class - defaults to public method.
*
* @param methodFlags access flags for the method
* @param methodName name of method
@@ -499,7 +512,7 @@
}
/**
- * Add a new method to the class - defaults to public method
+ * Add a new method to the class - defaults to public method.
*
* @param methodName name of method
* @param descriptor descriptor of method
@@ -511,7 +524,7 @@
}
/**
- * Add a new method to the class - defaults to public method
+ * Add a new method to the class - defaults to public method.
*
* @param methodFlags access flags for the method
* @param methodName name of method
@@ -526,9 +539,10 @@
}
/**
- * Add a new method to the class, representing a function node
+ * Add a new method to the class, representing a function node.
*
* @param functionNode the function node to generate a method for
+ *
* @return method emitter to use for weaving this method
*/
MethodEmitter method(final FunctionNode functionNode) {
@@ -546,9 +560,11 @@
}
/**
- * Add a new method to the class, representing a rest-of version of the function node
+ * Add a new method to the class, representing a rest-of version of the
+ * function node.
*
* @param functionNode the function node to generate a method for
+ *
* @return method emitter to use for weaving this method
*/
MethodEmitter restOfMethod(final FunctionNode functionNode) {
@@ -566,7 +582,7 @@
/**
- * Start generating the <clinit> method in the class
+ * Start generating the <clinit> method in the class.
*
* @return method emitter to use for weaving <clinit>
*/
@@ -576,7 +592,7 @@
}
/**
- * Start generating an <init>()V method in the class
+ * Start generating an <init>()V method in the class.
*
* @return method emitter to use for weaving <init>()V
*/
@@ -586,7 +602,7 @@
}
/**
- * Start generating an <init>()V method in the class
+ * Start generating an <init>()V method in the class.
*
* @param ptypes parameter types for constructor
* @return method emitter to use for weaving <init>()V
@@ -597,7 +613,7 @@
}
/**
- * Start generating an <init>(...)V method in the class
+ * Start generating an <init>(...)V method in the class.
*
* @param flags access flags for the constructor
* @param ptypes parameter types for the constructor
@@ -610,7 +626,7 @@
}
/**
- * Add a field to the class, initialized to a value
+ * Add a field to the class, initialized to a value.
*
* @param fieldFlags flags, e.g. should it be static or public etc
* @param fieldName name of field
@@ -625,7 +641,7 @@
}
/**
- * Add a field to the class
+ * Add a field to the class.
*
* @param fieldFlags access flags for the field
* @param fieldName name of field
@@ -638,7 +654,7 @@
}
/**
- * Add a field to the class - defaults to public
+ * Add a field to the class - defaults to public.
*
* @param fieldName name of field
* @param fieldType type of field
@@ -651,7 +667,8 @@
* Return a bytecode array from this ClassEmitter. The ClassEmitter must
* have been ended (having its end function called) for this to work.
*
- * @return byte code array for generated class, null if class generation hasn't been ended with {@link ClassEmitter#end()}
+ * @return byte code array for generated class, {@code null} if class
+ * generation hasn't been ended with {@link ClassEmitter#end()}.
*/
byte[] toByteArray() {
assert classEnded;
@@ -663,13 +680,9 @@
}
/**
- * Abstraction for flags used in class emission
- *
- * We provide abstraction separating these from the underlying bytecode
- * emitter.
- *
- * Flags are provided for method handles, protection levels, static/virtual
- * fields/methods.
+ * Abstraction for flags used in class emission. We provide abstraction
+ * separating these from the underlying bytecode emitter. Flags are provided
+ * for method handles, protection levels, static/virtual fields/methods.
*/
static enum Flag {
/** method handle with static access */
@@ -707,10 +720,12 @@
}
/**
- * Return the corresponding ASM flag value for an enum set of flags
+ * Return the corresponding ASM flag value for an enum set of flags.
*
* @param flags enum set of flags
- * @return an integer value representing the flags intrinsic values or:ed together
+ *
+ * @return an integer value representing the flags intrinsic values
+ * or:ed together
*/
static int getValue(final EnumSet<Flag> flags) {
int v = 0;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompileUnit.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompileUnit.java Thu Jun 25 07:13:27 2015 +0000
@@ -122,8 +122,7 @@
* @param clazz class with code for this compile unit
*/
void setCode(final Class<?> clazz) {
- Objects.requireNonNull(clazz);
- this.clazz = clazz;
+ this.clazz = Objects.requireNonNull(clazz);
// Revisit this - refactor to avoid null-ed out non-final fields
// null out emitter
this.classEmitter = null;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Compiler.java Thu Jun 25 07:13:27 2015 +0000
@@ -103,7 +103,7 @@
private final CodeInstaller<ScriptEnvironment> installer;
- /** logger for compiler, trampolines, splits and related code generation events
+ /** logger for compiler, trampolines and related code generation events
* that affect classes */
private final DebugLogger log;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ConstantData.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ConstantData.java Thu Jun 25 07:13:27 2015 +0000
@@ -30,6 +30,8 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
+
import jdk.nashorn.internal.runtime.PropertyMap;
/**
@@ -120,7 +122,7 @@
private final int hashCode;
public PropertyMapWrapper(final PropertyMap map) {
- this.hashCode = Arrays.hashCode(map.getProperties());
+ this.hashCode = Arrays.hashCode(map.getProperties()) + 31 * Objects.hashCode(map.getClassName());
this.propertyMap = map;
}
@@ -131,8 +133,13 @@
@Override
public boolean equals(final Object other) {
- return other instanceof PropertyMapWrapper &&
- Arrays.equals(propertyMap.getProperties(), ((PropertyMapWrapper) other).propertyMap.getProperties());
+ if (!(other instanceof PropertyMapWrapper)) {
+ return false;
+ }
+ final PropertyMap otherMap = ((PropertyMapWrapper) other).propertyMap;
+ return propertyMap == otherMap
+ || (Arrays.equals(propertyMap.getProperties(), otherMap.getProperties())
+ && Objects.equals(propertyMap.getClassName(), otherMap.getClassName()));
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Thu Jun 25 07:13:27 2015 +0000
@@ -584,7 +584,9 @@
@Override
public Node leaveVarNode(final VarNode varNode) {
addStatement(varNode);
- if (varNode.getFlag(VarNode.IS_LAST_FUNCTION_DECLARATION) && lc.getCurrentFunction().isProgram()) {
+ if (varNode.getFlag(VarNode.IS_LAST_FUNCTION_DECLARATION)
+ && lc.getCurrentFunction().isProgram()
+ && ((FunctionNode) varNode.getInit()).isAnonymous()) {
new ExpressionStatement(varNode.getLineNumber(), varNode.getToken(), varNode.getFinish(), new IdentNode(varNode.getName())).accept(this);
}
return varNode;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Splitter.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Splitter.java Thu Jun 25 07:13:27 2015 +0000
@@ -42,13 +42,17 @@
import jdk.nashorn.internal.ir.SplitNode;
import jdk.nashorn.internal.ir.Statement;
import jdk.nashorn.internal.ir.visitor.NodeVisitor;
+import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.logging.DebugLogger;
+import jdk.nashorn.internal.runtime.logging.Loggable;
+import jdk.nashorn.internal.runtime.logging.Logger;
import jdk.nashorn.internal.runtime.options.Options;
/**
* Split the IR into smaller compile units.
*/
-final class Splitter extends NodeVisitor<LexicalContext> {
+@Logger(name="splitter")
+final class Splitter extends NodeVisitor<LexicalContext> implements Loggable {
/** Current compiler. */
private final Compiler compiler;
@@ -78,7 +82,17 @@
this.compiler = compiler;
this.outermost = functionNode;
this.outermostCompileUnit = outermostCompileUnit;
- this.log = compiler.getLogger();
+ this.log = initLogger(compiler.getContext());
+ }
+
+ @Override
+ public DebugLogger initLogger(final Context context) {
+ return context.getLogger(this.getClass());
+ }
+
+ @Override
+ public DebugLogger getLogger() {
+ return log;
}
/**
@@ -89,7 +103,7 @@
FunctionNode split(final FunctionNode fn, final boolean top) {
FunctionNode functionNode = fn;
- log.finest("Initiating split of '", functionNode.getName(), "'");
+ log.fine("Initiating split of '", functionNode.getName(), "'");
long weight = WeighNodes.weigh(functionNode);
@@ -98,7 +112,7 @@
assert lc.isEmpty() : "LexicalContext not empty";
if (weight >= SPLIT_THRESHOLD) {
- log.finest("Splitting '", functionNode.getName(), "' as its weight ", weight, " exceeds split threshold ", SPLIT_THRESHOLD);
+ log.info("Splitting '", functionNode.getName(), "' as its weight ", weight, " exceeds split threshold ", SPLIT_THRESHOLD);
functionNode = (FunctionNode)functionNode.accept(this);
if (functionNode.isSplit()) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BooleanType.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/types/BooleanType.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,28 +1,3 @@
-/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LexicalContext.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LexicalContext.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -31,11 +31,13 @@
import jdk.nashorn.internal.runtime.Source;
/**
- * A class that tracks the current lexical context of node visitation as a stack of {@link Block} nodes. Has special
- * methods to retrieve useful subsets of the context.
+ * A class that tracks the current lexical context of node visitation as a stack
+ * of {@link Block} nodes. Has special methods to retrieve useful subsets of the
+ * context.
*
- * This is implemented with a primitive array and a stack pointer, because it really makes a difference
- * performance wise. None of the collection classes were optimal
+ * This is implemented with a primitive array and a stack pointer, because it
+ * really makes a difference performance-wise. None of the collection classes
+ * were optimal.
*/
public class LexicalContext {
private LexicalContextNode[] stack;
@@ -79,6 +81,7 @@
* {@link Block#NEEDS_SCOPE} because it atomically also sets the
* {@link FunctionNode#HAS_SCOPE_BLOCK} flag on the block's containing
* function.
+ *
* @param block the block that needs to be marked as creating a scope.
*/
public void setBlockNeedsScope(final Block block) {
@@ -97,8 +100,10 @@
}
/**
- * Get the flags for a lexical context node on the stack
+ * Get the flags for a lexical context node on the stack.
+ *
* @param node node
+ *
* @return the flags for the node
*/
public int getFlags(final LexicalContextNode node) {
@@ -112,8 +117,10 @@
/**
* Get the function body of a function node on the lexical context
- * stack. This will trigger an assertion if node isn't present
+ * stack. This will trigger an assertion if node isn't present.
+ *
* @param functionNode function node
+ *
* @return body of function node
*/
public Block getFunctionBody(final FunctionNode functionNode) {
@@ -126,15 +133,16 @@
}
/**
- * Return all nodes in the LexicalContext
- * @return all nodes
+ * @return all nodes in the LexicalContext.
*/
public Iterator<LexicalContextNode> getAllNodes() {
return new NodeIterator<>(LexicalContextNode.class);
}
/**
- * Returns the outermost function in this context. It is either the program, or a lazily compiled function.
+ * Returns the outermost function in this context. It is either the program,
+ * or a lazily compiled function.
+ *
* @return the outermost function in this context.
*/
public FunctionNode getOutermostFunction() {
@@ -142,8 +150,12 @@
}
/**
- * Pushes a new block on top of the context, making it the innermost open block.
+ * Pushes a new block on top of the context, making it the innermost open
+ * block.
+ *
+ * @param <T> the type of the new node
* @param node the new node
+ *
* @return the node that was pushed
*/
public <T extends LexicalContextNode> T push(final T node) {
@@ -168,25 +180,28 @@
/**
* Is the context empty?
- * @return true if empty
+ *
+ * @return {@code true} if empty
*/
public boolean isEmpty() {
return sp == 0;
}
/**
- * The depth of the lexical context
- * @return depth
+ * @return the depth of the lexical context.
*/
public int size() {
return sp;
}
/**
- * Pops the innermost block off the context and all nodes that has been contributed
- * since it was put there
+ * Pops the innermost block off the context and all nodes that has been
+ * contributed since it was put there.
*
- * @param node the node expected to be popped, used to detect unbalanced pushes/pops
+ * @param <T> the type of the node to be popped
+ * @param node the node expected to be popped, used to detect unbalanced
+ * pushes/pops
+ *
* @return the node that was popped
*/
@SuppressWarnings("unchecked")
@@ -202,11 +217,17 @@
}
/**
- * Explicitly apply flags to the topmost element on the stack. This is only valid to use from a
- * {@code NodeVisitor.leaveXxx()} method and only on the node being exited at the time. It is not mandatory to use,
- * as {@link #pop(Node)} will apply the flags automatically, but this method can be used to apply them
- * during the {@code leaveXxx()} method in case its logic depends on the value of the flags.
- * @param node the node to apply the flags to. Must be the topmost node on the stack.
+ * Explicitly apply flags to the topmost element on the stack. This is only
+ * valid to use from a {@code NodeVisitor.leaveXxx()} method and only on the
+ * node being exited at the time. It is not mandatory to use, as
+ * {@link #pop(Node)} will apply the flags automatically, but this method
+ * can be used to apply them during the {@code leaveXxx()} method in case
+ * its logic depends on the value of the flags.
+ *
+ * @param <T> the type of the node to apply the flags to.
+ * @param node the node to apply the flags to. Must be the topmost node on
+ * the stack.
+ *
* @return the passed in node, or a modified node (if any flags were modified)
*/
public <T extends LexicalContextNode & Flags<T>> T applyTopFlags(final T node) {
@@ -215,7 +236,8 @@
}
/**
- * Return the top element in the context
+ * Return the top element in the context.
+ *
* @return the node that was pushed last
*/
public LexicalContextNode peek() {
@@ -223,9 +245,11 @@
}
/**
- * Check if a node is in the lexical context
+ * Check if a node is in the lexical context.
+ *
* @param node node to check for
- * @return true if in the context
+ *
+ * @return {@code true} if in the context
*/
public boolean contains(final LexicalContextNode node) {
for (int i = 0; i < sp; i++) {
@@ -242,6 +266,7 @@
*
* @param oldNode old node
* @param newNode new node
+ *
* @return the new node
*/
public LexicalContextNode replace(final LexicalContextNode oldNode, final LexicalContextNode newNode) {
@@ -256,7 +281,9 @@
}
/**
- * Returns an iterator over all blocks in the context, with the top block (innermost lexical context) first.
+ * Returns an iterator over all blocks in the context, with the top block
+ * (innermost lexical context) first.
+ *
* @return an iterator over all blocks in the context.
*/
public Iterator<Block> getBlocks() {
@@ -264,7 +291,9 @@
}
/**
- * Returns an iterator over all functions in the context, with the top (innermost open) function first.
+ * Returns an iterator over all functions in the context, with the top
+ * (innermost open) function first.
+ *
* @return an iterator over all functions in the context.
*/
public Iterator<FunctionNode> getFunctions() {
@@ -273,6 +302,7 @@
/**
* Get the parent block for the current lexical context block
+ *
* @return parent block
*/
public Block getParentBlock() {
@@ -283,7 +313,9 @@
/**
* Gets the label node of the current block.
- * @return the label node of the current block, if it is labeled. Otherwise returns null.
+ *
+ * @return the label node of the current block, if it is labeled. Otherwise
+ * returns {@code null}.
*/
public LabelNode getCurrentBlockLabelNode() {
assert stack[sp - 1] instanceof Block;
@@ -294,21 +326,12 @@
return parent instanceof LabelNode ? (LabelNode)parent : null;
}
-
- /*
- public FunctionNode getProgram() {
- final Iterator<FunctionNode> iter = getFunctions();
- FunctionNode last = null;
- while (iter.hasNext()) {
- last = iter.next();
- }
- assert last != null;
- return last;
- }*/
-
/**
- * Returns an iterator over all ancestors block of the given block, with its parent block first.
+ * Returns an iterator over all ancestors block of the given block, with its
+ * parent block first.
+ *
* @param block the block whose ancestors are returned
+ *
* @return an iterator over all ancestors block of the given block.
*/
public Iterator<Block> getAncestorBlocks(final Block block) {
@@ -323,8 +346,11 @@
}
/**
- * Returns an iterator over a block and all its ancestors blocks, with the block first.
+ * Returns an iterator over a block and all its ancestors blocks, with the
+ * block first.
+ *
* @param block the block that is the starting point of the iteration.
+ *
* @return an iterator over a block and all its ancestors.
*/
public Iterator<Block> getBlocks(final Block block) {
@@ -352,7 +378,9 @@
/**
* Get the function for this block.
+ *
* @param block block for which to get function
+ *
* @return function for block
*/
public FunctionNode getFunction(final Block block) {
@@ -373,7 +401,6 @@
}
/**
- * Returns the innermost block in the context.
* @return the innermost block in the context.
*/
public Block getCurrentBlock() {
@@ -381,7 +408,6 @@
}
/**
- * Returns the innermost function in the context.
* @return the innermost function in the context.
*/
public FunctionNode getCurrentFunction() {
@@ -394,9 +420,12 @@
}
/**
- * Get the block in which a symbol is defined
+ * Get the block in which a symbol is defined.
+ *
* @param symbol symbol
- * @return block in which the symbol is defined, assert if no such block in context
+ *
+ * @return block in which the symbol is defined, assert if no such block in
+ * context.
*/
public Block getDefiningBlock(final Symbol symbol) {
final String name = symbol.getName();
@@ -410,9 +439,12 @@
}
/**
- * Get the function in which a symbol is defined
+ * Get the function in which a symbol is defined.
+ *
* @param symbol symbol
- * @return function node in which this symbol is defined, assert if no such symbol exists in context
+ *
+ * @return function node in which this symbol is defined, assert if no such
+ * symbol exists in context.
*/
public FunctionNode getDefiningFunction(final Symbol symbol) {
final String name = symbol.getName();
@@ -433,7 +465,8 @@
/**
* Is the topmost lexical context element a function body?
- * @return true if function body
+ *
+ * @return {@code true} if function body.
*/
public boolean isFunctionBody() {
return getParentBlock() == null;
@@ -441,16 +474,20 @@
/**
* Is the topmost lexical context element body of a SplitNode?
- * @return true if it's the body of a split node.
+ *
+ * @return {@code true} if it's the body of a split node.
*/
public boolean isSplitBody() {
return sp >= 2 && stack[sp - 1] instanceof Block && stack[sp - 2] instanceof SplitNode;
}
/**
- * Get the parent function for a function in the lexical context
+ * Get the parent function for a function in the lexical context.
+ *
* @param functionNode function for which to get parent
- * @return parent function of functionNode or null if none (e.g. if functionNode is the program)
+ *
+ * @return parent function of functionNode or {@code null} if none (e.g., if
+ * functionNode is the program).
*/
public FunctionNode getParentFunction(final FunctionNode functionNode) {
final Iterator<FunctionNode> iter = new NodeIterator<>(FunctionNode.class);
@@ -465,12 +502,16 @@
}
/**
- * Count the number of scopes until a given node. Note that this method is solely used to figure out the number of
- * scopes that need to be explicitly popped in order to perform a break or continue jump within the current bytecode
- * method. For this reason, the method returns 0 if it encounters a {@code SplitNode} between the current location
- * and the break/continue target.
- * @param until node to stop counting at. Must be within the current function
- * @return number of with scopes encountered in the context
+ * Count the number of scopes until a given node. Note that this method is
+ * solely used to figure out the number of scopes that need to be explicitly
+ * popped in order to perform a break or continue jump within the current
+ * bytecode method. For this reason, the method returns 0 if it encounters a
+ * {@code SplitNode} between the current location and the break/continue
+ * target.
+ *
+ * @param until node to stop counting at. Must be within the current function.
+ *
+ * @return number of with scopes encountered in the context.
*/
public int getScopeNestingLevelTo(final LexicalContextNode until) {
assert until != null;
@@ -500,16 +541,17 @@
}
/**
- * Check whether the lexical context is currently inside a loop
- * @return true if inside a loop
+ * Check whether the lexical context is currently inside a loop.
+ *
+ * @return {@code true} if inside a loop
*/
public boolean inLoop() {
return getCurrentLoop() != null;
}
/**
- * Returns the loop header of the current loop, or null if not inside a loop
- * @return loop header
+ * @return the loop header of the current loop, or {@code null} if not
+ * inside a loop.
*/
public LoopNode getCurrentLoop() {
final Iterator<LoopNode> iter = new NodeIterator<>(LoopNode.class, getCurrentFunction());
@@ -518,9 +560,12 @@
/**
* Find the breakable node corresponding to this label.
- * @param labelName name of the label to search for. If null, the closest breakable node will be returned
- * unconditionally, e.g. a while loop with no label
- * @return closest breakable node
+ *
+ * @param labelName name of the label to search for. If {@code null}, the
+ * closest breakable node will be returned unconditionally, e.g., a
+ * while loop with no label.
+ *
+ * @return closest breakable node.
*/
public BreakableNode getBreakable(final String labelName) {
if (labelName != null) {
@@ -544,9 +589,12 @@
/**
* Find the continue target node corresponding to this label.
- * @param labelName label name to search for. If null the closest loop node will be returned unconditionally, e.g. a
- * while loop with no label
- * @return closest continue target node
+ *
+ * @param labelName label name to search for. If {@code null} the closest
+ * loop node will be returned unconditionally, e.g., a while loop
+ * with no label.
+ *
+ * @return closest continue target node.
*/
public LoopNode getContinueTo(final String labelName) {
if (labelName != null) {
@@ -566,8 +614,10 @@
/**
* Find the inlined finally block node corresponding to this label.
- * @param labelName label name to search for. Must not be null.
- * @return closest inlined finally block with the given label
+ *
+ * @param labelName label name to search for. Must not be {@code null}.
+ *
+ * @return closest inlined finally block with the given label.
*/
public Block getInlinedFinally(final String labelName) {
for (final NodeIterator<TryNode> iter = new NodeIterator<>(TryNode.class); iter.hasNext(); ) {
@@ -581,7 +631,9 @@
/**
* Find the try node for an inlined finally block corresponding to this label.
- * @param labelName label name to search for. Must not be null.
+ *
+ * @param labelName label name to search for. Must not be {@code null}.
+ *
* @return the try node to which the labelled inlined finally block belongs.
*/
public TryNode getTryNodeForInlinedFinally(final String labelName) {
@@ -595,9 +647,11 @@
}
/**
- * Check the lexical context for a given label node by name
- * @param name name of the label
- * @return LabelNode if found, null otherwise
+ * Check the lexical context for a given label node by name.
+ *
+ * @param name name of the label.
+ *
+ * @return LabelNode if found, {@code null} otherwise.
*/
private LabelNode findLabel(final String name) {
for (final Iterator<LabelNode> iter = new NodeIterator<>(LabelNode.class, getCurrentFunction()); iter.hasNext(); ) {
@@ -610,10 +664,13 @@
}
/**
- * Checks whether a given target is a jump destination that lies outside a given split node
- * @param splitNode the split node
- * @param target the target node
- * @return true if target resides outside the split node
+ * Checks whether a given target is a jump destination that lies outside a
+ * given split node.
+ *
+ * @param splitNode the split node.
+ * @param target the target node.
+ *
+ * @return {@code true} if target resides outside the split node.
*/
public boolean isExternalTarget(final SplitNode splitNode, final BreakableNode target) {
for (int i = sp; i-- > 0;) {
@@ -634,8 +691,10 @@
}
/**
- * Checks whether the current context is inside a switch statement without explicit blocks (curly braces).
- * @return true if in unprotected switch statement
+ * Checks whether the current context is inside a switch statement without
+ * explicit blocks (curly braces).
+ *
+ * @return {@code true} if in unprotected switch statement.
*/
public boolean inUnprotectedSwitchContext() {
for (int i = sp; i > 0; i--) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Thu Jun 25 07:13:27 2015 +0000
@@ -87,7 +87,7 @@
* Representation of global scope.
*/
@ScriptClass("Global")
-public final class Global extends ScriptObject implements Scope {
+public final class Global extends Scope {
// Placeholder value used in place of a location property (__FILE__, __DIR__, __LINE__)
private static final Object LOCATION_PROPERTY_PLACEHOLDER = new Object();
private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
@@ -906,9 +906,6 @@
*/
private ScriptFunction typeErrorThrower;
- // Flag to indicate that a split method issued a return statement
- private int splitState = -1;
-
// Used to store the last RegExp result to support deprecated RegExp constructor properties
private RegExpResult lastRegExpResult;
@@ -995,7 +992,6 @@
public Global(final Context context) {
super(checkAndGetMap(context));
this.context = context;
- this.setIsScope();
this.lexicalScope = context.getEnv()._es6 ? new LexicalScope(this) : null;
}
@@ -1005,9 +1001,7 @@
* @return the global singleton
*/
public static Global instance() {
- final Global global = Context.getGlobal();
- Objects.requireNonNull(global);
- return global;
+ return Objects.requireNonNull(Context.getGlobal());
}
private static Global instanceFrom(final Object self) {
@@ -1453,7 +1447,7 @@
* @return the result of eval
*/
public static Object eval(final Object self, final Object str) {
- return directEval(self, str, UNDEFINED, UNDEFINED, false);
+ return directEval(self, str, Global.instanceFrom(self), UNDEFINED, false);
}
/**
@@ -1463,7 +1457,7 @@
* @param str Evaluated code
* @param callThis "this" to be passed to the evaluated code
* @param location location of the eval call
- * @param strict is eval called a strict mode code?
+ * @param strict is eval called from a strict mode code?
*
* @return the return value of the eval
*
@@ -1504,26 +1498,53 @@
}
/**
- * Global load implementation - Nashorn extension
+ * Global load implementation - Nashorn extension.
*
- * @param self scope
- * @param source source to load
+ * <p>
+ * load builtin loads the given script. Script source can be a URL or a File
+ * or a script object with name and script properties. Evaluated code gets
+ * global object "this" and uses global object as scope for evaluation.
+ * </p>
+ * <p>
+ * If self is undefined or null or global, then global object is used
+ * as scope as well as "this" for the evaluated code. If self is any other
+ * object, then it is indirect load call. With indirect load call, the
+ * properties of scope are available to evaluated script as variables. Also,
+ * global scope properties are accessible. Any var, function definition in
+ * evaluated script goes into an object that is not accessible to user scripts.
+ * </p>
+ * Thus the indirect load call is equivalent to the following:
+ * <pre>
+ * <code>
+ * (function (scope, source) {
+ * with(scope) {
+ * eval(<script_from_source>);
+ * }
+ * })(self, source);
+ * </code>
+ * </pre>
*
- * @return result of load (undefined)
+ * @param self scope to use for the script evaluation
+ * @param source script source
+ *
+ * @return result of load (may be undefined)
*
* @throws IOException if source could not be read
*/
public static Object load(final Object self, final Object source) throws IOException {
final Global global = Global.instanceFrom(self);
- final ScriptObject scope = self instanceof ScriptObject ? (ScriptObject)self : global;
- return global.getContext().load(scope, source);
+ return global.getContext().load(self, source);
}
/**
- * Global loadWithNewGlobal implementation - Nashorn extension
+ * Global loadWithNewGlobal implementation - Nashorn extension.
*
- * @param self scope
- * @param args from plus (optional) arguments to be passed to the loaded script
+ * loadWithNewGlobal builtin loads the given script from a URL or a File
+ * or a script object with name and script properties. Evaluated code gets
+ * new global object "this" and uses that new global object as scope for evaluation.
+ *
+ * @param self self This value is ignored by this function
+ * @param args optional arguments to be passed to the loaded script
*
* @return result of load (may be undefined)
*
@@ -2330,26 +2351,6 @@
}
/**
- * Get the current split state.
- *
- * @return current split state
- */
- @Override
- public int getSplitState() {
- return splitState;
- }
-
- /**
- * Set the current split state.
- *
- * @param state current split state
- */
- @Override
- public void setSplitState(final int state) {
- splitState = state;
- }
-
- /**
* Return the ES6 global scope for lexically declared bindings.
* @return the ES6 lexical global scope.
*/
@@ -2712,6 +2713,14 @@
// Retrieve current state of ENV variables.
final ScriptObject env = newObject();
env.putAll(System.getenv(), scriptEnv._strict);
+
+ // Some platforms, e.g., Windows, do not define the PWD environment
+ // variable, so that the $ENV.PWD property needs to be explicitly
+ // set.
+ if (!env.containsKey(ScriptingFunctions.PWD_NAME)) {
+ env.put(ScriptingFunctions.PWD_NAME, System.getProperty("user.dir"), scriptEnv._strict);
+ }
+
addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, env);
} else {
addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDebug.java Thu Jun 25 07:13:27 2015 +0000
@@ -37,6 +37,7 @@
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.PropertyListeners;
import jdk.nashorn.internal.runtime.PropertyMap;
+import jdk.nashorn.internal.runtime.Scope;
import jdk.nashorn.internal.runtime.ScriptFunction;
import jdk.nashorn.internal.runtime.ScriptObject;
import jdk.nashorn.internal.runtime.ScriptRuntime;
@@ -245,7 +246,7 @@
final PrintWriter out = Context.getCurrentErr();
out.println("ScriptObject count " + ScriptObject.getCount());
- out.println("Scope count " + ScriptObject.getScopeCount());
+ out.println("Scope count " + Scope.getCount());
out.println("ScriptObject listeners added " + PropertyListeners.getListenersAdded());
out.println("ScriptObject listeners removed " + PropertyListeners.getListenersRemoved());
out.println("ScriptFunction constructor calls " + ScriptFunction.getConstructorCount());
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFunction.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFunction.java Thu Jun 25 07:13:27 2015 +0000
@@ -279,8 +279,8 @@
sb.append("})");
final Global global = Global.instance();
-
- return (ScriptFunction)Global.directEval(global, sb.toString(), global, "<function>", global.isStrictContext());
+ final Context context = global.getContext();
+ return (ScriptFunction)context.eval(global, sb.toString(), global, "<function>");
}
private static void checkFunctionParameters(final String params) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Constructor.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Constructor.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -37,13 +37,15 @@
@Target(ElementType.METHOD)
public @interface Constructor {
/**
- * Name of the constructor function. If empty, the name is inferred.
+ * @return the name of the constructor function. If empty, the name is
+ * inferred.
*/
public String name() default "";
/**
- * The arity of the function. By default computed from the method signature.
- * Note that -1 means varargs. So, -2 is used as invalid arity.
+ * @return the arity of the function. By default computed from the method
+ * signature. Note that -1 means varargs. So, -2 is used as invalid
+ * arity.
*/
public int arity() default -2;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Function.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Function.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -41,22 +41,23 @@
@Target(ElementType.METHOD)
public @interface Function {
/**
- * Name of the property. If empty, the name is inferred.
+ * @return the name of the property. If empty, the name is inferred.
*/
public String name() default "";
/**
- * Attribute flags for this function.
+ * @return the attribute flags for this function.
*/
public int attributes() default DEFAULT_ATTRIBUTES;
/**
- * The arity of the function. By default computed from the method signature
+ * @return the arity of the function. By default computed from the method
+ * signature.
*/
public int arity() default -2;
/**
- * where this function lives
+ * @return where this function lives.
*/
public Where where() default Where.PROTOTYPE;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Getter.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Getter.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -39,17 +39,17 @@
@Target(ElementType.METHOD)
public @interface Getter {
/**
- * Name of the property. If empty, the name is inferred.
+ * @return the name of the property. If empty, the name is inferred.
*/
public String name() default "";
/**
- * Attribute flags for this setter.
+ * @return the attribute flags for this setter.
*/
public int attributes() default DEFAULT_ATTRIBUTES;
/**
- * Where this getter lives?
+ * @return where this getter lives.
*/
public Where where() default Where.INSTANCE;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/ScriptClass.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/ScriptClass.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -37,8 +37,8 @@
@Target(ElementType.TYPE)
public @interface ScriptClass {
/**
- * Name of the script class. By default, the name is derived from
- * the Java class name.
+ * @return the name of the script class. By default, the name is derived
+ * from the Java class name.
*/
public String value() default "";
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Setter.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Setter.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -39,17 +39,17 @@
@Target(ElementType.METHOD)
public @interface Setter {
/**
- * Name of the script property. If empty, the name is inferred.
+ * @return the name of the script property. If empty, the name is inferred.
*/
public String name() default "";
/**
- * Attribute flags for this setter.
+ * @return the attribute flags for this setter.
*/
public int attributes() default DEFAULT_ATTRIBUTES;
/**
- * Where this setter lives?
+ * @return where this setter lives.
*/
public Where where() default Where.INSTANCE;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/SpecializedFunction.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/SpecializedFunction.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -33,10 +33,11 @@
import jdk.internal.dynalink.CallSiteDescriptor;
import jdk.internal.dynalink.linker.LinkRequest;
import jdk.nashorn.internal.runtime.ScriptFunction;
+import jdk.nashorn.internal.runtime.UnwarrantedOptimismException;
/**
* The SpecializedFunction annotation is used to flag more type specific
- * functions than the standard one in the native objects
+ * functions than the standard one in the native objects.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@@ -45,23 +46,23 @@
/**
* Functionality for testing if we are allowed to link a specialized
* function the first time we encounter it. Then the guard will handle the
- * rest of the invocations
+ * rest of the invocations.
*
- * This is the same for all callsites in Nashorn, the first time callsite is
+ * This is the same for all callsites in Nashorn; the first time a callsite is
* linked, we have to manually check that the linkage is OK. Even if we add
* a guard and it fails upon the first try, this is not good enough.
- * (Symmetrical to how it works everywhere else in the Nashorn runtime).
+ * (Symmetrical to how it works everywhere else in the Nashorn runtime.)
*
* Here we abstract out a few of the most common link guard checks.
*/
public static abstract class LinkLogic {
/**
- * Empty link logic instance - this is the default
+ * Empty link logic instance - this is the default.
* "no special linking or runtime guard behavior"
*/
public static final LinkLogic EMPTY_INSTANCE = new Empty();
- /** Empty link logic class - allow all linking, no guards */
+ /** Empty link logic class - allow all linking, no guards. */
private static final class Empty extends LinkLogic {
@Override
public boolean canLink(final Object self, final CallSiteDescriptor desc, final LinkRequest request) {
@@ -75,7 +76,8 @@
}
/**
- * Get the class representing the empty link logic
+ * Get the class representing the empty link logic.
+ *
* @return class representing empty link logic
*/
public static Class<? extends LinkLogic> getEmptyLinkLogicClass() {
@@ -83,31 +85,31 @@
}
/**
- * Should this callsite relink when an exception is thrown
+ * Should this callsite relink when an exception is thrown?
*
- * @return the relink exception, or null if none
+ * @return the relink exception, or {@code null} if none
*/
public Class<? extends Throwable> getRelinkException() {
return null;
}
/**
- * Is this link logic class empty - i.e. no special linking logic
- * supplied
+ * Is this link logic class empty - i.e., no special linking logic
+ * supplied?
*
* @param clazz class to check
*
- * @return true if this link logic is empty
+ * @return {@code true} if this link logic is empty
*/
public static boolean isEmpty(final Class<? extends LinkLogic> clazz) {
return clazz == Empty.class;
}
/**
- * Is this link logic instance empty - i.e. no special linking logic
- * supplied
+ * Is this link logic instance empty - i.e., no special linking logic
+ * supplied?
*
- * @return true if this link logic instance is empty
+ * @return {@code true} if this link logic instance is empty
*/
public boolean isEmpty() {
return false;
@@ -121,7 +123,7 @@
* @param desc callsite descriptor
* @param request link request
*
- * @return true if we can link this callsite at this time
+ * @return {@code true} if we can link this callsite at this time
*/
public abstract boolean canLink(final Object self, final CallSiteDescriptor desc, final LinkRequest request);
@@ -131,7 +133,7 @@
*
* @param self receiver
*
- * @return true if a guard is to be woven into the callsite
+ * @return {@code true} if a guard is to be woven into the callsite
*/
public boolean needsGuard(final Object self) {
return true;
@@ -139,13 +141,13 @@
/**
* Given a callsite, and optional arguments, do we need an extra guard
- * for specialization to go through - this guard can be a function of
- * the arguments too
+ * for specialization to go through? This guard can be a function of
+ * the arguments too.
*
* @param self receiver
* @param args arguments
*
- * @return true if a guard is to be woven into the callsite
+ * @return {@code true} if a guard is to be woven into the callsite
*/
public boolean needsGuard(final Object self, final Object... args) {
return true;
@@ -169,9 +171,9 @@
* @param self receiver
* @param desc callsite descriptor
* @param request link request
-
- * @return true if we can link, false otherwise - that means we have to
- * pick a non specialized target
+ *
+ * @return {@code true} if we can link, {@code false} otherwise - that
+ * means we have to pick a non specialized target
*/
public boolean checkLinkable(final Object self, final CallSiteDescriptor desc, final LinkRequest request) {
// check the link guard, if it says we can link, go ahead
@@ -180,11 +182,11 @@
}
/**
- * name override for return value polymorphism, for example we can't have
+ * Name override for return value polymorphism, for example we can't have
* pop(V)I and pop(V)D in the same Java class, so they need to be named,
- * e.g. popInt(V)I and popDouble(V)D for disambiguation, however, their
+ * e.g., popInt(V)I and popDouble(V)D for disambiguation, however, their
* names still need to resolve to "pop" to JavaScript so we can still
- * specialize on return values and so that the linker can find them
+ * specialize on return values and so that the linker can find them.
*
* @return name, "" means no override, use the Java function name, e.g.
* "push"
@@ -199,16 +201,18 @@
Class<?> linkLogic() default LinkLogic.Empty.class;
/**
- * Is this a specialized constructor?
+ * @return whether this is a specialized constructor.
*/
boolean isConstructor() default false;
/**
- * Can this function throw UnwarrantedOptimismExceptions? This works just
- * like the normal functions, but we need the function to be
+ * Can this function throw {@link UnwarrantedOptimismException}s? This works
+ * just like the normal functions, but we need the function to be
* immutable/non-state modifying, as we can't generate continuations for
* native code. Luckily a lot of the methods we want to specialize have this
- * property
+ * property.
+ *
+ * @return whether this function can throw {@link UnwarrantedOptimismException}.
*/
boolean isOptimistic() default false;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/AbstractParser.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/AbstractParser.java Thu Jun 25 07:13:27 2015 +0000
@@ -459,6 +459,19 @@
if (kind == TokenKind.KEYWORD || kind == TokenKind.FUTURE || kind == TokenKind.FUTURESTRICT) {
return true;
}
+
+ // only literals allowed are null, false and true
+ if (kind == TokenKind.LITERAL) {
+ switch (type) {
+ case FALSE:
+ case NULL:
+ case TRUE:
+ return true;
+ default:
+ return false;
+ }
+ }
+
// Fake out identifier.
final long identToken = Token.recast(token, IDENT);
// Get IDENT.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/JSONParser.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/JSONParser.java Thu Jun 25 07:13:27 2015 +0000
@@ -47,7 +47,8 @@
import static jdk.nashorn.internal.parser.TokenType.STRING;
/**
- * Parses JSON text and returns the corresponding IR node. This is derived from the objectLiteral production of the main parser.
+ * Parses JSON text and returns the corresponding IR node. This is derived from
+ * the objectLiteral production of the main parser.
*
* See: 15.12.1.2 The JSON Syntactic Grammar
*/
@@ -70,9 +71,11 @@
private static final int STATE_COMMA_PARSED = 2;
/**
- * Constructor
- * @param source the source
- * @param global the global object
+ * Constructor.
+ *
+ * @param source the source
+ * @param global the global object
+ * @param dualFields whether the parser should regard dual field representation
*/
public JSONParser(final String source, final Global global, final boolean dualFields) {
this.source = source;
@@ -82,8 +85,9 @@
}
/**
- * Implementation of the Quote(value) operation as defined in the ECMA script spec
- * It wraps a String value in double quotes and escapes characters within in
+ * Implementation of the Quote(value) operation as defined in the ECMAscript
+ * spec. It wraps a String value in double quotes and escapes characters
+ * within.
*
* @param value string to quote
*
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Thu Jun 25 07:13:27 2015 +0000
@@ -2668,8 +2668,12 @@
name = getIdent();
verifyStrictIdent(name, "function name");
} else if (isStatement) {
- // Nashorn extension: anonymous function statements
- if (env._no_syntax_extensions) {
+ // Nashorn extension: anonymous function statements.
+ // Do not allow anonymous function statement if extensions
+ // are now allowed. But if we are reparsing then anon function
+ // statement is possible - because it was used as function
+ // expression in surrounding code.
+ if (env._no_syntax_extensions && reparsedFunction == null) {
expect(IDENT);
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/TokenType.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/TokenType.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -222,9 +222,11 @@
/**
* Determines if the token has greater precedence than other.
+ *
* @param other Compare token.
* @param isLeft Is to the left of the other.
- * @return True if greater precedence.
+ *
+ * @return {@code true} if greater precedence.
*/
public boolean needsParens(final TokenType other, final boolean isLeft) {
return other.precedence != 0 &&
@@ -234,16 +236,16 @@
/**
* Determines if the type is a valid operator.
- * @param noIn TRUE if IN operator should be ignored.
- * @return TRUE if valid operator.
+ *
+ * @param noIn {@code true} if IN operator should be ignored.
+ *
+ * @return {@code true} if valid operator.
*/
public boolean isOperator(final boolean noIn) {
return kind == BINARY && (!noIn || this != IN) && precedence != 0;
}
- /**
- * Accessors.
- */
+
public int getLength() {
assert name != null : "Token name not set";
return name.length();
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Thu Jun 25 07:13:27 2015 +0000
@@ -668,12 +668,11 @@
* @param string Evaluated code as a String
* @param callThis "this" to be passed to the evaluated code
* @param location location of the eval call
- * @param strict is this {@code eval} call from a strict mode code?
* @return the return value of the {@code eval}
*/
public Object eval(final ScriptObject initialScope, final String string,
- final Object callThis, final Object location, final boolean strict) {
- return eval(initialScope, string, callThis, location, strict, false);
+ final Object callThis, final Object location) {
+ return eval(initialScope, string, callThis, location, false, false);
}
/**
@@ -692,14 +691,16 @@
final Object callThis, final Object location, final boolean strict, final boolean evalCall) {
final String file = location == UNDEFINED || location == null ? "<eval>" : location.toString();
final Source source = sourceFor(file, string, evalCall);
- final boolean directEval = location != UNDEFINED; // is this direct 'eval' call or indirectly invoked eval?
+ // is this direct 'eval' builtin call?
+ final boolean directEval = evalCall && (location != UNDEFINED);
final Global global = Context.getGlobal();
ScriptObject scope = initialScope;
// ECMA section 10.1.1 point 2 says eval code is strict if it begins
// with "use strict" directive or eval direct call itself is made
// from from strict mode code. We are passed with caller's strict mode.
- boolean strictFlag = directEval && strict;
+ // Nashorn extension: any 'eval' is unconditionally strict when -strict is specified.
+ boolean strictFlag = strict || this._strict;
Class<?> clazz = null;
try {
@@ -723,16 +724,8 @@
// In strict mode, eval does not instantiate variables and functions
// in the caller's environment. A new environment is created!
if (strictFlag) {
- // Create a new scope object
- final ScriptObject strictEvalScope = global.newObject();
-
- // bless it as a "scope"
- strictEvalScope.setIsScope();
-
- // set given scope to be it's proto so that eval can still
- // access caller environment vars in the new environment.
- strictEvalScope.setProto(scope);
- scope = strictEvalScope;
+ // Create a new scope object with given scope as its prototype
+ scope = newScope(scope);
}
final ScriptFunction func = getProgramFunction(clazz, scope);
@@ -740,12 +733,17 @@
if (directEval) {
evalThis = (callThis != UNDEFINED && callThis != null) || strictFlag ? callThis : global;
} else {
- evalThis = global;
+ // either indirect evalCall or non-eval (Function, engine.eval, ScriptObjectMirror.eval..)
+ evalThis = callThis;
}
return ScriptRuntime.apply(func, evalThis);
}
+ private static ScriptObject newScope(final ScriptObject callerScope) {
+ return new Scope(callerScope, PropertyMap.newMap(Scope.class));
+ }
+
private static Source loadInternal(final String srcStr, final String prefix, final String resourcePath) {
if (srcStr.startsWith(prefix)) {
final String resource = resourcePath + srcStr.substring(prefix.length());
@@ -779,7 +777,7 @@
*
* @throws IOException if source cannot be found or loaded
*/
- public Object load(final ScriptObject scope, final Object from) throws IOException {
+ public Object load(final Object scope, final Object from) throws IOException {
final Object src = from instanceof ConsString ? from.toString() : from;
Source source = null;
@@ -831,7 +829,42 @@
}
if (source != null) {
- return evaluateSource(source, scope, scope);
+ if (scope instanceof ScriptObject && ((ScriptObject)scope).isScope()) {
+ final ScriptObject sobj = (ScriptObject)scope;
+ // passed object is a script object
+ // Global is the only user accessible scope ScriptObject
+ assert sobj.isGlobal() : "non-Global scope object!!";
+ return evaluateSource(source, sobj, sobj);
+ } else if (scope == null || scope == UNDEFINED) {
+ // undefined or null scope. Use current global instance.
+ final Global global = getGlobal();
+ return evaluateSource(source, global, global);
+ } else {
+ /*
+ * Arbitrary object passed for scope.
+ * Indirect load that is equivalent to:
+ *
+ * (function(scope, source) {
+ * with (scope) {
+ * eval(<script_from_source>);
+ * }
+ * })(scope, source);
+ */
+ final Global global = getGlobal();
+ // Create a new object. This is where all declarations
+ // (var, function) from the evaluated code go.
+ // make global to be its __proto__ so that global
+ // definitions are accessible to the evaluated code.
+ final ScriptObject evalScope = newScope(global);
+
+ // finally, make a WithObject around user supplied scope object
+ // so that it's properties are accessible as variables.
+ final ScriptObject withObj = ScriptRuntime.openWith(evalScope, scope);
+
+ // evaluate given source with 'withObj' as scope
+ // but use global object as "this".
+ return evaluateSource(source, withObj, global);
+ }
}
throw typeError("cant.load.script", ScriptRuntime.safeToString(from));
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/DebuggerSupport.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/DebuggerSupport.java Thu Jun 25 07:13:27 2015 +0000
@@ -156,7 +156,7 @@
final Context context = global.getContext();
try {
- return context.eval(initialScope, string, callThis, ScriptRuntime.UNDEFINED, false);
+ return context.eval(initialScope, string, callThis, ScriptRuntime.UNDEFINED);
} catch (final Throwable ex) {
return returnException ? ex : null;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FunctionScope.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/FunctionScope.java Thu Jun 25 07:13:27 2015 +0000
@@ -35,17 +35,12 @@
*
* The constructor of this class is responsible for any function prologue
* involving the scope.
- *
- * TODO see NASHORN-715.
*/
-public class FunctionScope extends ScriptObject implements Scope {
+public class FunctionScope extends Scope {
/** Area to store scope arguments. (public for access from scripts.) */
public final ScriptObject arguments;
- /** Flag to indicate that a split method issued a return statement */
- private int splitState = -1;
-
/**
* Constructor
*
@@ -56,7 +51,6 @@
public FunctionScope(final PropertyMap map, final ScriptObject callerScope, final ScriptObject arguments) {
super(callerScope, map);
this.arguments = arguments;
- setIsScope();
}
/**
@@ -68,7 +62,6 @@
public FunctionScope(final PropertyMap map, final ScriptObject callerScope) {
super(callerScope, map);
this.arguments = null;
- setIsScope();
}
/**
@@ -82,23 +75,4 @@
super(map, primitiveSpill, objectSpill);
this.arguments = null;
}
-
-
- /**
- * Get the current split state.
- * @return current split state
- */
- @Override
- public int getSplitState() {
- return splitState;
- }
-
- /**
- * Set the current split state.
- * @param state current split state
- */
- @Override
- public void setSplitState(final int state) {
- splitState = state;
- }
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/PropertyMap.java Thu Jun 25 07:13:27 2015 +0000
@@ -597,6 +597,15 @@
}
/**
+ * Return the name of the class of objects using this property map.
+ *
+ * @return class name of owner objects.
+ */
+ public String getClassName() {
+ return className;
+ }
+
+ /**
* Prevents the map from having additional properties.
*
* @return New map with {@link #NOT_EXTENSIBLE} flag set.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Scope.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -25,30 +25,105 @@
package jdk.nashorn.internal.runtime;
-import static jdk.nashorn.internal.codegen.CompilerConstants.interfaceCallNoLookup;
+import static jdk.nashorn.internal.codegen.CompilerConstants.virtualCallNoLookup;
import jdk.nashorn.internal.codegen.CompilerConstants;
/**
- * Interface implemented by {@link ScriptObject}s that act as scope.
+ * A {@link ScriptObject} subclass for objects that act as scope.
*/
-public interface Scope {
+public class Scope extends ScriptObject {
+
+ /* This is used to store return state of split functions. */
+ private int splitState = -1;
+
+ /** This is updated only in debug mode - counts number of {@code ScriptObject} instances created that are scope */
+ private static int count;
/** Method handle that points to {@link Scope#getSplitState}. */
- public static final CompilerConstants.Call GET_SPLIT_STATE = interfaceCallNoLookup(Scope.class, "getSplitState", int.class);
+ public static final CompilerConstants.Call GET_SPLIT_STATE = virtualCallNoLookup(Scope.class, "getSplitState", int.class);
+ /** Method handle that points to {@link Scope#setSplitState(int)}. */
+ public static final CompilerConstants.Call SET_SPLIT_STATE = virtualCallNoLookup(Scope.class, "setSplitState", void.class, int.class);
+
+ /**
+ * Constructor
+ *
+ * @param map initial property map
+ */
+ public Scope(final PropertyMap map) {
+ super(map);
+ if (Context.DEBUG) {
+ count++;
+ }
+ }
+
+ /**
+ * Constructor
+ *
+ * @param proto parent scope
+ * @param map initial property map
+ */
+ public Scope(final ScriptObject proto, final PropertyMap map) {
+ super(proto, map);
+ if (Context.DEBUG) {
+ count++;
+ }
+ }
- /** Method handle that points to {@link Scope#setSplitState(int)}. */
- public static final CompilerConstants.Call SET_SPLIT_STATE = interfaceCallNoLookup(Scope.class, "setSplitState", void.class, int.class);
+ /**
+ * Constructor
+ *
+ * @param map property map
+ * @param primitiveSpill primitive spill array
+ * @param objectSpill reference spill array
+ */
+ public Scope(final PropertyMap map, final long[] primitiveSpill, final Object[] objectSpill) {
+ super(map, primitiveSpill, objectSpill);
+ if (Context.DEBUG) {
+ count++;
+ }
+ }
+
+ @Override
+ public boolean isScope() {
+ return true;
+ }
+
+ @Override
+ boolean hasWithScope() {
+ for (ScriptObject obj = this; obj != null; obj = obj.getProto()) {
+ if (obj instanceof WithObject) {
+ return true;
+ }
+ }
+ return false;
+ }
/**
* Get the scope's split method state.
- * @return the current state
+ *
+ * @return current split state
*/
- public int getSplitState();
+ public int getSplitState() {
+ return splitState;
+ }
/**
* Set the scope's split method state.
- * @param state the new state.
+ *
+ * @param state current split state
*/
- public void setSplitState(int state);
+ public void setSplitState(final int state) {
+ splitState = state;
+ }
+
+ /**
+ * Get number of {@code Scope} instances created. If not running in debug
+ * mode this is always 0.
+ *
+ * @return number of scope ScriptObjects created
+ */
+ public static int getScopeCount() {
+ return count;
+ }
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptLoader.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptLoader.java Thu Jun 25 07:13:27 2015 +0000
@@ -70,7 +70,6 @@
* @return Installed class.
*/
synchronized Class<?> installClass(final String name, final byte[] data, final CodeSource cs) {
- Objects.requireNonNull(cs);
- return defineClass(name, data, 0, data.length, cs);
+ return defineClass(name, data, 0, data.length, Objects.requireNonNull(cs));
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Thu Jun 25 07:13:27 2015 +0000
@@ -109,20 +109,17 @@
/** Search fall back routine name for "no such property" */
public static final String NO_SUCH_PROPERTY_NAME = "__noSuchProperty__";
- /** Per ScriptObject flag - is this a scope object? */
- public static final int IS_SCOPE = 1 << 0;
-
/** Per ScriptObject flag - is this an array object? */
- public static final int IS_ARRAY = 1 << 1;
+ public static final int IS_ARRAY = 1 << 0;
/** Per ScriptObject flag - is this an arguments object? */
- public static final int IS_ARGUMENTS = 1 << 2;
+ public static final int IS_ARGUMENTS = 1 << 1;
/** Is length property not-writable? */
- public static final int IS_LENGTH_NOT_WRITABLE = 1 << 3;
+ public static final int IS_LENGTH_NOT_WRITABLE = 1 << 2;
/** Is this a builtin object? */
- public static final int IS_BUILTIN = 1 << 4;
+ public static final int IS_BUILTIN = 1 << 3;
/**
* Spill growth rate - by how many elements does {@link ScriptObject#primitiveSpill} and
@@ -396,14 +393,6 @@
}
/**
- * ECMA 8.10.3 IsGenericDescriptor ( Desc )
- * @return true if this has a descriptor describing an {@link AccessorPropertyDescriptor} or {@link DataPropertyDescriptor}
- */
- public final boolean isGenericDescriptor() {
- return isAccessorDescriptor() || isDataDescriptor();
- }
-
- /**
* ECMA 8.10.5 ToPropertyDescriptor ( Obj )
*
* @return property descriptor
@@ -1630,23 +1619,12 @@
return getMap().isFrozen();
}
-
- /**
- * Flag this ScriptObject as scope
- */
- public final void setIsScope() {
- if (Context.DEBUG) {
- scopeCount++;
- }
- flags |= IS_SCOPE;
- }
-
/**
* Check whether this ScriptObject is scope
* @return true if scope
*/
- public final boolean isScope() {
- return (flags & IS_SCOPE) != 0;
+ public boolean isScope() {
+ return false;
}
/**
@@ -1921,14 +1899,7 @@
* Test whether this object contains in its prototype chain or is itself a with-object.
* @return true if a with-object was found
*/
- final boolean hasWithScope() {
- if (isScope()) {
- for (ScriptObject obj = this; obj != null; obj = obj.getProto()) {
- if (obj instanceof WithObject) {
- return true;
- }
- }
- }
+ boolean hasWithScope() {
return false;
}
@@ -2582,7 +2553,7 @@
final int callCount = callType.parameterCount();
final boolean isCalleeVarArg = parameterCount > 0 && methodType.parameterType(parameterCount - 1).isArray();
- final boolean isCallerVarArg = callerVarArg != null ? callerVarArg.booleanValue() : callCount > 0 &&
+ final boolean isCallerVarArg = callerVarArg != null ? callerVarArg : callCount > 0 &&
callType.parameterType(callCount - 1).isArray();
if (isCalleeVarArg) {
@@ -3817,9 +3788,6 @@
/** This is updated only in debug mode - counts number of {@code ScriptObject} instances created */
private static int count;
- /** This is updated only in debug mode - counts number of {@code ScriptObject} instances created that are scope */
- private static int scopeCount;
-
/**
* Get number of {@code ScriptObject} instances created. If not running in debug
* mode this is always 0
@@ -3829,15 +3797,4 @@
public static int getCount() {
return count;
}
-
- /**
- * Get number of scope {@code ScriptObject} instances created. If not running in debug
- * mode this is always 0
- *
- * @return number of scope ScriptObjects created
- */
- public static int getScopeCount() {
- return scopeCount;
- }
-
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptRuntime.java Thu Jun 25 07:13:27 2015 +0000
@@ -373,9 +373,9 @@
* @return prototype object after merge
*/
public static ScriptObject mergeScope(final ScriptObject scope) {
- final ScriptObject global = scope.getProto();
- global.addBoundProperties(scope);
- return global;
+ final ScriptObject parentScope = scope.getProto();
+ parentScope.addBoundProperties(scope);
+ return parentScope;
}
/**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Thu Jun 25 07:13:27 2015 +0000
@@ -39,8 +39,10 @@
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.Map;
+import jdk.nashorn.internal.objects.NativeArray;
/**
* Global functions supported only in scripting mode.
@@ -54,7 +56,7 @@
public static final MethodHandle READFULLY = findOwnMH("readFully", Object.class, Object.class, Object.class);
/** Handle to implementation of {@link ScriptingFunctions#exec} - Nashorn extension */
- public static final MethodHandle EXEC = findOwnMH("exec", Object.class, Object.class, Object.class, Object.class);
+ public static final MethodHandle EXEC = findOwnMH("exec", Object.class, Object.class, Object[].class);
/** EXEC name - special property used by $EXEC API. */
public static final String EXEC_NAME = "$EXEC";
@@ -71,7 +73,8 @@
/** Names of special properties used by $ENV API. */
public static final String ENV_NAME = "$ENV";
- private static final String PWD_NAME = "PWD";
+ /** Name of the environment variable for the current working directory. */
+ public static final String PWD_NAME = "PWD";
private ScriptingFunctions() {
}
@@ -125,19 +128,32 @@
* Nashorn extension: exec a string in a separate process.
*
* @param self self reference
- * @param string string to execute
- * @param input input
+ * @param args string to execute, input and additional arguments, to be appended to {@code string}. Additional arguments can be passed as
+ * either one JavaScript array, whose elements will be converted to strings; or as a sequence of
+ * varargs, each of which will be converted to a string.
*
* @return output string from the request
+ *
* @throws IOException if any stream access fails
* @throws InterruptedException if execution is interrupted
*/
- public static Object exec(final Object self, final Object string, final Object input) throws IOException, InterruptedException {
+ public static Object exec(final Object self, final Object... args) throws IOException, InterruptedException {
// Current global is need to fetch additional inputs and for additional results.
final ScriptObject global = Context.getGlobal();
+ final Object string = args.length > 0? args[0] : UNDEFINED;
+ final Object input = args.length > 1? args[1] : UNDEFINED;
+ final Object[] argv = (args.length > 2)? Arrays.copyOfRange(args, 2, args.length) : ScriptRuntime.EMPTY_ARRAY;
+ // Assemble command line, process additional arguments.
+ final List<String> cmdLine = tokenizeString(JSType.toString(string));
+ final Object[] additionalArgs = argv.length == 1 && argv[0] instanceof NativeArray ?
+ ((NativeArray) argv[0]).asObjectArray() :
+ argv;
+ for (Object arg : additionalArgs) {
+ cmdLine.add(JSType.toString(arg));
+ }
// Set up initial process.
- final ProcessBuilder processBuilder = new ProcessBuilder(tokenizeString(JSType.toString(string)));
+ final ProcessBuilder processBuilder = new ProcessBuilder(cmdLine);
// Current ENV property state.
final Object env = global.get(ENV_NAME);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/WithObject.java Thu Jun 25 07:13:27 2015 +0000
@@ -44,7 +44,7 @@
* This class supports the handling of scope in a with body.
*
*/
-public final class WithObject extends ScriptObject implements Scope {
+public final class WithObject extends Scope {
private static final MethodHandle WITHEXPRESSIONGUARD = findOwnMH("withExpressionGuard", boolean.class, Object.class, PropertyMap.class, SwitchPoint.class);
private static final MethodHandle WITHEXPRESSIONFILTER = findOwnMH("withFilterExpression", Object.class, Object.class);
private static final MethodHandle WITHSCOPEFILTER = findOwnMH("withFilterScope", Object.class, Object.class);
@@ -62,7 +62,6 @@
*/
WithObject(final ScriptObject scope, final ScriptObject expression) {
super(scope, null);
- setIsScope();
this.expression = expression;
}
@@ -224,29 +223,33 @@
@Override
public void setSplitState(final int state) {
- getNonWithParent().setSplitState(state);
+ ((Scope) getNonWithParent()).setSplitState(state);
}
@Override
public int getSplitState() {
- return getNonWithParent().getSplitState();
+ return ((Scope) getNonWithParent()).getSplitState();
+ }
+
+ @Override
+ public void addBoundProperties(final ScriptObject source, final Property[] properties) {
+ // Declared variables in nested eval go to first normal (non-with) parent scope.
+ getNonWithParent().addBoundProperties(source, properties);
}
/**
* Get first parent scope that is not an instance of WithObject.
*/
- private Scope getNonWithParent() {
- ScriptObject proto = getParentScope();
+ private ScriptObject getNonWithParent() {
+ ScriptObject proto = getProto();
while (proto != null && proto instanceof WithObject) {
- proto = ((WithObject)proto).getParentScope();
+ proto = proto.getProto();
}
- assert proto instanceof Scope : "with scope without parent scope";
- return (Scope) proto;
+ return proto;
}
-
private static GuardedInvocation fixReceiverType(final GuardedInvocation link, final MethodHandle filter) {
// The receiver may be an Object or a ScriptObject.
final MethodType invType = link.getInvocation().type();
@@ -380,14 +383,6 @@
return expression;
}
- /**
- * Get the parent scope for this {@code WithObject}
- * @return the parent scope
- */
- public ScriptObject getParentScope() {
- return getProto();
- }
-
private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
return MH.findStatic(MethodHandles.lookup(), WithObject.class, name, MH.type(rtype, types));
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java Thu Jun 25 07:13:27 2015 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 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
@@ -54,23 +54,28 @@
import jdk.nashorn.internal.runtime.ScriptObject;
/**
- * <p>A factory class that generates adapter classes. Adapter classes allow implementation of Java interfaces and
- * extending of Java classes from JavaScript. For every combination of a superclass to extend and interfaces to
- * implement (collectively: "original types"), exactly one adapter class is generated that extends the specified
- * superclass and implements the specified interfaces. (But see the discussion of class-based overrides for exceptions.)
- * </p><p>
- * The adapter class is generated in a new secure class loader that inherits Nashorn's protection domain, and has either
- * one of the original types' class loader or the Nashorn's class loader as its parent - the parent class loader
- * is chosen so that all the original types and the Nashorn core classes are visible from it (as the adapter will have
- * constant pool references to ScriptObject and ScriptFunction classes). In case none of the candidate class loaders has
- * visibility of all the required types, an error is thrown. The class uses {@link JavaAdapterBytecodeGenerator} to
- * generate the adapter class itself; see its documentation for details about the generated class.
- * </p><p>
- * You normally don't use this class directly, but rather either create adapters from script using
- * {@link jdk.nashorn.internal.objects.NativeJava#extend(Object, Object...)}, using the {@code new} operator on abstract classes and interfaces (see
- * {@link jdk.nashorn.internal.objects.NativeJava#type(Object, Object)}), or implicitly when passing script functions to Java methods expecting SAM
- * types.
- * </p>
+ * A factory class that generates adapter classes. Adapter classes allow
+ * implementation of Java interfaces and extending of Java classes from
+ * JavaScript. For every combination of a superclass to extend and interfaces to
+ * implement (collectively: "original types"), exactly one adapter class is
+ * generated that extends the specified superclass and implements the specified
+ * interfaces. (But see the discussion of class-based overrides for exceptions.)
+ * <p>
+ * The adapter class is generated in a new secure class loader that inherits
+ * Nashorn's protection domain, and has either one of the original types' class
+ * loader or the Nashorn's class loader as its parent - the parent class loader
+ * is chosen so that all the original types and the Nashorn core classes are
+ * visible from it (as the adapter will have constant pool references to
+ * ScriptObject and ScriptFunction classes). In case none of the candidate class
+ * loaders has visibility of all the required types, an error is thrown. The
+ * class uses {@link JavaAdapterBytecodeGenerator} to generate the adapter class
+ * itself; see its documentation for details about the generated class.
+ * <p>
+ * You normally don't use this class directly, but rather either create adapters
+ * from script using {@link jdk.nashorn.internal.objects.NativeJava#extend(Object, Object...)},
+ * using the {@code new} operator on abstract classes and interfaces (see
+ * {@link jdk.nashorn.internal.objects.NativeJava#type(Object, Object)}), or
+ * implicitly when passing script functions to Java methods expecting SAM types.
*/
@SuppressWarnings("javadoc")
@@ -93,25 +98,39 @@
};
/**
- * Returns an adapter class for the specified original types. The adapter class extends/implements the original
- * class/interfaces.
- * @param types the original types. The caller must pass at least one Java type representing either a public
- * interface or a non-final public class with at least one public or protected constructor. If more than one type is
- * specified, at most one can be a class and the rest have to be interfaces. The class can be in any position in the
- * array. Invoking the method twice with exactly the same types in the same order will return the same adapter
- * class, any reordering of types or even addition or removal of redundant types (i.e. interfaces that other types
- * in the list already implement/extend, or {@code java.lang.Object} in a list of types consisting purely of
- * interfaces) will result in a different adapter class, even though those adapter classes are functionally
- * identical; we deliberately don't want to incur the additional processing cost of canonicalizing type lists.
- * @param classOverrides a JavaScript object with functions serving as the class-level overrides and
- * implementations. These overrides are defined for all instances of the class, and can be further overridden on a
- * per-instance basis by passing additional objects in the constructor.
- * @param lookup the lookup object identifying the caller class. The generated adapter class will have the
- * protection domain of the caller class iff the lookup object is full-strength, otherwise it will be completely
- * unprivileged.
- * @return an adapter class. See this class' documentation for details on the generated adapter class.
- * @throws ECMAException with a TypeError if the adapter class can not be generated because the original class is
- * final, non-public, or has no public or protected constructors.
+ * Returns an adapter class for the specified original types. The adapter
+ * class extends/implements the original class/interfaces.
+ *
+ * @param types the original types. The caller must pass at least one Java
+ * type representing either a public interface or a non-final public
+ * class with at least one public or protected constructor. If more
+ * than one type is specified, at most one can be a class and the
+ * rest have to be interfaces. The class can be in any position in
+ * the array. Invoking the method twice with exactly the same types
+ * in the same order will return the same adapter class, any
+ * reordering of types or even addition or removal of redundant types
+ * (i.e., interfaces that other types in the list already
+ * implement/extend, or {@code java.lang.Object} in a list of types
+ * consisting purely of interfaces) will result in a different
+ * adapter class, even though those adapter classes are functionally
+ * identical; we deliberately don't want to incur the additional
+ * processing cost of canonicalizing type lists.
+ * @param classOverrides a JavaScript object with functions serving as the
+ * class-level overrides and implementations. These overrides are
+ * defined for all instances of the class, and can be further
+ * overridden on a per-instance basis by passing additional objects
+ * in the constructor.
+ * @param lookup the lookup object identifying the caller class. The
+ * generated adapter class will have the protection domain of the
+ * caller class iff the lookup object is full-strength, otherwise it
+ * will be completely unprivileged.
+ *
+ * @return an adapter class. See this class' documentation for details on
+ * the generated adapter class.
+ *
+ * @throws ECMAException with a TypeError if the adapter class can not be
+ * generated because the original class is final, non-public, or has
+ * no public or protected constructors.
*/
public static StaticClass getAdapterClassFor(final Class<?>[] types, final ScriptObject classOverrides, final MethodHandles.Lookup lookup) {
return getAdapterClassFor(types, classOverrides, getProtectionDomain(lookup));
@@ -148,15 +167,23 @@
}
/**
- * Returns a method handle representing a constructor that takes a single argument of the source type (which,
- * really, should be one of {@link ScriptObject}, {@link ScriptFunction}, or {@link Object}, and returns an instance
- * of the adapter for the target type. Used to implement the function autoconverters as well as the Nashorn's
- * JSR-223 script engine's {@code getInterface()} method.
- * @param sourceType the source type; should be either {@link ScriptObject}, {@link ScriptFunction}, or
- * {@link Object}. In case of {@code Object}, it will return a method handle that dispatches to either the script
- * object or function constructor at invocation based on the actual argument.
+ * Returns a method handle representing a constructor that takes a single
+ * argument of the source type (which, really, should be one of {@link ScriptObject},
+ * {@link ScriptFunction}, or {@link Object}, and returns an instance of the
+ * adapter for the target type. Used to implement the function autoconverters
+ * as well as the Nashorn JSR-223 script engine's {@code getInterface()}
+ * method.
+ *
+ * @param sourceType the source type; should be either {@link ScriptObject},
+ * {@link ScriptFunction}, or {@link Object}. In case of {@code Object},
+ * it will return a method handle that dispatches to either the script
+ * object or function constructor at invocation based on the actual
+ * argument.
* @param targetType the target type, for which adapter instances will be created
+ * @param lookup method handle lookup to use
+ *
* @return the constructor method handle.
+ *
* @throws Exception if anything goes wrong
*/
public static MethodHandle getConstructor(final Class<?> sourceType, final Class<?> targetType, final MethodHandles.Lookup lookup) throws Exception {
@@ -168,13 +195,18 @@
}
/**
- * Returns whether an instance of the specified class/interface can be generated from a ScriptFunction. Returns true
- * iff: the adapter for the class/interface can be created, it is abstract (this includes interfaces), it has at
- * least one abstract method, all the abstract methods share the same name, and it has a public or protected default
- * constructor. Note that invoking this class will most likely result in the adapter class being defined in the JVM
- * if it hasn't been already.
+ * Returns whether an instance of the specified class/interface can be
+ * generated from a ScriptFunction. Returns {@code true} iff: the adapter
+ * for the class/interface can be created, it is abstract (this includes
+ * interfaces), it has at least one abstract method, all the abstract
+ * methods share the same name, and it has a public or protected default
+ * constructor. Note that invoking this class will most likely result in the
+ * adapter class being defined in the JVM if it hasn't been already.
+ *
* @param clazz the inspected class
- * @return true iff an instance of the specified class/interface can be generated from a ScriptFunction.
+ *
+ * @return {@code true} iff an instance of the specified class/interface can
+ * be generated from a ScriptFunction.
*/
static boolean isAutoConvertibleFromFunction(final Class<?> clazz) {
return getAdapterInfo(new Class<?>[] { clazz }).autoConvertibleFromFunction;
@@ -198,7 +230,9 @@
/**
* For a given class, create its adapter class and associated info.
+ *
* @param type the class for which the adapter is created
+ *
* @return the adapter info for the class.
*/
private static AdapterInfo createAdapterInfo(final Class<?>[] types, final ClassAndLoader definingClassAndLoader) {
@@ -311,11 +345,14 @@
}
/**
- * Choose between the passed class loader and the class loader that defines the ScriptObject class, based on which
- * of the two can see the classes in both.
- * @param classAndLoader the loader and a representative class from it that will be used to add the generated
- * adapter to its ADAPTER_INFO_MAPS.
+ * Choose between the passed class loader and the class loader that defines the
+ * ScriptObject class, based on which of the two can see the classes in both.
+ *
+ * @param classAndLoader the loader and a representative class from it that will
+ * be used to add the generated adapter to its ADAPTER_INFO_MAPS.
+ *
* @return the class loader that sees both the specified class and Nashorn classes.
+ *
* @throws IllegalStateException if no such class loader is found.
*/
private static ClassLoader findCommonLoader(final ClassAndLoader classAndLoader) throws AdaptationException {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaSuperAdapter.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaSuperAdapter.java Thu Jun 25 07:13:27 2015 +0000
@@ -36,8 +36,7 @@
private final Object adapter;
JavaSuperAdapter(final Object adapter) {
- Objects.requireNonNull(adapter);
- this.adapter = adapter;
+ this.adapter = Objects.requireNonNull(adapter);
}
public Object getAdapter() {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/options/Options.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/options/Options.java Thu Jun 25 07:13:27 2015 +0000
@@ -136,6 +136,12 @@
return options.toString();
}
+ private static void checkPropertyName(final String name) {
+ if (! Objects.requireNonNull(name).startsWith("nashorn.")) {
+ throw new IllegalArgumentException(name);
+ }
+ }
+
/**
* Convenience function for getting system properties in a safe way
@@ -144,11 +150,7 @@
* @return true if set to true, default value if unset or set to false
*/
public static boolean getBooleanProperty(final String name, final Boolean defValue) {
- Objects.requireNonNull(name);
- if (!name.startsWith("nashorn.")) {
- throw new IllegalArgumentException(name);
- }
-
+ checkPropertyName(name);
return AccessController.doPrivileged(
new PrivilegedAction<Boolean>() {
@Override
@@ -185,11 +187,7 @@
* @return string property if set or default value
*/
public static String getStringProperty(final String name, final String defValue) {
- Objects.requireNonNull(name);
- if (! name.startsWith("nashorn.")) {
- throw new IllegalArgumentException(name);
- }
-
+ checkPropertyName(name);
return AccessController.doPrivileged(
new PrivilegedAction<String>() {
@Override
@@ -212,11 +210,7 @@
* @return integer property if set or default value
*/
public static int getIntProperty(final String name, final int defValue) {
- Objects.requireNonNull(name);
- if (! name.startsWith("nashorn.")) {
- throw new IllegalArgumentException(name);
- }
-
+ checkPropertyName(name);
return AccessController.doPrivileged(
new PrivilegedAction<Integer>() {
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/EncodingHelper.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/EncodingHelper.java Thu Jun 25 07:13:27 2015 +0000
@@ -229,6 +229,11 @@
/**
* @see <a href="http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt">http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt</a>
+ *
+ * @param code code
+ * @param ctype ctype
+ *
+ * @return isCodeCType
*/
public static boolean isCodeCType(final int code, final int ctype) {
int type;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Syntax.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Syntax.java Thu Jun 25 07:13:27 2015 +0000
@@ -57,10 +57,10 @@
}
}
- /**
- * OP
- *
- */
+ //
+ // OP
+ //
+
protected boolean isOp(final int opm) {
return (op & opm) != 0;
}
@@ -189,11 +189,10 @@
return isOp(OP_ESC_X_BRACE_HEX8);
}
+ //
+ // OP2
+ //
- /**
- * OP
- *
- */
protected boolean isOp2(final int opm) {
return (op2 & opm) != 0;
}
@@ -278,10 +277,10 @@
return isOp2(OP2_INEFFECTIVE_ESCAPE);
}
- /**
- * BEHAVIOR
- *
- */
+ //
+ // BEHAVIOR
+ //
+
protected boolean isBehavior(final int bvm) {
return (behavior & bvm) != 0;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/tools/Shell.java Thu Jun 25 07:13:27 2015 +0000
@@ -439,7 +439,7 @@
}
try {
- final Object res = context.eval(global, source, global, "<shell>", env._strict);
+ final Object res = context.eval(global, source, global, "<shell>");
if (res != ScriptRuntime.UNDEFINED) {
err.println(JSType.toString(res));
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8085802.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8085802: Nashorn -nse option causes parse error on anonymous function definition
+ *
+ * @test
+ * @run
+ * @option -nse
+ */
+
+// even with -nse passed, the following should run fine
+// because anonymous function is used as expression here
+
+(function (){})()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8087211.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8087211: Indirect evals should be strict with -strict option
+ *
+ * @test
+ * @run
+ * @option -strict
+ */
+
+var global = this;
+
+try {
+ // indirect eval call.
+ global.eval("x = 34;");
+ throw new Error("should have thrown ReferenceError");
+} catch (e if e instanceof ReferenceError) {
+}
+
+
+function teststrict() {
+ "use strict";
+ // strict caller, indirect eval.
+ global.eval('public = 1;');
+}
+
+try {
+ teststrict();
+ throw new Error("should have thrown SyntaxError");
+} catch (e if e instanceof SyntaxError) {
+}
+
+function testnonstrict() {
+ // non strict caller, indirect eval.
+ global.eval('public = 1;');
+}
+
+try {
+ testnonstrict();
+ throw new Error("should have thrown SyntaxError");
+} catch (e if e instanceof SyntaxError) {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8087211_2.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8087211: Indirect evals should be strict with -strict option
+ * Make sure without -strict option, indirect evals are not strict.
+ *
+ * @test
+ * @run
+ */
+
+var global = this;
+
+// indirect eval call.
+global.eval("x = 34;");
+
+function teststrict() {
+ "use strict";
+ // strict caller, indirect eval.
+ global.eval('public = 1;');
+}
+
+teststrict();
+
+function testnonstrict() {
+ // non strict caller, indirect eval.
+ global.eval('public = 1;');
+}
+
+testnonstrict();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8087312.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8087312: PropertyMapWrapper.equals should compare className
+ *
+ * @test
+ * @run
+ * @fork
+ * @option -Dnashorn.debug=true
+ */
+
+function createObject(type) {
+ // we want to make sure two different object literals with the same keys and types share the same property map.
+ if (type) {
+ return {
+ a: "a",
+ b: 1,
+ c: 0.1
+ }
+ } else {
+ return {
+ a: "x",
+ b: 10,
+ c: 3.4
+ }
+ }
+}
+
+var o1 = createObject(false);
+var o2 = createObject(true);
+Assert.assertTrue(Debug.map(o1) === Debug.map(o2));
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8098546.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8098546: eval within a 'with' leaks definitions into global scope
+ *
+ * @test
+ * @run
+ */
+
+function func() {
+ var obj = { foo: 344 };
+ with (obj) {
+ eval("var x = foo + 3");
+ }
+ Assert.assertTrue(obj.x === undefined);
+ Assert.assertTrue(x === 347);
+}
+
+func();
+
+// x should be undefined here
+Assert.assertTrue(typeof x === "undefined");
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8098578.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8098578: Global scope is not accessible with indirect load call
+ *
+ * @test
+ * @run
+ */
+
+var obj = { foo: 343 };
+var global = this;
+var x = 434;
+
+// indirect load call
+var res = load.call(obj, {
+ name: "t.js",
+ // global is accessible. All declarations go into
+ // intermediate inaccessible scope. "this" is global
+ // User's passed object's properties are accessible
+ // as variables.
+ script: "foo -= 300; var bar = x; Assert.assertTrue(bar == 434); function func() {}; this"
+})
+
+// 'this' for the evaluated code is global
+Assert.assertTrue(res === global);
+
+// properties of passed object are accessible in evaluated code
+Assert.assertTrue(obj.foo == 43);
+
+// vars, functions definined in evaluated code don't go into passed object
+Assert.assertTrue(typeof obj.bar == "undefined");
+Assert.assertTrue(typeof obj.func == "undefined");
+
+// vars, functions definined in evaluated code don't go leak into global
+Assert.assertTrue(typeof bar == "undefined");
+Assert.assertTrue(typeof func == "undefined");
+Assert.assertTrue(typeof foo == "undefined");
+
+var res = load.call(undefined, {
+ name: "t1.js",
+ // still global is accessible and 'this' is global
+ script: "Assert.assertTrue(x == 434); this"
+});
+
+// indirect load with 'undefined' this is same as as direct load
+// or load on global itself.
+Assert.assertTrue(res === global);
+
+// indirect load with 'undefined' this is same as as direct load
+// or load on global itself.
+var res = load.call(null, {
+ name: "t2.js",
+ // still global is accessible and 'this' is global
+ script: "Assert.assertTrue(x == 434); this"
+});
+Assert.assertTrue(res === global);
+
+// indirect load with mirror object
+var mirror = loadWithNewGlobal({
+ name: "t3.js",
+ script: "({ foo: 'hello', x: Math.PI })"
+});
+
+var res = load.call(mirror, {
+ name: "t4.js",
+ script: "Assert.assertTrue(foo == 'hello'); Assert.assertTrue(x == Math.PI); this"
+});
+Assert.assertTrue(res === global);
+
+// indirect load on non-script object, non-mirror results in TypeError
+function tryLoad(obj) {
+ try {
+ load.call(obj, {
+ name: "t5.js", script: "this"
+ });
+ throw new Error("should thrown TypeError for: " + obj);
+ } catch (e if TypeError) {}
+}
+
+tryLoad("hello");
+tryLoad(Math.E);
+tryLoad(true);
+tryLoad(false);
+
+// indirect load of a large script
+load.call({}, __DIR__ + "JDK-8098807-payload.js");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8098807-payload.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8098807: Strict eval throws ClassCastException with large scripts
+ *
+ * @subtest
+ */
+
+function f() {}
+
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
+f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f(); f();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8098807.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8098807: Strict eval throws ClassCastException with large scripts
+ *
+ * @test
+ * @run
+ * @option -scripting
+ */
+
+"use strict";
+
+var path = __DIR__ + "JDK-8098807-payload.js"
+var source = readFully(path);
+eval(source);
--- a/nashorn/test/script/basic/evalreturn.js Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/test/script/basic/evalreturn.js Thu Jun 25 07:13:27 2015 +0000
@@ -59,10 +59,14 @@
print("Scoping OK");
-var f = eval("function cookie() { print('sweet and crunchy!'); } function cake() { print('moist and delicious!'); }");
+// According to the spec, evaluation of function declarations should not return a value,
+// but we return values of anonymous function declarations (Nashorn extension).
+var e = eval("function cookie() { print('sweet and crunchy!'); } function cake() { print('moist and delicious!'); }");
+print(e);
+var f = eval("function cookie() { print('sweet and crunchy!'); } function() { print('moist and delicious!'); }");
print(f);
f();
-var g = eval("function cake() { print('moist and delicious!'); } function cookie() { print('sweet and crunchy!'); }");
+var g = eval("function cake() { print('moist and delicious!'); } function() { print('sweet and crunchy!'); }");
print(g);
g();
--- a/nashorn/test/script/basic/evalreturn.js.EXPECTED Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/test/script/basic/evalreturn.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -5,7 +5,8 @@
undefined
hello
Scoping OK
-function cake() { print('moist and delicious!'); }
+undefined
+function() { print('moist and delicious!'); }
moist and delicious!
-function cookie() { print('sweet and crunchy!'); }
+function() { print('sweet and crunchy!'); }
sweet and crunchy!
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/JDK-8098847.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8098847: obj."prop" and obj.'prop' should result in SyntaxError
+ *
+ * @test/compile-error
+ */
+
+var obj = { "prop": 45 };
+
+obj."prop" = "hello";
+obj.'prop' = "hello";
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/JDK-8098847.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,6 @@
+test/script/error/JDK-8098847.js:32:5 Expected ident but found prop
+obj."prop" = "hello";
+ ^
+test/script/error/JDK-8098847.js:33:5 Expected ident but found prop
+obj.'prop' = "hello";
+ ^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/anon_func_stat_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Anonymous function statement should result in error in -nse
+ *
+ * @option -nse
+ * @test/compile-error
+ */
+
+function() {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/anon_func_stat_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,3 @@
+test/script/error/anon_func_stat_nse.js:31:8 Expected ident but found (
+function() {}
+ ^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/backquote_string_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Backquote string should result in error with -nse even with -scripting
+ *
+ * @option -nse
+ * @option -scripting
+ * @test/compile-error
+ */
+
+`ls -l`;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/backquote_string_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,3 @@
+test/script/error/backquote_string_nse.js:32:0 Expected an operand but found error
+`ls -l`;
+^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/conditional_catch_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * conditional catch should result in error with -nse
+ *
+ * @option -nse
+ * @test/compile-error
+ */
+
+try {
+ func();
+} catch (e if e instanceof ReferenceError) {
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/conditional_catch_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,6 @@
+test/script/error/conditional_catch_nse.js:33:11 Expected ) but found if
+} catch (e if e instanceof ReferenceError) {
+ ^
+test/script/error/conditional_catch_nse.js:34:0 Expected eof but found }
+}
+^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/expr_closure_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Expression closures should result in error with -nse
+ *
+ * @option -nse
+ * @test/compile-error
+ */
+
+function square(x) x*x;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/expr_closure_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,3 @@
+test/script/error/expr_closure_nse.js:31:19 Expected { but found x
+function square(x) x*x;
+ ^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/for_each_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * for..each should result in error with -nse
+ *
+ * @option -nse
+ * @test/compile-error
+ */
+
+for each (var x in [3, 454, 4]) {
+ print(x);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/for_each_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,6 @@
+test/script/error/for_each_nse.js:31:4 Expected ( but found each
+for each (var x in [3, 454, 4]) {
+ ^
+test/script/error/for_each_nse.js:33:0 Expected eof but found }
+}
+^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/hash_comment_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Hash comment should result in error with -nse even with -scripting
+ *
+ * @option -nse
+ * @option -scripting
+ * @test/compile-error
+ */
+
+# this is a comment
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/hash_comment_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,3 @@
+test/script/error/hash_comment_nse.js:32:0 Expected an operand but found error
+# this is a comment
+^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/heredoc_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Heredoc string should result in error with -nse even with -scripting
+ *
+ * @option -nse
+ * @option -scripting
+ * @test/compile-error
+ */
+
+var str = <<EOF
+This is a multiple line string
+inside a heredoc
+EOF;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/heredoc_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,9 @@
+test/script/error/heredoc_nse.js:32:10 Expected an operand but found <<
+var str = <<EOF
+ ^
+test/script/error/heredoc_nse.js:33:5 Expected ; but found is
+This is a multiple line string
+ ^
+test/script/error/heredoc_nse.js:34:7 Expected ; but found a
+inside a heredoc
+ ^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/object_literal_in_new_nse.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * Object literal outside 'new' should result in error in -nse
+ *
+ * @option -nse
+ * @test/compile-error
+ */
+
+var r = new java.lang.Runnable() {
+ run: function() { print("hello"); }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/error/object_literal_in_new_nse.js.EXPECTED Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,9 @@
+test/script/error/object_literal_in_new_nse.js:31:33 Expected ; but found {
+var r = new java.lang.Runnable() {
+ ^
+test/script/error/object_literal_in_new_nse.js:32:15 Expected ident but found (
+ run: function() { print("hello"); }
+ ^
+test/script/error/object_literal_in_new_nse.js:32:36 Expected eof but found }
+ run: function() { print("hello"); }
+ ^
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/JDK-8080087.js Thu Jun 25 07:13:27 2015 +0000
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8080087: Nashorn $ENV.PWD is originally undefined
+ *
+ * This is to ensure that $ENV.PWD is correctly set on Windows as well as on all
+ * other platforms.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+if (typeof($ENV.PWD) === 'undefined') {
+ fail('$ENV.PWD is undefined')
+}
+
--- a/nashorn/test/src/jdk/nashorn/api/scripting/JSONCompatibleTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/test/src/jdk/nashorn/api/scripting/JSONCompatibleTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -97,12 +97,14 @@
assertEquals(x2.get("1"), 5);
}
+ @SuppressWarnings("unchecked")
private static List<Object> asList(final Object obj) {
assertJSObject(obj);
Assert.assertTrue(obj instanceof List);
return (List)obj;
}
+ @SuppressWarnings("unchecked")
private static Map<String, Object> asMap(final Object obj) {
assertJSObject(obj);
Assert.assertTrue(obj instanceof Map);
--- a/nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptObjectMirrorTest.java Wed Jun 24 17:45:44 2015 +0200
+++ b/nashorn/test/src/jdk/nashorn/api/scripting/test/ScriptObjectMirrorTest.java Thu Jun 25 07:13:27 2015 +0000
@@ -204,7 +204,7 @@
}
try {
- final Object obj = e.eval("function func() { print('hello'); }");
+ final Object obj = e.eval("(function func() { print('hello'); })");
assertEquals(obj.toString(), "function func() { print('hello'); }", "toString returns wrong value");
} catch (final Throwable t) {
t.printStackTrace();