--- a/.hgtags-top-repo Thu Jun 11 20:19:18 2015 -0700
+++ b/.hgtags-top-repo Wed Jul 05 20:37:47 2017 +0200
@@ -310,3 +310,4 @@
7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65
dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
+70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68
--- a/hotspot/.hgtags Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/.hgtags Wed Jul 05 20:37:47 2017 +0200
@@ -470,3 +470,4 @@
e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66
d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
+11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68
--- a/hotspot/make/linux/makefiles/dtrace.make Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/make/linux/makefiles/dtrace.make Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/make/test/JtregNative.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/cpu/sparc/vm/sparc.ad Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_32.ad Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/cpu/x86/vm/x86_64.ad Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/aix/vm/os_aix.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/linux/vm/os_linux.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/solaris/vm/os_solaris.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciCallSite.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciCallSite.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciEnv.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciField.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciInstanceKlass.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/ci/ciMethod.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/javaClasses.inline.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/codeCache.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/codeCache.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/dependencies.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/dependencies.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/code/nmethod.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/cms/vmCMSOperations.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/cms/yieldingWorkgroup.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/g1/g1CollectedHeap.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/g1/vm_operations_g1.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psAdaptiveSizePolicy.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psMarkSweep.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psParallelCompact.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/parallel/psScavenge.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/serial/defNewGeneration.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/adaptiveSizePolicy.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/gcCause.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/gcCause.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/genCollectedHeap.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/workgroup.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/gc/shared/workgroup.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/interpreter/bytecode.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/interpreter/linkResolver.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/arraycopynode.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/callnode.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/loopPredicate.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/matcher.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/memnode.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/memnode.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/parse3.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/phaseX.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/superword.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/superword.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/vectornode.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/opto/vectornode.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/jvmtiEnvBase.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/methodHandles.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/prims/methodHandles.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/advancedThresholdPolicy.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/os.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/runtime/reflection.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/services/diagnosticCommand.cpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/src/share/vm/utilities/fakeRttiSupport.hpp Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/compiler/jsr292/CallSiteDepContextTest.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/gc/TestSmallHeap.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/serviceability/dcmd/gc/RunGCTest.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/serviceability/sa/TestClassLoaderStats.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/hotspot/test/serviceability/sa/TestStackTrace.java Wed Jul 05 20:37:47 2017 +0200
@@ -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/jdk/.hgtags Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/.hgtags Wed Jul 05 20:37:47 2017 +0200
@@ -310,3 +310,4 @@
ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66
1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
+046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68
--- a/jdk/make/lib/Lib-java.instrument.gmk Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-java.instrument.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-java.management.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.attach.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.hprof.agent.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.jdi.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.jdwp.agent.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.management.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/lib/Lib-jdk.sctp.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/make/mapfiles/libjava/mapfile-vers Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/io/File.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/Process.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/net/SocketPermission.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/BasicPermission.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/Permissions.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/java/util/PropertyPermission.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/javax/security/auth/Subject.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ /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 Thu Jun 11 20:19:18 2015 -0700
+++ /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 Thu Jun 11 20:19:18 2015 -0700
+++ /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 Thu Jun 11 20:19:18 2015 -0700
+++ /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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/share/native/libjava/ClassLoader.c Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletPanel.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletViewer.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/DelegationPermission.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.security.jgss/share/classes/javax/security/auth/kerberos/ServicePermission.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JdbcRowSetImpl.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/CachedRowSetWriter.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/SyncResolverImpl.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/internal/WebRowSetXmlWriter.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/RowSetMetaDataImpl.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSigner.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/ContentSignerParameters.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/com/sun/jarsigner/package-info.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Main.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/Resources.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jartool/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/HostIdentifier.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/MonitoredVm.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/monitor/VmIdentifier.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/AbstractPerfDataBuffer.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/src/jdk.naming.dns/share/classes/com/sun/jndi/dns/DnsName.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/lang/invoke/8022701/InvokeSeveralWays.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/java/security/PermissionCollection/Concurrent.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/text/resources/LocaleData Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/text/resources/LocaleDataTest.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/tools/jmap/heapconfig/JMapHeapConfigTest.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ /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 Thu Jun 11 20:19:18 2015 -0700
+++ /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 Thu Jun 11 20:19:18 2015 -0700
+++ b/jdk/test/sun/tools/jmap/heapconfig/TmtoolTestScenario.java Wed Jul 05 20:37:47 2017 +0200
@@ -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/make/CompileJavaModules.gmk Thu Jun 11 20:19:18 2015 -0700
+++ b/make/CompileJavaModules.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/make/common/JavaCompilation.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/make/common/NativeCompilation.gmk Wed Jul 05 20:37:47 2017 +0200
@@ -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)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib-test/jdk/test/lib/apps/LingeredAppTest.java Wed Jul 05 20:37:47 2017 +0200
@@ -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 Thu Jun 11 20:19:18 2015 -0700
+++ b/test/lib/Makefile Wed Jul 05 20:37:47 2017 +0200
@@ -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 Wed Jul 05 20:37:47 2017 +0200
@@ -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);
+ }
+}