--- a/.hgtags Fri Jun 12 16:36:31 2015 -0400
+++ b/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -310,3 +310,4 @@
4915246064b2f89d5f00c96e758686b7fdad36a6 jdk9-b65
ff3fc75f3214ad7e03595be1b0d0f38d887b6f0e jdk9-b66
56166ce66037952fa21e9f680b31bf8eb47312c0 jdk9-b67
+5b500c93ce4822d47061cd518ff3f72d9d8cb5b5 jdk9-b68
--- a/.hgtags-top-repo Fri Jun 12 16:36:31 2015 -0400
+++ b/.hgtags-top-repo Fri Jun 12 16:39:25 2015 -0400
@@ -310,3 +310,4 @@
7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65
dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
+70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68
--- a/corba/.hgtags Fri Jun 12 16:36:31 2015 -0400
+++ b/corba/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -310,3 +310,4 @@
afc1e295c4bf83f9a5dd539c29914edd4a754a3f jdk9-b65
44ee68f7dbacab24a45115fd6a8ccdc7eb6e8f0b jdk9-b66
4418697e56f1f43597f55c7cb6573549c6117868 jdk9-b67
+8efad64f40eb8cd4df376c0a5275892eeb396bbd jdk9-b68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/BoundsHelper.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 ());
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/ORBPackage/InvalidNameHelper.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 ());
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BadKindHelper.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -470,3 +470,4 @@
e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66
d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
+11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68
--- a/hotspot/make/linux/makefiles/dtrace.make Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/make/linux/makefiles/dtrace.make Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/make/test/JtregNative.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Fri Jun 12 16:39:25 2015 -0400
@@ -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/x86_32.ad Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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/share/vm/ci/ciCallSite.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/ci/ciCallSite.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/ci/ciCallSite.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/ci/ciField.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/classfile/javaClasses.inline.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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;") \
--- a/hotspot/src/share/vm/code/codeCache.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/code/codeCache.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/code/codeCache.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/code/dependencies.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/code/dependencies.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/code/nmethod.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/parallel/psScavenge.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/shared/gcCause.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/shared/gcCause.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/shared/workgroup.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/gc/shared/workgroup.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/interpreter/bytecode.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/arraycopynode.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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/callnode.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/callnode.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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/graphKit.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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/library_call.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/library_call.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -2631,7 +2631,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:
@@ -5488,7 +5490,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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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);
+ }
}
}
}
--- a/hotspot/src/share/vm/opto/loopopts.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/matcher.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/memnode.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/memnode.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/parse3.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/phaseX.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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/superword.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/superword.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/superword.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/vectornode.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/opto/vectornode.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/prims/jni.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/runtime/os.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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/services/diagnosticCommand.cpp Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/src/share/vm/utilities/fakeRttiSupport.hpp Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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);
+ }
+ }
+}
--- a/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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/types/TestTypePropagationToCmpU.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/test/gc/TestSmallHeap.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/test/serviceability/dcmd/gc/RunGCTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/test/serviceability/sa/TestClassLoaderStats.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/hotspot/test/serviceability/sa/TestStackTrace.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jaxp/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -310,3 +310,4 @@
ae7406e82828fe1c245ac7507a9da5fd5b1c9529 jdk9-b65
d5963ccce28d7a3e96ee3e2dc8a8676e61699b70 jdk9-b66
78c2685daabafae827c686ca2d1bb2e451faed2b jdk9-b67
+82aae947938ec9b0119fdd78a616d0b7263072ee jdk9-b68
--- a/jaxws/.hgtags Fri Jun 12 16:36:31 2015 -0400
+++ b/jaxws/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -313,3 +313,4 @@
45ef73bb85c12ec1b291835c1d40e342a454e3f0 jdk9-b65
1232f4013417e4a9cd291096798d10f2e601d69d jdk9-b66
c9785bc8ade98a16a050d7520b70c68363857e00 jdk9-b67
+b5878b03d1b2e105917d959fbfa3c57c22495803 jdk9-b68
--- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ServiceLoaderUtil.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -310,3 +310,4 @@
ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66
1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
+046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68
--- a/jdk/make/lib/Lib-java.instrument.gmk Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-java.instrument.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-java.management.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-jdk.attach.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-jdk.hprof.agent.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-jdk.jdi.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-jdk.jdwp.agent.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-jdk.management.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/lib/Lib-jdk.sctp.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/make/mapfiles/libjava/mapfile-vers Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/io/File.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/lang/Process.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/invoke/CallSite.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/net/SocketPermission.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/net/SocketPermission.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/security/BasicPermission.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/Permissions.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/security/Permissions.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/UnresolvedPermissionCollection.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/java/util/PropertyPermission.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/javax/security/auth/Subject.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/javax/security/auth/Subject.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/AnnotationParser.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/share/native/libjava/ClassLoader.c Fri Jun 12 16:39:25 2015 -0400
@@ -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/sun/misc/FileURLMapper.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/libnet/Inet4AddressImpl.c Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c Fri Jun 12 16:39:25 2015 -0400
@@ -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/windows/classes/sun/misc/FileURLMapper.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/share/classes/sun/applet/AppletPanel.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletPanel.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletViewer.java Fri Jun 12 16:39:25 2015 -0400
@@ -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.naming/share/classes/com/sun/jndi/ldap/LdapName.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/SyncResolverImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/jdk.jartool/share/classes/com/sun/jarsigner/ContentSigner.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSigner.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSignerParameters.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/package-info.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java Fri Jun 12 16:39:25 2015 -0400
@@ -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.jvmstat/share/classes/sun/jvmstat/monitor/HostIdentifier.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/HostIdentifier.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/MonitoredVm.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/VmIdentifier.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBuffer.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/corba/7130985/CorbaExceptionsCompileTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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/io/FilePermission/FilePermissionCollection.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/Runtime/exec/LotsOfOutput.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/invoke/8022701/InvokeSeveralWays.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/java/lang/invoke/8022701/InvokeSeveralWays.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/LFGarbageCollectedTest.java Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 LFGarbageCollectedTest
* @bug 8046703
+ * @ignore 8078602
* @summary Test verifies that lambda forms are garbage collected
* @author kshefov
* @library /lib/testlibrary/jsr292 /lib/testlibrary
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/net/SocketPermission/SocketPermissionCollection.java Fri Jun 12 16:39:25 2015 -0400
@@ -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");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/BasicPermission/BasicPermissionCollection.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/java/security/PermissionCollection/Concurrent.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/text/Format/DateFormat/LocaleDateFormats.java Fri Jun 12 16:39:25 2015 -0400
@@ -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");
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Arrays/SortingIntBenchmarkTestJMH.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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/javax/net/ssl/DTLS/DTLSBufferOverflowUnderflowTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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");
+ }
+ }
+}
--- a/jdk/test/sun/text/resources/LocaleData Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/sun/text/resources/LocaleData Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/sun/tools/jmap/heapconfig/JMapHeapConfigTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ b/jdk/test/sun/tools/jmap/heapconfig/TmtoolTestScenario.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -310,3 +310,4 @@
4fcf722b811406a7db8f206d88446c82cda1b5f4 jdk9-b65
fd6bda430d96fc5ab421161de016412f2ddd9082 jdk9-b66
fd782cd69b0497299269952d30a6b88cad960fcf jdk9-b67
+c71857c93f57c63be44258d3d67e656c2bacdb45 jdk9-b68
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Jun 12 16:39:25 2015 -0400
@@ -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)) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Operators.java Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Operators.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/BuildState.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CleanProperties.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileJavaPackages.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CompileProperties.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/CopyFile.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/JavacState.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Module.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Package.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Source.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Transformer.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/Util.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/client/ClientMain.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PathAndPackageVerifier.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PooledSjavac.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/PubapiVisitor.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SjavacImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/SmartFileManager.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/comp/dependencies/PublicApiCollector.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/options/Options.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/CompilationResult.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/sjavac/server/ServerMain.java Fri Jun 12 16:39:25 2015 -0400
@@ -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.");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/diamond/pos/NestedDiamondAllocationTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -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<>() {
+ });
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/resolve/BitWiseOperators.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/CompileCircularSources.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/CompileExcludingDependency.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/CompileWithAtFile.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/CompileWithInvisibleSources.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/CompileWithOverrideSources.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IncCompInheritance.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IncCompileChangeNative.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IncCompileDropClasses.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IncCompileFullyQualifiedRef.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IncCompileNoChanges.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IncCompileUpdateNative.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/IncCompileWithChanges.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/JavacOptionPrep.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/PermittedArtifact.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/SJavacTester.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/SjavacBase.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/langtools/test/tools/sjavac/StateDir.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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 Fri Jun 12 16:36:31 2015 -0400
+++ /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/CompileJavaModules.gmk Fri Jun 12 16:36:31 2015 -0400
+++ b/make/CompileJavaModules.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -507,6 +507,10 @@
# space separated list.
JDK_USER_DEFINED_FILTER := $(strip $(subst $(COMMA),$(SPACE), $(JDK_FILTER)))
+# Create an empty directory to set the bootclasspath to.
+EMPTY_BOOTCLASSPATH := $(SUPPORT_OUTPUTDIR)/empty-dir
+$(call MakeDir, $(EMPTY_BOOTCLASSPATH))
+
# This macro sets up compilation of a module and declares dependencies for it.
# Param 1 - module name
define SetupModuleCompilation
@@ -525,7 +529,7 @@
$1_CLASSPATH := $$($1_CLASSPATH) $$(addprefix $(JDK_OUTPUTDIR)/modules/,jdk.hotspot.agent)
endif
$1_CLASSPATH := $$(subst $$(SPACE),$$(PATH_SEP),$$($1_CLASSPATH))
- $1_JAVAC_FLAGS := -bootclasspath "$$($1_CLASSPATH)" $$($1_ADD_JAVAC_FLAGS)
+ $1_JAVAC_FLAGS := -bootclasspath $(EMPTY_BOOTCLASSPATH) -classpath "$$($1_CLASSPATH)" $$($1_ADD_JAVAC_FLAGS)
$$(eval $$(call SetupJavaCompilation,$1, \
SETUP := $$(if $$($1_SETUP), $$($1_SETUP), GENERATE_JDKBYTECODE), \
--- a/make/common/JavaCompilation.gmk Fri Jun 12 16:36:31 2015 -0400
+++ b/make/common/JavaCompilation.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -561,10 +561,6 @@
$$($1_BIN)/_the.$1_batch: $$($1_SRCS) $$($1_DEPENDS) $$($1_VARDEPS_FILE)
$(MKDIR) -p $$(@D) $$(dir $$($1_SJAVAC_PORTFILE))
- # As a workaround for sjavac not tracking api changed from the classpath, force full
- # recompile if an external dependency, which is something other than a source
- # change, triggered this compilation.
- $$(if $$(filter-out $$($1_SRCS), $$?), $(FIND) $$(@D) -name "*.class" $(FIND_DELETE))
$$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.$1_batch.tmp)
$(ECHO) Compiling $1
($$($1_JVM) $$($1_SJAVAC) \
--- a/make/common/NativeCompilation.gmk Fri Jun 12 16:36:31 2015 -0400
+++ b/make/common/NativeCompilation.gmk Fri Jun 12 16:39:25 2015 -0400
@@ -449,6 +449,16 @@
$1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
endif
+ # If no C++ flags are explicitly set, default to using the C flags.
+ # After that, we can set additional C++ flags that should not interfere
+ # with the mechanism for copying the C flags by default.
+ ifeq ($$($1_CXXFLAGS),)
+ $1_CXXFLAGS:=$$($1_CFLAGS)
+ endif
+ ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
+ $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
+ endif
+
ifeq ($$($1_DEBUG_SYMBOLS), true)
ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
ifdef OPENJDK
@@ -466,16 +476,6 @@
endif
endif
- # If no C++ flags are explicitly set, default to using the C flags.
- # After that, we can set additional C++ flags that should not interfere
- # with the mechanism for copying the C flags by default.
- ifeq ($$($1_CXXFLAGS),)
- $1_CXXFLAGS:=$$($1_CFLAGS)
- endif
- ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
- $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
- endif
-
ifneq (,$$($1_REORDER))
$1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
$1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER)
--- a/nashorn/.hgtags Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/.hgtags Fri Jun 12 16:39:25 2015 -0400
@@ -301,3 +301,4 @@
2054d01ae32649d3179e93d14108fdd6259c1c0d jdk9-b65
9dd95cff9dae897e8dee712f1f0303c460262288 jdk9-b66
f822b749821e364cae0b7bd7c8f667d9437e6d83 jdk9-b67
+dd6dd848b854dbd3f3cc422668276b1ae0834179 jdk9-b68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/autoimports.js Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -0,0 +1,67 @@
+/*
+ * 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);
+ }
+ }
+}
+
+undefined;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/samples/secondssince.js Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/DynamicLinker.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/NashornScriptEngineFactory.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptObjectMirror.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/URLReader.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/ClassEmitter.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/CompileUnit.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/ir/LexicalContext.java Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/LexicalContext.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java Fri Jun 12 16:39:25 2015 -0400
@@ -1005,9 +1005,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) {
@@ -2712,6 +2710,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/annotations/Constructor.java Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Constructor.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Function.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Getter.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/ScriptClass.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/Setter.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/annotations/SpecializedFunction.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/JSONParser.java Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/JSONParser.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/TokenType.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/ScriptLoader.java Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptLoader.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptObject.java Fri Jun 12 16:39:25 2015 -0400
@@ -2582,7 +2582,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) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptingFunctions.java Fri Jun 12 16:39:25 2015 -0400
@@ -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/linker/JavaAdapterFactory.java Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaAdapterFactory.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/JavaSuperAdapter.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/options/Options.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/EncodingHelper.java Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:36:31 2015 -0400
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Syntax.java Fri Jun 12 16:39:25 2015 -0400
@@ -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;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8085802.js Fri Jun 12 16:39:25 2015 -0400
@@ -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/error/anon_func_stat_nse.js Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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 Fri Jun 12 16:39:25 2015 -0400
@@ -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')
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib-test/jdk/test/lib/apps/LingeredAppTest.java Fri Jun 12 16:39:25 2015 -0400
@@ -0,0 +1,72 @@
+/*
+ * 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
+ */
+
+package jdk.test.lib.apps;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+public class LingeredAppTest {
+
+ public static void main(String[] args) {
+ try {
+ System.out.println("Starting LingeredApp with default parameters");
+
+ ArrayList<String> cmd = new ArrayList<String>();
+
+ // 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/test/lib/Makefile Fri Jun 12 16:36:31 2015 -0400
+++ b/test/lib/Makefile Fri Jun 12 16:39:25 2015 -0400
@@ -42,7 +42,8 @@
JAR = $(JDK_HOME)/bin/jar
WB_SRC_FILES = $(shell find $(SRC_DIR)/sun/hotspot -name '*.java')
-SHARE_SRC_FILES = $(shell find $(SRC_DIR)/share/classes -name '*.java')
+# test-lib.jar will contain only hprof classes until JDK-8081381 is resolved
+SHARE_SRC_FILES = $(shell find $(SRC_DIR)/share/classes/jdk/test/lib/hprof -name '*.java')
.PHONY: wb.filelist share.filelist clean cleantmp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/share/classes/jdk/test/lib/apps/LingeredApp.java Fri Jun 12 16:39:25 2015 -0400
@@ -0,0 +1,434 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.test.lib.apps;
+
+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<String>();
+ }
+
+ /**
+ *
+ * @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
+ */
+ public 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<String>();
+ 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);
+ }
+}