--- a/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -306,3 +306,4 @@
ac3f5a39d4ff14d70c365e12cf5ec8f2abd52a04 jdk9-b61
e7dbbef69d12b6a74dfad331b7188e7f893e8d29 jdk9-b62
989253a902c34dcb7564695161c9200a5fbb7412 jdk9-b63
+8ffdeabc7c2b9a8280bf46cae026ac46b4d31c26 jdk9-b64
--- a/.hgtags-top-repo Thu May 21 18:23:01 2015 +0300
+++ b/.hgtags-top-repo Fri May 22 09:50:33 2015 +0200
@@ -306,3 +306,4 @@
ea38728b4f4bdd8fd0d7a89b18069f521cf05013 jdk9-b61
105d045a69174d870b69bfe471b3f2d05a9f8ecc jdk9-b62
0b32ed628fa60e4ab99fb0b5866d648e16231f17 jdk9-b63
+82cf9aab9a83e41c8194ba01af9666afdb856cbe jdk9-b64
--- a/common/autoconf/basics.m4 Thu May 21 18:23:01 2015 +0300
+++ b/common/autoconf/basics.m4 Fri May 22 09:50:33 2015 +0200
@@ -705,9 +705,9 @@
# is performed.
filtered_files=`$ECHO "$files_present" \
| $SED -e 's/config.log//g' \
- -e 's/confdefs.h//g' \
- -e 's/fixpath.exe//g' \
- -e 's/ //g' \
+ -e 's/configure.log//g' \
+ -e 's/confdefs.h//g' \
+ -e 's/ //g' \
| $TR -d '\n'`
if test "x$filtered_files" != x; then
AC_MSG_NOTICE([Current directory is $CURDIR.])
@@ -1054,3 +1054,29 @@
AC_SUBST(BASH_ARGS)
])
+
+# Code to run after AC_OUTPUT
+AC_DEFUN_ONCE([BASIC_POST_CONFIG_OUTPUT],
+[
+ # Try to move config.log (generated by autoconf) to the configure-support directory.
+ if test -e ./config.log; then
+ $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
+ fi
+
+ # Rotate our log file (configure.log)
+ if test -e "$OUTPUT_ROOT/configure.log.old"; then
+ $RM -f "$OUTPUT_ROOT/configure.log.old"
+ fi
+ if test -e "$OUTPUT_ROOT/configure.log"; then
+ $MV -f "$OUTPUT_ROOT/configure.log" "$OUTPUT_ROOT/configure.log.old" 2> /dev/null
+ fi
+
+ # Move configure.log from current directory to the build output root
+ if test -e ./configure.log; then
+ echo found it
+ $MV -f ./configure.log "$OUTPUT_ROOT/configure.log" 2> /dev/null
+ fi
+
+ # Make the compare script executable
+ $CHMOD +x $OUTPUT_ROOT/compare.sh
+])
--- a/common/autoconf/configure Thu May 21 18:23:01 2015 +0300
+++ b/common/autoconf/configure Fri May 22 09:50:33 2015 +0200
@@ -255,13 +255,10 @@
set -x
fi
-if test "x$conf_debug_configure" = xtrue; then
- # Turn on logging, but don't turn on twice when called recursive
- conf_debug_logfile=./debug-configure.log
- (exec 3>&1 ; (. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) | tee -a $conf_debug_logfile 1>&2 ; exec 3>&-) | tee -a $conf_debug_logfile
-else
- ( . $conf_script_to_run "${conf_processed_arguments[@]}" )
-fi
+# Now transfer control to the script generated by autoconf. This is where the
+# main work is done.
+conf_logfile=./configure.log
+(exec 3>&1 ; (. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) | tee -a $conf_logfile 1>&2 ; exec 3>&-) | tee -a $conf_logfile
conf_result_code=$?
###
--- a/common/autoconf/configure.ac Thu May 21 18:23:01 2015 +0300
+++ b/common/autoconf/configure.ac Fri May 22 09:50:33 2015 +0200
@@ -265,15 +265,10 @@
# Create the actual output files. Now the main work of configure is done.
AC_OUTPUT
+
+# After AC_OUTPUT, we need to do final work
CUSTOM_CONFIG_OUTPUT_GENERATED_HOOK
-
-# Try to move the config.log file to the output directory.
-if test -e ./config.log; then
- $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
-fi
-
-# Make the compare script executable
-$CHMOD +x $OUTPUT_ROOT/compare.sh
+BASIC_POST_CONFIG_OUTPUT
# Finally output some useful information to the user
HELP_PRINT_SUMMARY_AND_WARNINGS
--- a/common/autoconf/flags.m4 Thu May 21 18:23:01 2015 +0300
+++ b/common/autoconf/flags.m4 Fri May 22 09:50:33 2015 +0200
@@ -231,7 +231,6 @@
AC_SUBST(C_FLAG_REORDER)
AC_SUBST(CXX_FLAG_REORDER)
- AC_SUBST(SHARED_LIBRARY_FLAGS)
AC_SUBST(SET_EXECUTABLE_ORIGIN)
AC_SUBST(SET_SHARED_LIBRARY_ORIGIN)
AC_SUBST(SET_SHARED_LIBRARY_NAME)
@@ -524,6 +523,10 @@
# CXXFLAGS_JDK - C++ Compiler flags
# COMMON_CCXXFLAGS_JDK - common to C and C++
if test "x$TOOLCHAIN_TYPE" = xgcc; then
+ if test "x$OPENJDK_TARGET_CPU" = xx86; then
+ # Force compatibility with i586 on 32 bit intel platforms.
+ COMMON_CCXXFLAGS="${COMMON_CCXXFLAGS} -march=i586"
+ fi
COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
-pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
case $OPENJDK_TARGET_CPU_ARCH in
@@ -900,6 +903,24 @@
[COMPILER_SUPPORTS_TARGET_BITS_FLAG=false])
AC_SUBST(COMPILER_SUPPORTS_TARGET_BITS_FLAG)
+ AC_ARG_ENABLE([warnings-as-errors], [AS_HELP_STRING([--disable-warnings-as-errors],
+ [do not consider native warnings to be an error @<:@enabled@:>@])])
+
+ AC_MSG_CHECKING([if native warnings are errors])
+ if test "x$enable_warnings_as_errors" = "xyes"; then
+ AC_MSG_RESULT([yes (explicitely set)])
+ WARNINGS_AS_ERRORS=true
+ elif test "x$enable_warnings_as_errors" = "xno"; then
+ AC_MSG_RESULT([no])
+ WARNINGS_AS_ERRORS=false
+ elif test "x$enable_warnings_as_errors" = "x"; then
+ AC_MSG_RESULT([yes (default)])
+ WARNINGS_AS_ERRORS=true
+ else
+ AC_MSG_ERROR([--enable-warnings-as-errors accepts no argument])
+ fi
+ AC_SUBST(WARNINGS_AS_ERRORS)
+
case "${TOOLCHAIN_TYPE}" in
microsoft)
DISABLE_WARNING_PREFIX="-wd"
--- a/common/autoconf/generated-configure.sh Thu May 21 18:23:01 2015 +0300
+++ b/common/autoconf/generated-configure.sh Fri May 22 09:50:33 2015 +0200
@@ -684,6 +684,7 @@
ENABLE_DEBUG_SYMBOLS
CFLAGS_WARNINGS_ARE_ERRORS
DISABLE_WARNING_PREFIX
+WARNINGS_AS_ERRORS
COMPILER_SUPPORTS_TARGET_BITS_FLAG
ZERO_ARCHFLAG
LDFLAGS_TESTEXE_SUFFIX
@@ -727,7 +728,6 @@
SET_SHARED_LIBRARY_NAME
SET_SHARED_LIBRARY_ORIGIN
SET_EXECUTABLE_ORIGIN
-SHARED_LIBRARY_FLAGS
CXX_FLAG_REORDER
C_FLAG_REORDER
SYSROOT_LDFLAGS
@@ -1086,6 +1086,7 @@
with_extra_cflags
with_extra_cxxflags
with_extra_ldflags
+enable_warnings_as_errors
enable_debug_symbols
enable_zip_debug_info
enable_native_coverage
@@ -1852,6 +1853,9 @@
--enable-rmiconnector-iiop
enable the JMX RMIConnector iiop transport
[disabled]
+ --disable-warnings-as-errors
+ do not consider native warnings to be an error
+ [enabled]
--disable-debug-symbols disable generation of debug symbols [enabled]
--disable-zip-debug-info
disable zipping of debug-info files [enabled]
@@ -3496,6 +3500,9 @@
# Check for support for specific options in bash
+# Code to run after AC_OUTPUT
+
+
#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -4359,7 +4366,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1430918902
+DATE_WHEN_GENERATED=1431429776
###############################################################################
#
@@ -15335,9 +15342,9 @@
# is performed.
filtered_files=`$ECHO "$files_present" \
| $SED -e 's/config.log//g' \
- -e 's/confdefs.h//g' \
- -e 's/fixpath.exe//g' \
- -e 's/ //g' \
+ -e 's/configure.log//g' \
+ -e 's/confdefs.h//g' \
+ -e 's/ //g' \
| $TR -d '\n'`
if test "x$filtered_files" != x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Current directory is $CURDIR." >&5
@@ -41761,7 +41768,6 @@
-
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
CFLAGS_JDK="${CFLAGS_JDK} -D__solaris__"
CXXFLAGS_JDK="${CXXFLAGS_JDK} -D__solaris__"
@@ -42029,6 +42035,10 @@
# CXXFLAGS_JDK - C++ Compiler flags
# COMMON_CCXXFLAGS_JDK - common to C and C++
if test "x$TOOLCHAIN_TYPE" = xgcc; then
+ if test "x$OPENJDK_TARGET_CPU" = xx86; then
+ # Force compatibility with i586 on 32 bit intel platforms.
+ COMMON_CCXXFLAGS="${COMMON_CCXXFLAGS} -march=i586"
+ fi
COMMON_CCXXFLAGS_JDK="$COMMON_CCXXFLAGS $COMMON_CCXXFLAGS_JDK -Wall -Wextra -Wno-unused -Wno-unused-parameter -Wformat=2 \
-pipe -D_GNU_SOURCE -D_REENTRANT -D_LARGEFILE64_SOURCE"
case $OPENJDK_TARGET_CPU_ARCH in
@@ -42471,6 +42481,31 @@
+ # Check whether --enable-warnings-as-errors was given.
+if test "${enable_warnings_as_errors+set}" = set; then :
+ enableval=$enable_warnings_as_errors;
+fi
+
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if native warnings are errors" >&5
+$as_echo_n "checking if native warnings are errors... " >&6; }
+ if test "x$enable_warnings_as_errors" = "xyes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (explicitely set)" >&5
+$as_echo "yes (explicitely set)" >&6; }
+ WARNINGS_AS_ERRORS=true
+ elif test "x$enable_warnings_as_errors" = "xno"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ WARNINGS_AS_ERRORS=false
+ elif test "x$enable_warnings_as_errors" = "x"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (default)" >&5
+$as_echo "yes (default)" >&6; }
+ WARNINGS_AS_ERRORS=true
+ else
+ as_fn_error $? "--enable-warnings-as-errors accepts no argument" "$LINENO" 5
+ fi
+
+
case "${TOOLCHAIN_TYPE}" in
microsoft)
DISABLE_WARNING_PREFIX="-wd"
@@ -54179,14 +54214,31 @@
fi
-
-# Try to move the config.log file to the output directory.
-if test -e ./config.log; then
- $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
-fi
-
-# Make the compare script executable
-$CHMOD +x $OUTPUT_ROOT/compare.sh
+# After AC_OUTPUT, we need to do final work
+
+
+ # Try to move config.log (generated by autoconf) to the configure-support directory.
+ if test -e ./config.log; then
+ $MV -f ./config.log "$CONFIGURESUPPORT_OUTPUTDIR/config.log" 2> /dev/null
+ fi
+
+ # Rotate our log file (configure.log)
+ if test -e "$OUTPUT_ROOT/configure.log.old"; then
+ $RM -f "$OUTPUT_ROOT/configure.log.old"
+ fi
+ if test -e "$OUTPUT_ROOT/configure.log"; then
+ $MV -f "$OUTPUT_ROOT/configure.log" "$OUTPUT_ROOT/configure.log.old" 2> /dev/null
+ fi
+
+ # Move configure.log from current directory to the build output root
+ if test -e ./configure.log; then
+ echo found it
+ $MV -f ./configure.log "$OUTPUT_ROOT/configure.log" 2> /dev/null
+ fi
+
+ # Make the compare script executable
+ $CHMOD +x $OUTPUT_ROOT/compare.sh
+
# Finally output some useful information to the user
@@ -54280,14 +54332,20 @@
-if test -e "$OUTPUT_ROOT/config.log"; then
- $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" > /dev/null 2>&1
- if test $? -eq 0; then
- printf "The following warnings were produced. Repeated here for convenience:\n"
- # We must quote sed expression (using []) to stop m4 from eating the [].
- $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" | $SED -e 's/^configure:[0-9]*: //'
- printf "\n"
- fi
-fi
-
-
+ # Locate config.log.
+ if test -e "$CONFIGURESUPPORT_OUTPUTDIR/config.log"; then
+ CONFIG_LOG_PATH="$CONFIGURESUPPORT_OUTPUTDIR"
+ elif test -e "./config.log"; then
+ CONFIG_LOG_PATH="."
+ fi
+
+ if test -e "$CONFIG_LOG_PATH/config.log"; then
+ $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" > /dev/null 2>&1
+ if test $? -eq 0; then
+ printf "The following warnings were produced. Repeated here for convenience:\n"
+ # We must quote sed expression (using []) to stop m4 from eating the [].
+ $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" | $SED -e 's/^configure:[0-9]*: //'
+ printf "\n"
+ fi
+ fi
+
--- a/common/autoconf/help.m4 Thu May 21 18:23:01 2015 +0300
+++ b/common/autoconf/help.m4 Fri May 22 09:50:33 2015 +0200
@@ -212,7 +212,7 @@
if test "x$TOOLCHAIN_VERSION" != "x"; then
print_version=" $TOOLCHAIN_VERSION"
fi
- printf "* Toolchain: $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION$print_version)\n"
+ printf "* Toolchain: $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION$print_version)\n"
printf "* C Compiler: Version $CC_VERSION_NUMBER (at $CC)\n"
printf "* C++ Compiler: Version $CXX_VERSION_NUMBER (at $CXX)\n"
@@ -263,14 +263,20 @@
AC_DEFUN_ONCE([HELP_REPEAT_WARNINGS],
[
-if test -e "$OUTPUT_ROOT/config.log"; then
- $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" > /dev/null 2>&1
- if test $? -eq 0; then
- printf "The following warnings were produced. Repeated here for convenience:\n"
- # We must quote sed expression (using []) to stop m4 from eating the [].
- $GREP '^configure:.*: WARNING:' "$OUTPUT_ROOT/config.log" | $SED -e [ 's/^configure:[0-9]*: //' ]
- printf "\n"
+ # Locate config.log.
+ if test -e "$CONFIGURESUPPORT_OUTPUTDIR/config.log"; then
+ CONFIG_LOG_PATH="$CONFIGURESUPPORT_OUTPUTDIR"
+ elif test -e "./config.log"; then
+ CONFIG_LOG_PATH="."
fi
-fi
+ if test -e "$CONFIG_LOG_PATH/config.log"; then
+ $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" > /dev/null 2>&1
+ if test $? -eq 0; then
+ printf "The following warnings were produced. Repeated here for convenience:\n"
+ # We must quote sed expression (using []) to stop m4 from eating the [].
+ $GREP '^configure:.*: WARNING:' "$CONFIG_LOG_PATH/config.log" | $SED -e [ 's/^configure:[0-9]*: //' ]
+ printf "\n"
+ fi
+ fi
])
--- a/common/autoconf/spec.gmk.in Thu May 21 18:23:01 2015 +0300
+++ b/common/autoconf/spec.gmk.in Fri May 22 09:50:33 2015 +0200
@@ -321,6 +321,9 @@
DISABLE_WARNING_PREFIX := @DISABLE_WARNING_PREFIX@
CFLAGS_WARNINGS_ARE_ERRORS:=@CFLAGS_WARNINGS_ARE_ERRORS@
+# A global flag (true or false) determining if native warnings are considered errors.
+WARNINGS_AS_ERRORS := @WARNINGS_AS_ERRORS@
+
CFLAGS_CCACHE:=@CFLAGS_CCACHE@
# Tools that potentially need to be cross compilation aware.
@@ -394,9 +397,6 @@
LIPO:=@LIPO@
-# Command to create a shared library
-SHARED_LIBRARY_FLAGS:=@SHARED_LIBRARY_FLAGS@
-
# Options to linker to specify a mapfile.
# (Note absence of := assignment, because we do not want to evaluate the macro body here)
SET_SHARED_LIBRARY_MAPFILE=@SET_SHARED_LIBRARY_MAPFILE@
--- a/corba/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/corba/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -306,3 +306,4 @@
d690f489ca0bb95a6157d996da2fa72bcbcf02ea jdk9-b61
d27f7e0a7aca129969de23e9934408a31b4abf4c jdk9-b62
0acac6937de7a0868f8c6f88b7d036d780abeee6 jdk9-b63
+0a5e5a7c3539e8bde73d9fe55750e49a49cb8dac jdk9-b64
--- a/hotspot/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -466,3 +466,4 @@
715d2da5801c410746e92f08066d53bde1496286 jdk9-b61
1eab877142cce6ca06e556e2ad0af688f993f00b jdk9-b62
2ac9b6b36689b50d1562627067c92d51781b5684 jdk9-b63
+bf92b8db249cdfa5651ef954b6c0743a7e0ea4cd jdk9-b64
--- a/hotspot/src/cpu/aarch64/vm/aarch64.ad Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/aarch64.ad Fri May 22 09:50:33 2015 +0200
@@ -810,9 +810,6 @@
bool unnecessary_volatile(const Node *barrier);
bool needs_releasing_store(const Node *store);
- // Use barrier instructions rather than load acquire / store
- // release.
- const bool UseBarriersForVolatile = false;
// Use barrier instructions for unsafe volatile gets rather than
// trying to identify an exact signature for them
const bool UseBarriersForUnsafeVolatileGet = false;
--- a/hotspot/src/cpu/aarch64/vm/globals_aarch64.hpp Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/globals_aarch64.hpp Fri May 22 09:50:33 2015 +0200
@@ -98,8 +98,8 @@
product(bool, NearCpool, true, \
"constant pool is close to instructions") \
\
- notproduct(bool, UseAcqRelForVolatileFields, false, \
- "Use acquire and release insns for volatile fields") \
+ product(bool, UseBarriersForVolatile, false, \
+ "Use memory barriers to implement volatile accesses") \
\
product(bool, UseCRC32, false, \
"Use CRC32 instructions for CRC32 computation") \
@@ -117,8 +117,8 @@
product(bool, NearCpool, true, \
"constant pool is close to instructions") \
\
- notproduct(bool, UseAcqRelForVolatileFields, false, \
- "Use acquire and release insns for volatile fields") \
+ product(bool, UseBarriersForVolatile, false, \
+ "Use memory barriers to implement volatile accesses") \
product(bool, UseNeon, false, \
"Use Neon for CRC32 computation") \
product(bool, UseCRC32, false, \
--- a/hotspot/src/cpu/aarch64/vm/interp_masm_aarch64.cpp Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/interp_masm_aarch64.cpp Fri May 22 09:50:33 2015 +0200
@@ -1314,7 +1314,7 @@
// case_array_offset_in_bytes()
movw(reg2, in_bytes(MultiBranchData::per_case_size()));
movw(rscratch1, in_bytes(MultiBranchData::case_array_offset()));
- maddw(index, index, reg2, rscratch1);
+ Assembler::maddw(index, index, reg2, rscratch1);
// Update the case count
increment_mdp_data_at(mdp,
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Fri May 22 09:50:33 2015 +0200
@@ -1625,7 +1625,7 @@
sdivw(result, ra, rb);
} else {
sdivw(scratch, ra, rb);
- msubw(result, scratch, rb, ra);
+ Assembler::msubw(result, scratch, rb, ra);
}
return idivl_offset;
@@ -1655,7 +1655,7 @@
sdiv(result, ra, rb);
} else {
sdiv(scratch, ra, rb);
- msub(result, scratch, rb, ra);
+ Assembler::msub(result, scratch, rb, ra);
}
return idivq_offset;
@@ -3787,14 +3787,6 @@
}
}
- bool MacroAssembler::use_acq_rel_for_volatile_fields() {
-#ifdef PRODUCT
- return false;
-#else
- return UseAcqRelForVolatileFields;
-#endif
- }
-
void MacroAssembler::build_frame(int framesize) {
if (framesize == 0) {
// Is this even possible?
--- a/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp Fri May 22 09:50:33 2015 +0200
@@ -405,6 +405,18 @@
umaddl(Rd, Rn, Rm, zr);
}
+#define WRAP(INSN) \
+ void INSN(Register Rd, Register Rn, Register Rm, Register Ra) { \
+ if ((VM_Version::cpu_cpuFeatures() & VM_Version::CPU_A53MAC) && Ra != zr) \
+ nop(); \
+ Assembler::INSN(Rd, Rn, Rm, Ra); \
+ }
+
+ WRAP(madd) WRAP(msub) WRAP(maddw) WRAP(msubw)
+ WRAP(smaddl) WRAP(smsubl) WRAP(umaddl) WRAP(umsubl)
+#undef WRAP
+
+
// macro assembly operations needed for aarch64
// first two private routines for loading 32 bit or 64 bit constants
@@ -1094,9 +1106,6 @@
address read_polling_page(Register r, address page, relocInfo::relocType rtype);
address read_polling_page(Register r, relocInfo::relocType rtype);
- // Used by aarch64.ad to control code generation
- static bool use_acq_rel_for_volatile_fields();
-
// CRC32 code for java.util.zip.CRC32::updateBytes() instrinsic.
void update_byte_crc32(Register crc, Register val, Register table);
void update_word_crc32(Register crc, Register v, Register tmp,
@@ -1150,10 +1159,6 @@
int offset, int size);
};
-// Used by aarch64.ad to control code generation
-#define treat_as_volatile(MEM_NODE) \
- (MacroAssembler::use_acq_rel_for_volatile_fields() ? (MEM_NODE)->is_volatile() : false)
-
#ifdef ASSERT
inline bool AbstractAssembler::pd_check_instruction_mark() { return false; }
#endif
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp Fri May 22 09:50:33 2015 +0200
@@ -59,6 +59,9 @@
int VM_Version::_cpu;
int VM_Version::_model;
+int VM_Version::_model2;
+int VM_Version::_variant;
+int VM_Version::_revision;
int VM_Version::_stepping;
int VM_Version::_cpuFeatures;
const char* VM_Version::_features_str = "";
@@ -122,13 +125,47 @@
char buf[512];
- strcpy(buf, "simd");
+ _cpuFeatures = auxv;
+
+ int cpu_lines = 0;
+ if (FILE *f = fopen("/proc/cpuinfo", "r")) {
+ char buf[128], *p;
+ while (fgets(buf, sizeof (buf), f) != NULL) {
+ if (p = strchr(buf, ':')) {
+ long v = strtol(p+1, NULL, 0);
+ if (strncmp(buf, "CPU implementer", sizeof "CPU implementer" - 1) == 0) {
+ _cpu = v;
+ cpu_lines++;
+ } else if (strncmp(buf, "CPU variant", sizeof "CPU variant" - 1) == 0) {
+ _variant = v;
+ } else if (strncmp(buf, "CPU part", sizeof "CPU part" - 1) == 0) {
+ if (_model != v) _model2 = _model;
+ _model = v;
+ } else if (strncmp(buf, "CPU revision", sizeof "CPU revision" - 1) == 0) {
+ _revision = v;
+ }
+ }
+ }
+ fclose(f);
+ }
+
+ // Enable vendor specific features
+ if (_cpu == CPU_CAVIUM && _variant == 0) _cpuFeatures |= CPU_DMB_ATOMICS;
+ if (_cpu == CPU_ARM && (_model == 0xd03 || _model2 == 0xd03)) _cpuFeatures |= CPU_A53MAC;
+ // If an olde style /proc/cpuinfo (cpu_lines == 1) then if _model is an A57 (0xd07)
+ // we assume the worst and assume we could be on a big little system and have
+ // undisclosed A53 cores which we could be swapped to at any stage
+ if (_cpu == CPU_ARM && cpu_lines == 1 && _model == 0xd07) _cpuFeatures |= CPU_A53MAC;
+
+ sprintf(buf, "0x%02x:0x%x:0x%03x:%d", _cpu, _variant, _model, _revision);
+ if (_model2) sprintf(buf+strlen(buf), "(0x%03x)", _model2);
+ if (auxv & HWCAP_ASIMD) strcat(buf, ", simd");
if (auxv & HWCAP_CRC32) strcat(buf, ", crc");
if (auxv & HWCAP_AES) strcat(buf, ", aes");
if (auxv & HWCAP_SHA1) strcat(buf, ", sha1");
if (auxv & HWCAP_SHA2) strcat(buf, ", sha256");
- _features_str = strdup(buf);
+ _features_str = os::strdup(buf);
if (FLAG_IS_DEFAULT(UseCRC32)) {
UseCRC32 = (auxv & HWCAP_CRC32) != 0;
@@ -202,6 +239,10 @@
UseMultiplyToLenIntrinsic = true;
}
+ if (FLAG_IS_DEFAULT(UseBarriersForVolatile)) {
+ UseBarriersForVolatile = (_cpuFeatures & CPU_DMB_ATOMICS) != 0;
+ }
+
#ifdef COMPILER2
if (FLAG_IS_DEFAULT(OptoScheduling)) {
OptoScheduling = true;
--- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp Thu May 21 18:23:01 2015 +0300
+++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.hpp Fri May 22 09:50:33 2015 +0200
@@ -34,6 +34,9 @@
protected:
static int _cpu;
static int _model;
+ static int _model2;
+ static int _variant;
+ static int _revision;
static int _stepping;
static int _cpuFeatures; // features returned by the "cpuid" instruction
// 0 if this instruction is not available
@@ -49,7 +52,40 @@
static void assert_is_initialized() {
}
+ enum {
+ CPU_ARM = 'A',
+ CPU_BROADCOM = 'B',
+ CPU_CAVIUM = 'C',
+ CPU_DEC = 'D',
+ CPU_INFINEON = 'I',
+ CPU_MOTOROLA = 'M',
+ CPU_NVIDIA = 'N',
+ CPU_AMCC = 'P',
+ CPU_QUALCOM = 'Q',
+ CPU_MARVELL = 'V',
+ CPU_INTEL = 'i',
+ } cpuFamily;
+
+ enum {
+ CPU_FP = (1<<0),
+ CPU_ASIMD = (1<<1),
+ CPU_EVTSTRM = (1<<2),
+ CPU_AES = (1<<3),
+ CPU_PMULL = (1<<4),
+ CPU_SHA1 = (1<<5),
+ CPU_SHA2 = (1<<6),
+ CPU_CRC32 = (1<<7),
+ CPU_A53MAC = (1 << 30),
+ CPU_DMB_ATOMICS = (1 << 31),
+ } cpuFeatureFlags;
+
static const char* cpu_features() { return _features_str; }
+ static int cpu_family() { return _cpu; }
+ static int cpu_model() { return _model; }
+ static int cpu_model2() { return _model2; }
+ static int cpu_variant() { return _variant; }
+ static int cpu_revision() { return _revision; }
+ static int cpu_cpuFeatures() { return _cpuFeatures; }
};
--- a/jaxp/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/jaxp/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -306,3 +306,4 @@
f4a4a54620370f077c2e830a5561c8cfa811712b jdk9-b61
3bcf83c1bbc1b7663e930d72c133a9bd86c7618d jdk9-b62
4a8f895f0317dcc90479cb7cc97014312e69edf7 jdk9-b63
+6f91749b5aaef1a171ec2254163233438d1071d1 jdk9-b64
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/dom/MultiDOM.java Thu May 21 18:23:01 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/dom/MultiDOM.java Fri May 22 09:50:33 2015 +0200
@@ -567,8 +567,12 @@
}
public NodeList makeNodeList(DTMAxisIterator iter) {
- // TODO: gather nodes from all DOMs ?
- return _main.makeNodeList(iter);
+ int index = iter.next();
+ if (index == DTM.NULL) {
+ return null;
+ }
+ iter.reset();
+ return _adapters[getDTMId(index)].makeNodeList(iter);
}
public String getLanguage(int node) {
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java Thu May 21 18:23:01 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLLimitAnalyzer.java Fri May 22 09:50:33 2015 +0200
@@ -1,7 +1,7 @@
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
- * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java Thu May 21 18:23:01 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityManager.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 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
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java Thu May 21 18:23:01 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xerces/internal/utils/XMLSecurityPropertyManager.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 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
--- a/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathEvaluationResult.java Thu May 21 18:23:01 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathEvaluationResult.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 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
--- a/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathNodes.java Thu May 21 18:23:01 2015 +0300
+++ b/jaxp/src/java.xml/share/classes/javax/xml/xpath/XPathNodes.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015 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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/transform/DocumentExtFunc.java Fri May 22 09:50:33 2015 +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.
+ */
+
+package javax.xml.transform;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class DocumentExtFunc {
+
+ public static String test(NodeList list) {
+ Node node = list.item(0);
+ return "["+node.getNodeName() + ":" + node.getNodeValue()+"]";
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/transform/XSLTFunctionsTest.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.xml.transform;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+
+/*
+ * @summary This class contains tests for XSLT functions.
+ */
+
+public class XSLTFunctionsTest {
+
+ /**
+ * @bug 8062518
+ * Verifies that a reference to the DTM created by XSLT document function is
+ * actually read from the DTM by an extension function.
+ * @param xml Content of xml file to process
+ * @param xsl stylesheet content that loads external document {@code externalDoc}
+ * with XSLT 'document' function and then reads it with
+ * DocumentExtFunc.test() function
+ * @param externalDoc Content of the external xml document
+ * @param expectedResult Expected transformation result
+ **/
+ @Test(dataProvider = "document")
+ public void testDocument(final String xml, final String xsl,
+ final String externalDoc, final String expectedResult) throws Exception {
+ // Prepare sources for transormation
+ Source src = new StreamSource(new StringReader(xml));
+ Source xslsrc = new StreamSource(new StringReader(xsl));
+
+ // Create factory and transformer
+ TransformerFactory tf = TransformerFactory.newInstance();
+ Transformer t = tf.newTransformer( xslsrc );
+ t.setErrorListener(tf.getErrorListener());
+
+ // Set URI Resolver to return the newly constructed xml
+ // stream source object from xml test string
+ t.setURIResolver(new URIResolver() {
+ @Override
+ public Source resolve(String href, String base)
+ throws TransformerException {
+ if (href.contains("externalDoc")) {
+ return new StreamSource(new StringReader(externalDoc));
+ } else {
+ return new StreamSource(new StringReader(xml));
+ }
+ }
+ });
+
+ // Prepare output stream
+ StringWriter xmlResultString = new StringWriter();
+ StreamResult xmlResultStream = new StreamResult(xmlResultString);
+
+ //Transform the xml
+ t.transform(src, xmlResultStream);
+
+ // If the document can't be accessed and the bug is in place then
+ // reported exception will be thrown during transformation
+ System.out.println("Transformation result:"+xmlResultString.toString().trim());
+
+ // Check the result - it should contain two (node name, node values) entries -
+ // one for original document, another for a document created with
+ // call to 'document' function
+ assertEquals(xmlResultString.toString().trim(), expectedResult);
+ }
+
+ @DataProvider(name = "document")
+ public static Object[][] documentTestData() {
+ return new Object[][] {
+ {documentTestXml, documentTestXsl, documentTestExternalDoc, documentTesteExpectedResult},
+ };
+ }
+
+ static final String documentTestXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Test>Doc</Test>";
+
+ static final String documentTestExternalDoc = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Test>External Doc</Test>";
+
+ static final String documentTestXsl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ + "<xsl:transform version=\"1.0\""
+ + " xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" "
+ + " xmlns:cfunc=\"http://xml.apache.org/xalan/java/\">"
+ + "<xsl:template match=\"/\">"
+ + "<xsl:element name=\"root\">"
+ + "<xsl:variable name=\"other_doc\" select=\"document('externalDoc')\"/>"
+ + "<!-- Source -->"
+ + "<xsl:value-of select=\"cfunc:javax.xml.transform.DocumentExtFunc.test(/Test)\"/>"
+ + "<!-- document() -->"
+ + "<xsl:value-of select=\"cfunc:javax.xml.transform.DocumentExtFunc.test($other_doc/Test)\"/>"
+ + "</xsl:element></xsl:template></xsl:transform>";
+
+ static final String documentTesteExpectedResult = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ + "<root>[Test:Doc][Test:External Doc]</root>";
+}
--- a/jaxws/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/jaxws/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -309,3 +309,4 @@
77f44848c44c003205490bf5ab88035233b65418 jdk9-b61
cd0cf72b2cbf4adb778a02505fb065bb2292688c jdk9-b62
b5c22d09b1c91dd49b006f38d8ba9c4397517ccc jdk9-b63
+df100399ed27d0eaa57c137ca99819a0fee66178 jdk9-b64
--- a/jdk/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/jdk/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -306,3 +306,4 @@
da84dcac1b0b12c5b836b05ac75ecbfadee0cd32 jdk9-b61
49118e68fbd4cc0044e718c47db681946d5efd69 jdk9-b62
fd3281c400347088b36aeb16273aa679d53a81a4 jdk9-b63
+7de8d036ad0980d988d1b9b4b4e6be555d9fbf98 jdk9-b64
--- a/jdk/make/CompileDemos.gmk Thu May 21 18:23:01 2015 +0300
+++ b/jdk/make/CompileDemos.gmk Fri May 22 09:50:33 2015 +0200
@@ -30,6 +30,7 @@
include JavaCompilation.gmk
include NativeCompilation.gmk
include SetupJavaCompilers.gmk
+include TextFileProcessing.gmk
# Prepare the find cache.
$(eval $(call FillCacheFind, $(JDK_TOPDIR)/src))
@@ -49,6 +50,15 @@
##################################################################################################
+# This rule will be depended on due to the MANIFEST line
+$(eval $(call SetupTextFileProcessing, BUILD_JAVA_MANIFEST, \
+ SOURCE_FILES := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+ OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
+ REPLACEMENTS := \
+ @@RELEASE@@ => $(RELEASE) ; \
+ @@COMPANY_NAME@@ => $(COMPANY_NAME) , \
+))
+
define SetupAppletDemo
$$(eval $$(call SetupJavaCompilation,BUILD_DEMO_APPLET_$1, \
SETUP := GENERATE_USINGJDKBYTECODE, \
@@ -122,7 +132,7 @@
COPY := $(PATTERNS_TO_COPY) $(10), \
JAR := $(SUPPORT_OUTPUTDIR)/demo/image/$2/$1/$$($1_JARFILE), \
JARMAIN := $4, \
- MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+ MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
EXTRA_MANIFEST_ATTR := $(11), \
SRCZIP := $(SUPPORT_OUTPUTDIR)/demo/image/$2/$1/src.zip, \
EXCLUDE_FILES := $9, \
@@ -290,7 +300,7 @@
COPY := $(PATTERNS_TO_COPY), \
JAR := $(SUPPORT_OUTPUTDIR)/demo/image/jvmti/$1/$1.jar, \
EXTRA_MANIFEST_ATTR := Main-Class: \n, \
- MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf))
+ MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf))
BUILD_DEMOS += $(SUPPORT_OUTPUTDIR)/demo/image/jvmti/$1/$1.jar
endif
@@ -382,7 +392,7 @@
BIN := $(SUPPORT_OUTPUTDIR)/demo/classes/jni/Poller, \
HEADERS := $(SUPPORT_OUTPUTDIR)/demo/classes/jni/Poller, \
JAR := $(SUPPORT_OUTPUTDIR)/demo/image/jni/Poller/Poller.jar, \
- MANIFEST := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
+ MANIFEST := $(SUPPORT_OUTPUTDIR)/demo/java-main-manifest.mf, \
SRCZIP := $(SUPPORT_OUTPUTDIR)/demo/image/jni/Poller/src.zip, \
COPY := README.txt Poller.c, \
JARMAIN := Client))
--- a/jdk/src/demo/share/applets.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/demo/share/applets.html Fri May 22 09:50:33 2015 +0200
@@ -56,8 +56,7 @@
</TR>
<TR>
-<TD ALIGN=RIGHT COLSPAN="2"><!-- page headline --><!-------------------------------><!--EDIT THE PAGE HEADLINE HERE--><!------------BEGIN-HEADLINE-----><FONT SIZE=+2>JAVA</FONT><SUP><FONT SIZE=-2>TM</FONT></SUP><FONT SIZE=+2>
-PLUG-IN</FONT>
+<TD ALIGN=RIGHT COLSPAN="2"><!-- page headline --><!-------------------------------><!--EDIT THE PAGE HEADLINE HERE--><!------------BEGIN-HEADLINE-----><FONT SIZE=+2>JAVA™ PLUG-IN</FONT>
<BR><B>Demonstration Applets</B>
<BR><!-------------END-HEADLINE------><!-- END OF PAGE HEADLINE --><!-------------------------------></TD>
</TR>
--- a/jdk/src/demo/share/jvmti/index.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/demo/share/jvmti/index.html Fri May 22 09:50:33 2015 +0200
@@ -5,7 +5,7 @@
<p>
The
-Java<sup><font size=-2>TM</font></sup> Virtual Machine Tools Interface (JVM TI)
+Java™ Virtual Machine Tools Interface (JVM TI)
is a native tool interface provided in JDK 5.0 and newer.
Native libraries that use JVM TI and are loaded into the
Java Virtual Machine
--- a/jdk/src/java.base/share/classes/java/lang/Boolean.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/Boolean.java Fri May 22 09:50:33 2015 +0200
@@ -230,13 +230,12 @@
}
/**
- * Returns {@code true} if and only if the system property
- * named by the argument exists and is equal to the string
- * {@code "true"}. (Beginning with version 1.0.2 of the
- * Java<small><sup>TM</sup></small> platform, the test of
- * this string is case insensitive.) A system property is accessible
- * through {@code getProperty}, a method defined by the
- * {@code System} class.
+ * Returns {@code true} if and only if the system property named
+ * by the argument exists and is equal to the string {@code
+ * "true"}. (Beginning with version 1.0.2 of the Java™
+ * platform, the test of this string is case insensitive.) A
+ * system property is accessible through {@code getProperty}, a
+ * method defined by the {@code System} class.
* <p>
* If there is no property with the specified name, or if the specified
* name is empty or null, then {@code false} is returned.
--- a/jdk/src/java.base/share/classes/java/lang/Character.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/Character.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -645,8 +645,14 @@
* @since 1.2
*/
public static final class UnicodeBlock extends Subset {
-
- private static Map<String, UnicodeBlock> map = new HashMap<>(256);
+ /**
+ * 510 - the expected number of enteties
+ * 0.75 - the default load factor of HashMap
+ */
+ private static final int INITIAL_CAPACITY =
+ (int)(510 / 0.75f + 1.0f);
+ private static Map<String, UnicodeBlock> map =
+ new HashMap<>(INITIAL_CAPACITY);
/**
* Creates a UnicodeBlock with the given identifier name.
--- a/jdk/src/java.base/share/classes/java/lang/Long.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/Long.java Fri May 22 09:50:33 2015 +0200
@@ -1708,7 +1708,7 @@
* @since 1.5
*/
public static int bitCount(long i) {
- // HD, Figure 5-14
+ // HD, Figure 5-2
i = i - ((i >>> 1) & 0x5555555555555555L);
i = (i & 0x3333333333333333L) + ((i >>> 2) & 0x3333333333333333L);
i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
--- a/jdk/src/java.base/share/classes/java/lang/String.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Fri May 22 09:50:33 2015 +0200
@@ -179,7 +179,7 @@
* not affect the newly created string.
*
* @param value
- * Array that is the source of characters
+ * Array that is the source of characters
*
* @param offset
* The initial offset
@@ -208,7 +208,7 @@
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
- this.value = Arrays.copyOfRange(value, offset, offset+count);
+ this.value = Arrays.copyOfRange(value, offset, offset + count);
}
/**
@@ -262,11 +262,11 @@
// Pass 1: Compute precise size of char[]
int n = count;
for (int i = offset; i < end; i++) {
- int c = codePoints[i];
- if (Character.isBmpCodePoint(c))
- continue;
- else if (Character.isValidCodePoint(c))
- n++;
+ int c = codePoints[i];
+ if (Character.isBmpCodePoint(c))
+ continue;
+ else if (Character.isValidCodePoint(c))
+ n++;
else throw new IllegalArgumentException(Integer.toString(c));
}
@@ -327,7 +327,7 @@
@Deprecated
public String(byte ascii[], int hibyte, int offset, int count) {
checkBounds(ascii, offset, count);
- char value[] = new char[count];
+ char[] value = new char[count];
if (hibyte == 0) {
for (int i = count; i-- > 0;) {
@@ -465,7 +465,7 @@
if (charset == null)
throw new NullPointerException("charset");
checkBounds(bytes, offset, length);
- this.value = StringCoding.decode(charset, bytes, offset, length);
+ this.value = StringCoding.decode(charset, bytes, offset, length);
}
/**
@@ -567,7 +567,7 @@
*
* @since 1.1
*/
- public String(byte bytes[]) {
+ public String(byte[] bytes) {
this(bytes, 0, bytes.length);
}
@@ -983,11 +983,10 @@
return true;
}
if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = value.length;
- if (n == anotherString.value.length) {
- char v1[] = value;
- char v2[] = anotherString.value;
+ char[] v1 = value;
+ char[] v2 = ((String)anObject).value;
+ int n = v1.length;
+ if (n == v2.length) {
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
@@ -1020,8 +1019,8 @@
}
private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
- char v1[] = value;
- char v2[] = sb.getValue();
+ char[] v1 = value;
+ char[] v2 = sb.getValue();
int n = v1.length;
if (n != sb.length()) {
return false;
@@ -1066,7 +1065,7 @@
return equals(cs);
}
// Argument is a generic CharSequence
- char v1[] = value;
+ char[] v1 = value;
int n = v1.length;
if (n != cs.length()) {
return false;
@@ -1156,20 +1155,18 @@
* lexicographically greater than the string argument.
*/
public int compareTo(String anotherString) {
- int len1 = value.length;
- int len2 = anotherString.value.length;
+ char[] v1 = value;
+ char[] v2 = anotherString.value;
+ int len1 = v1.length;
+ int len2 = v2.length;
int lim = Math.min(len1, len2);
- char v1[] = value;
- char v2[] = anotherString.value;
- int k = 0;
- while (k < lim) {
+ for (int k = 0; k < lim; k++) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
- k++;
}
return len1 - len2;
}
@@ -1278,14 +1275,14 @@
*/
public boolean regionMatches(int toffset, String other, int ooffset,
int len) {
- char ta[] = value;
+ char[] ta = value;
int to = toffset;
- char pa[] = other.value;
+ char[] pa = other.value;
int po = ooffset;
// Note: toffset, ooffset, or len might be near -1>>>1.
if ((ooffset < 0) || (toffset < 0)
- || (toffset > (long)value.length - len)
- || (ooffset > (long)other.value.length - len)) {
+ || (toffset > (long)ta.length - len)
+ || (ooffset > (long)pa.length - len)) {
return false;
}
while (len-- > 0) {
@@ -1348,14 +1345,14 @@
*/
public boolean regionMatches(boolean ignoreCase, int toffset,
String other, int ooffset, int len) {
- char ta[] = value;
+ char[] ta = value;
int to = toffset;
- char pa[] = other.value;
+ char[] pa = other.value;
int po = ooffset;
// Note: toffset, ooffset, or len might be near -1>>>1.
if ((ooffset < 0) || (toffset < 0)
- || (toffset > (long)value.length - len)
- || (ooffset > (long)other.value.length - len)) {
+ || (toffset > (long)ta.length - len)
+ || (ooffset > (long)pa.length - len)) {
return false;
}
while (len-- > 0) {
@@ -1405,13 +1402,13 @@
* </pre>
*/
public boolean startsWith(String prefix, int toffset) {
- char ta[] = value;
+ char[] ta = value;
int to = toffset;
- char pa[] = prefix.value;
+ char[] pa = prefix.value;
int po = 0;
- int pc = prefix.value.length;
+ int pc = pa.length;
// Note: toffset might be near -1>>>1.
- if ((toffset < 0) || (toffset > value.length - pc)) {
+ if ((toffset < 0) || (toffset > ta.length - pc)) {
return false;
}
while (--pc >= 0) {
@@ -1473,7 +1470,9 @@
for (char v : value) {
h = 31 * h + v;
}
- hash = h;
+ if (h != 0) {
+ hash = h;
+ }
}
return h;
}
@@ -1928,14 +1927,17 @@
* length of this {@code String} object.
*/
public String substring(int beginIndex) {
- if (beginIndex < 0) {
- throw new StringIndexOutOfBoundsException(beginIndex);
+ if (beginIndex <= 0) {
+ if (beginIndex < 0) {
+ throw new StringIndexOutOfBoundsException(beginIndex);
+ }
+ return this;
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
- return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
+ return new String(value, beginIndex, subLen);
}
/**
@@ -1961,8 +1963,13 @@
* {@code endIndex}.
*/
public String substring(int beginIndex, int endIndex) {
- if (beginIndex < 0) {
- throw new StringIndexOutOfBoundsException(beginIndex);
+ if (beginIndex <= 0) {
+ if (beginIndex < 0) {
+ throw new StringIndexOutOfBoundsException(beginIndex);
+ }
+ if (endIndex == value.length) {
+ return this;
+ }
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
@@ -1971,8 +1978,7 @@
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
- return ((beginIndex == 0) && (endIndex == value.length)) ? this
- : new String(value, beginIndex, subLen);
+ return new String(value, beginIndex, subLen);
}
/**
@@ -2034,7 +2040,7 @@
return this;
}
int len = value.length;
- char buf[] = Arrays.copyOf(value, len + otherLen);
+ char[] buf = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
@@ -2070,9 +2076,9 @@
*/
public String replace(char oldChar, char newChar) {
if (oldChar != newChar) {
- int len = value.length;
+ char[] val = value; /* avoid getfield opcode */
+ int len = val.length;
int i = -1;
- char[] val = value; /* avoid getfield opcode */
while (++i < len) {
if (val[i] == oldChar) {
@@ -2080,7 +2086,7 @@
}
}
if (i < len) {
- char buf[] = new char[len];
+ char[] buf = new char[len];
for (int j = 0; j < i; j++) {
buf[j] = val[j];
}
@@ -2876,17 +2882,17 @@
* trailing white space.
*/
public String trim() {
- int len = value.length;
- int st = 0;
char[] val = value; /* avoid getfield opcode */
+ int end = val.length;
+ int beg = 0;
- while ((st < len) && (val[st] <= ' ')) {
- st++;
+ while ((beg < end) && (val[beg] <= ' ')) {
+ beg++;
}
- while ((st < len) && (val[len - 1] <= ' ')) {
- len--;
+ while ((beg < end) && (val[end - 1] <= ' ')) {
+ end--;
}
- return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
+ return substring(beg, end);
}
/**
@@ -3081,7 +3087,7 @@
*/
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
- char result[] = new char[value.length];
+ char[] result = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
@@ -3266,8 +3272,7 @@
* as its single character the argument {@code c}.
*/
public static String valueOf(char c) {
- char data[] = {c};
- return new String(data, true);
+ return new String(new char[]{c}, true);
}
/**
--- a/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/ProtectionDomain.java Fri May 22 09:50:33 2015 +0200
@@ -25,23 +25,24 @@
package java.security;
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import sun.misc.JavaSecurityAccess;
import sun.misc.JavaSecurityProtectionDomainAccess;
import static sun.misc.JavaSecurityProtectionDomainAccess.ProtectionDomainCache;
+import sun.misc.SharedSecrets;
import sun.security.util.Debug;
import sun.security.util.SecurityConstants;
-import sun.misc.JavaSecurityAccess;
-import sun.misc.SharedSecrets;
/**
- *
- *<p>
- * This ProtectionDomain class encapsulates the characteristics of a domain,
+ * The ProtectionDomain class encapsulates the characteristics of a domain,
* which encloses a set of classes whose instances are granted a set
* of permissions when being executed on behalf of a given set of Principals.
* <p>
@@ -58,6 +59,7 @@
*/
public class ProtectionDomain {
+
private static class JavaSecurityAccessImpl implements JavaSecurityAccess {
private JavaSecurityAccessImpl() {
@@ -86,18 +88,33 @@
AccessController.getContext(), context);
}
- private static AccessControlContext getCombinedACC(AccessControlContext context, AccessControlContext stack) {
- AccessControlContext acc = new AccessControlContext(context, stack.getCombiner(), true);
+ private static AccessControlContext getCombinedACC(
+ AccessControlContext context, AccessControlContext stack) {
+ AccessControlContext acc =
+ new AccessControlContext(context, stack.getCombiner(), true);
return new AccessControlContext(stack.getContext(), acc).optimize();
}
}
static {
- // Set up JavaSecurityAccess in SharedSecrets
+ // setup SharedSecrets to allow access to doIntersectionPrivilege
+ // methods and ProtectionDomain cache
SharedSecrets.setJavaSecurityAccess(new JavaSecurityAccessImpl());
+ SharedSecrets.setJavaSecurityProtectionDomainAccess(
+ new JavaSecurityProtectionDomainAccess() {
+ @Override
+ public ProtectionDomainCache getProtectionDomainCache() {
+ return new PDCache();
+ }
+ });
}
+ /**
+ * Used for storing ProtectionDomains as keys in a Map.
+ */
+ static final class Key {}
+
/* CodeSource */
private CodeSource codesource ;
@@ -451,40 +468,104 @@
}
/**
- * Used for storing ProtectionDomains as keys in a Map.
+ * A cache of ProtectionDomains and their Permissions.
+ *
+ * This class stores ProtectionDomains as weak keys in a ConcurrentHashMap
+ * with additional support for checking and removing weak keys that are no
+ * longer in use.
*/
- final static class Key {}
-
- // A cache of ProtectionDomains and their Permissions
private static class PDCache implements ProtectionDomainCache {
- // We must wrap the PermissionCollection in a WeakReference as there
- // are some PermissionCollections which contain strong references
- // back to a ProtectionDomain and otherwise would never be removed
- // from the WeakHashMap
- private final Map<Key, WeakReference<PermissionCollection>>
- map = new WeakHashMap<>();
+ private final ConcurrentHashMap<WeakProtectionDomainKey,
+ PermissionCollection>
+ pdMap = new ConcurrentHashMap<>();
+ private final ReferenceQueue<Key> queue = new ReferenceQueue<>();
@Override
- public synchronized void put(ProtectionDomain pd,
- PermissionCollection pc) {
- map.put(pd == null ? null : pd.key, new WeakReference<>(pc));
+ public void put(ProtectionDomain pd, PermissionCollection pc) {
+ processQueue(queue, pdMap);
+ WeakProtectionDomainKey weakPd =
+ new WeakProtectionDomainKey(pd, queue);
+ pdMap.putIfAbsent(weakPd, pc);
}
@Override
- public synchronized PermissionCollection get(ProtectionDomain pd) {
- WeakReference<PermissionCollection> ref =
- map.get(pd == null ? null : pd.key);
- return ref == null ? null : ref.get();
+ public PermissionCollection get(ProtectionDomain pd) {
+ processQueue(queue, pdMap);
+ WeakProtectionDomainKey weakPd =
+ new WeakProtectionDomainKey(pd, queue);
+ return pdMap.get(weakPd);
+ }
+
+ /**
+ * Removes weak keys from the map that have been enqueued
+ * on the reference queue and are no longer in use.
+ */
+ private static void processQueue(ReferenceQueue<Key> queue,
+ ConcurrentHashMap<? extends
+ WeakReference<Key>, ?> pdMap) {
+ Reference<? extends Key> ref;
+ while ((ref = queue.poll()) != null) {
+ pdMap.remove(ref);
+ }
}
}
- static {
- SharedSecrets.setJavaSecurityProtectionDomainAccess(
- new JavaSecurityProtectionDomainAccess() {
- @Override
- public ProtectionDomainCache getProtectionDomainCache() {
- return new PDCache();
- }
- });
+ /**
+ * A weak key for a ProtectionDomain.
+ */
+ private static class WeakProtectionDomainKey extends WeakReference<Key> {
+ /**
+ * Saved value of the referent's identity hash code, to maintain
+ * a consistent hash code after the referent has been cleared
+ */
+ private final int hash;
+
+ /**
+ * A key representing a null ProtectionDomain.
+ */
+ private static final Key NULL_KEY = new Key();
+
+ /**
+ * Create a new WeakProtectionDomain with the specified domain and
+ * registered with a queue.
+ */
+ WeakProtectionDomainKey(ProtectionDomain pd, ReferenceQueue<Key> rq) {
+ this((pd == null ? NULL_KEY : pd.key), rq);
+ }
+
+ private WeakProtectionDomainKey(Key key, ReferenceQueue<Key> rq) {
+ super(key, rq);
+ hash = key.hashCode();
+ }
+
+ /**
+ * Returns the identity hash code of the original referent.
+ */
+ @Override
+ public int hashCode() {
+ return hash;
+ }
+
+ /**
+ * Returns true if the given object is an identical
+ * WeakProtectionDomainKey instance, or, if this object's referent
+ * has not been cleared and the given object is another
+ * WeakProtectionDomainKey instance with an identical non-null
+ * referent as this one.
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this) {
+ return true;
+ }
+
+ if (obj instanceof WeakProtectionDomainKey) {
+ Object referent = get();
+ return (referent != null) &&
+ (referent == ((WeakProtectionDomainKey)obj).get());
+ } else {
+ return false;
+ }
+ }
}
}
--- a/jdk/src/java.base/share/classes/java/security/cert/LDAPCertStoreParameters.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/security/cert/LDAPCertStoreParameters.java Fri May 22 09:50:33 2015 +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
@@ -30,7 +30,12 @@
* <p>
* This class is used to provide necessary configuration parameters (server
* name and port number) to implementations of the LDAP {@code CertStore}
- * algorithm.
+ * algorithm. However, if you are retrieving certificates or CRLs from
+ * an ldap URI as specified by RFC 5280, use the
+ * {@link java.security.cert.URICertStoreParameters URICertStoreParameters}
+ * instead as the URI may contain additional information such as the
+ * distinguished name that will help the LDAP CertStore find the specific
+ * certificates and CRLs.
* <p>
* <b>Concurrent Access</b>
* <p>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/java/security/cert/URICertStoreParameters.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package java.security.cert;
+
+import java.net.URI;
+
+/**
+ * Parameters used as input for {@code CertStore} algorithms which use
+ * information contained in a URI to retrieve certificates and CRLs.
+ * <p>
+ * This class is used to provide necessary configuration parameters
+ * through a URI as defined in RFC 5280 to implementations of
+ * {@code CertStore} algorithms.
+ * <p>
+ * <b>Concurrent Access</b>
+ * <p>
+ * Unless otherwise specified, the methods defined in this class are not
+ * thread-safe. Multiple threads that need to access a single
+ * object concurrently should synchronize amongst themselves and
+ * provide the necessary locking. Multiple threads each manipulating
+ * separate objects need not synchronize.
+ *
+ * @since 1.9
+ * @see CertStore
+ * @see java.net.URI
+ */
+public final class URICertStoreParameters implements CertStoreParameters {
+
+ /**
+ * The uri, cannot be null
+ */
+ private final URI uri;
+
+ /*
+ * Hash code for this parameters.
+ */
+ private int myhash = -1;
+
+ /**
+ * Creates an instance of {@code URICertStoreParameters} with the
+ * specified URI.
+ *
+ * @param uri the URI which contains configuration information.
+ * @throws NullPointerException if {@code uri} is null
+ */
+ public URICertStoreParameters(URI uri) {
+ if (uri == null) {
+ throw new NullPointerException();
+ }
+ this.uri = uri;
+ }
+
+ /**
+ * Returns the URI used to construct this
+ * {@code URICertStoreParameters} object.
+ *
+ * @return the URI.
+ */
+ public URI getURI() {
+ return uri;
+ }
+
+ /**
+ * Returns a copy of this object. Changes to the copy will not affect
+ * the original and vice versa.
+ *
+ * @return the copy
+ */
+ @Override
+ public URICertStoreParameters clone() {
+ try {
+ return new URICertStoreParameters(uri);
+ } catch (NullPointerException e) {
+ /* Cannot happen */
+ throw new InternalError(e.toString(), e);
+ }
+ }
+
+ /**
+ * Returns a hash code value for this parameters object.
+ * The hash code is generated using the URI supplied at construction.
+ *
+ * @return a hash code value for this parameters.
+ */
+ @Override
+ public int hashCode() {
+ if (myhash == -1) {
+ myhash = uri.hashCode()*7;
+ }
+ return myhash;
+ }
+
+ /**
+ * Compares the specified object with this parameters object for equality.
+ * Two URICertStoreParameters are considered equal if the URIs used
+ * to construct them are equal.
+ *
+ * @param p the object to test for equality with this parameters.
+ *
+ * @return true if the specified object is equal to this parameters object.
+ */
+ @Override
+ public boolean equals(Object p) {
+ if (p == null || (!(p instanceof URICertStoreParameters))) {
+ return false;
+ }
+
+ if (p == this) {
+ return true;
+ }
+
+ URICertStoreParameters other = (URICertStoreParameters)p;
+ return uri.equals(other.getURI());
+ }
+
+ /**
+ * Returns a formatted string describing the parameters
+ * including the URI used to construct this object.
+ *
+ * @return a formatted string describing the parameters
+ */
+ @Override
+ public String toString() {
+ return "URICertStoreParameters: " + uri.toString();
+ }
+}
--- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java Fri May 22 09:50:33 2015 +0200
@@ -490,7 +490,7 @@
}
/**
- * Equality comparision between two
+ * Equality comparison between two
*/
public boolean equals(Object obj) {
if (obj == null) return false;
--- a/jdk/src/java.base/share/classes/java/util/ArrayPrefixHelpers.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/ArrayPrefixHelpers.java Fri May 22 09:50:33 2015 +0200
@@ -85,7 +85,7 @@
*
* As usual for this sort of utility, there are 4 versions, that
* are simple copy/paste/adapt variants of each other. (The
- * double and int versions differ from long version soley by
+ * double and int versions differ from long version solely by
* replacing "long" (with case-matching)).
*/
--- a/jdk/src/java.base/share/classes/java/util/Calendar.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Calendar.java Fri May 22 09:50:33 2015 +0200
@@ -1172,7 +1172,7 @@
* {@code fieldValuePairs} that are pairs of a field and its value.
* For example,
* <pre>
- * setFeilds(Calendar.YEAR, 2013,
+ * setFields(Calendar.YEAR, 2013,
* Calendar.MONTH, Calendar.DECEMBER,
* Calendar.DAY_OF_MONTH, 23);</pre>
* is equivalent to the sequence of the following
@@ -1298,7 +1298,7 @@
/**
* Sets the time zone parameter to the given {@code zone}. If no time
- * zone parameter is given to this {@code Caledar.Builder}, the
+ * zone parameter is given to this {@code Calendar.Builder}, the
* {@linkplain TimeZone#getDefault() default
* <code>TimeZone</code>} will be used in the {@link #build() build}
* method.
@@ -3316,7 +3316,7 @@
* @param field the calendar field
* @return the calendar field name
* @exception IndexOutOfBoundsException if <code>field</code> is negative,
- * equal to or greater then <code>FIELD_COUNT</code>.
+ * equal to or greater than {@code FIELD_COUNT}.
*/
static String getFieldName(int field) {
return FIELD_NAME[field];
--- a/jdk/src/java.base/share/classes/java/util/Collection.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Collection.java Fri May 22 09:50:33 2015 +0200
@@ -537,7 +537,7 @@
* @implSpec
* The default implementation creates a
* <em><a href="Spliterator.html#binding">late-binding</a></em> spliterator
- * from the collections's {@code Iterator}. The spliterator inherits the
+ * from the collection's {@code Iterator}. The spliterator inherits the
* <em>fail-fast</em> properties of the collection's iterator.
* <p>
* The created {@code Spliterator} reports {@link Spliterator#SIZED}.
--- a/jdk/src/java.base/share/classes/java/util/Locale.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Locale.java Fri May 22 09:50:33 2015 +0200
@@ -719,7 +719,7 @@
* created and cached.
*
* @param language lowercase 2 to 8 language code.
- * @param country uppercase two-letter ISO-3166 code and numric-3 UN M.49 area code.
+ * @param country uppercase two-letter ISO-3166 code and numeric-3 UN M.49 area code.
* @param variant vendor and browser specific code. See class description.
* @return the <code>Locale</code> instance requested
* @exception NullPointerException if any argument is null.
@@ -1236,7 +1236,7 @@
/**
* Package private method returning the Locale's LocaleExtensions,
* used by ResourceBundle.
- * @return locale exnteions of this Locale,
+ * @return locale extensions of this Locale,
* or {@code null} if no extensions are defined
*/
LocaleExtensions getLocaleExtensions() {
@@ -2609,7 +2609,7 @@
* href="./Locale.html#def_locale_extension">well-formed</a> or an exception
* is thrown.
*
- * <p>Attribute comparision for removal is case-insensitive.
+ * <p>Attribute comparison for removal is case-insensitive.
*
* @param attribute the attribute
* @return This builder.
--- a/jdk/src/java.base/share/classes/java/util/TimeZone.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/TimeZone.java Fri May 22 09:50:33 2015 +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
@@ -293,6 +293,7 @@
throw new NullPointerException();
}
this.ID = ID;
+ this.zoneId = null; // invalidate cache
}
/**
@@ -544,7 +545,23 @@
* @since 1.8
*/
public ZoneId toZoneId() {
+ ZoneId zId = zoneId;
+ if (zId == null) {
+ zoneId = zId = toZoneId0();
+ }
+ return zId;
+ }
+
+ private ZoneId toZoneId0() {
String id = getID();
+ TimeZone defaultZone = defaultTimeZone;
+ // are we not defaultTimeZone but our id is equal to default's?
+ if (defaultZone != this &&
+ defaultZone != null && id.equals(defaultZone.getID())) {
+ // delegate to default TZ which is effectively immutable
+ return defaultZone.toZoneId();
+ }
+ // derive it ourselves
if (ZoneInfoFile.useOldMapping() && id.length() == 3) {
if ("EST".equals(id))
return ZoneId.of("America/New_York");
@@ -710,7 +727,12 @@
sm.checkPermission(new PropertyPermission
("user.timezone", "write"));
}
- defaultTimeZone = zone;
+ // by saving a defensive clone and returning a clone in getDefault() too,
+ // the defaultTimeZone instance is isolated from user code which makes it
+ // effectively immutable. This is important to avoid races when the
+ // following is evaluated in ZoneId.systemDefault():
+ // TimeZone.getDefault().toZoneId().
+ defaultTimeZone = (zone == null) ? null : (TimeZone) zone.clone();
}
/**
@@ -735,9 +757,7 @@
public Object clone()
{
try {
- TimeZone other = (TimeZone) super.clone();
- other.ID = ID;
- return other;
+ return super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
@@ -759,6 +779,12 @@
* @serial
*/
private String ID;
+
+ /**
+ * Cached {@link ZoneId} for this TimeZone
+ */
+ private transient ZoneId zoneId;
+
private static volatile TimeZone defaultTimeZone;
static final String GMT_ID = "GMT";
--- a/jdk/src/java.base/share/classes/java/util/TreeMap.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/TreeMap.java Fri May 22 09:50:33 2015 +0200
@@ -859,7 +859,7 @@
* Returns a {@link Set} view of the mappings contained in this map.
*
* <p>The set's iterator returns the entries in ascending key order. The
- * sets's spliterator is
+ * set's spliterator is
* <em><a href="Spliterator.html#binding">late-binding</a></em>,
* <em>fail-fast</em>, and additionally reports {@link Spliterator#SORTED} and
* {@link Spliterator#ORDERED} with an encounter order that is ascending key
@@ -2643,7 +2643,7 @@
* child, also serving as origin for the split-off spliterator.
* Left-hands are symmetric. Descending versions place the origin
* at the end and invert ascending split rules. This base class
- * is non-commital about directionality, or whether the top-level
+ * is non-committal about directionality, or whether the top-level
* spliterator covers the whole tree. This means that the actual
* split mechanics are located in subclasses. Some of the subclass
* trySplit methods are identical (except for return types), but
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java Fri May 22 09:50:33 2015 +0200
@@ -481,7 +481,7 @@
*
* Maintaining API and serialization compatibility with previous
* versions of this class introduces several oddities. Mainly: We
- * leave untouched but unused constructor arguments refering to
+ * leave untouched but unused constructor arguments referring to
* concurrencyLevel. We accept a loadFactor constructor argument,
* but apply it only to initial table capacity (which is the only
* time that we can guarantee to honor it.) We also declare an
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java Fri May 22 09:50:33 2015 +0200
@@ -2710,7 +2710,7 @@
}
/**
- * Returns lowest absolute key (ignoring directonality).
+ * Returns lowest absolute key (ignoring directionality).
*/
K lowestKey() {
Comparator<? super K> cmp = m.comparator;
@@ -2722,7 +2722,7 @@
}
/**
- * Returns highest absolute key (ignoring directonality).
+ * Returns highest absolute key (ignoring directionality).
*/
K highestKey() {
Comparator<? super K> cmp = m.comparator;
--- a/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java Fri May 22 09:50:33 2015 +0200
@@ -1328,13 +1328,16 @@
/**
* Number of times to spin-wait before blocking. The spins (in
* awaitRunStateLock and awaitWork) currently use randomized
- * spins. If/when MWAIT-like intrinsics becomes available, they
- * may allow quieter spinning. The value of SPINS must be a power
- * of two, at least 4. The current value causes spinning for a
- * small fraction of typical context-switch times, well worthwhile
- * given the typical likelihoods that blocking is not necessary.
+ * spins. Currently set to zero to reduce CPU usage.
+ *
+ * If greater than zero the value of SPINS must be a power
+ * of two, at least 4. A value of 2048 causes spinning for a
+ * small fraction of typical context-switch times.
+ *
+ * If/when MWAIT-like intrinsics becomes available, they
+ * may allow quieter spinning.
*/
- private static final int SPINS = 1 << 11;
+ private static final int SPINS = 0;
/**
* Increment for seed generators. See class ThreadLocal for
--- a/jdk/src/java.base/share/classes/javax/crypto/interfaces/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/javax/crypto/interfaces/package.html Fri May 22 09:50:33 2015 +0200
@@ -47,8 +47,7 @@
<ul>
<li><a href=
"{@docRoot}/../technotes/guides/security/crypto/HowToImplAProvider.html">
- <b>How to Implement a Provider for the
- Java<FONT SIZE=-2><SUP>TM</SUP></FONT> Cryptography Architecture
+ <b>How to Implement a Provider for the Java™ Cryptography Architecture
</b></a></li>
</ul>
@@ -66,8 +65,7 @@
<li>
<a href=
"{@docRoot}/../technotes/guides/security/crypto/CryptoSpec.html">
- <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT>
- Cryptography Architecture API Specification and Reference
+ <b>Java™ Cryptography Architecture API Specification and Reference
</b></a></li>
</ul>
--- a/jdk/src/java.base/share/classes/javax/crypto/spec/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/javax/crypto/spec/package.html Fri May 22 09:50:33 2015 +0200
@@ -62,14 +62,13 @@
<li>
<a href=
"{@docRoot}/../technotes/guides/security/crypto/CryptoSpec.html">
- <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT>
- Cryptography Architecture API Specification and Reference
+ <b>Java™ Cryptography Architecture API Specification and Reference
</b></a></li>
<li>
<a href=
"{@docRoot}/../technotes/guides/security/crypto/HowToImplAProvider.html">
<b>How to Implement a Provider for the
- Java<FONT SIZE=-2><SUP>TM</SUP></FONT> Cryptography Architecture
+ Java™ Cryptography Architecture
</b></a></li>
</ul>
--- a/jdk/src/java.base/share/classes/javax/net/ssl/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/javax/net/ssl/package.html Fri May 22 09:50:33 2015 +0200
@@ -38,8 +38,7 @@
<ul>
<li><a href="{@docRoot}/../technotes/guides/security/StandardNames.html">
- <b>Java<FONT SIZE=-2><SUP>TM</SUP></FONT>
- Cryptography Architecture Standard Algorithm Name
+ <b>Java™ Cryptography Architecture Standard Algorithm Name
Documentation</b></a></li>
</ul>
--- a/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/Parser.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/Parser.java Fri May 22 09:50:33 2015 +0200
@@ -145,12 +145,12 @@
/**
* ASCII character type array.
*
- * This array maps an ASCII (7 bit) character to the character type.<br />
- * Possible character type values are:<br /> - ' ' for any kind of white
- * space character;<br /> - 'a' for any lower case alphabetical character
- * value;<br /> - 'A' for any upper case alphabetical character value;<br />
- * - 'd' for any decimal digit character value;<br /> - 'z' for any
- * character less then ' ' except '\t', '\n', '\r';<br /> An ASCII (7 bit)
+ * This array maps an ASCII (7 bit) character to the character type.<br>
+ * Possible character type values are:<br> - ' ' for any kind of white
+ * space character;<br> - 'a' for any lower case alphabetical character
+ * value;<br> - 'A' for any upper case alphabetical character value;<br>
+ * - 'd' for any decimal digit character value;<br> - 'z' for any
+ * character less than ' ' except '\t', '\n', '\r';<br> An ASCII (7 bit)
* character which does not fall in any category listed above is mapped to
* it self.
*/
@@ -158,11 +158,11 @@
/**
* NMTOKEN character type array.
*
- * This array maps an ASCII (7 bit) character to the character type.<br />
- * Possible character type values are:<br /> - 0 for underscore ('_') or any
- * lower and upper case alphabetical character value;<br /> - 1 for colon
- * (':') character;<br /> - 2 for dash ('-') and dot ('.') or any decimal
- * digit character value;<br /> - 3 for any kind of white space character<br
+ * This array maps an ASCII (7 bit) character to the character type.<br>
+ * Possible character type values are:<br> - 0 for underscore ('_') or any
+ * lower and upper case alphabetical character value;<br> - 1 for colon
+ * (':') character;<br> - 2 for dash ('-') and dot ('.') or any decimal
+ * digit character value;<br> - 3 for any kind of white space character<br
* /> An ASCII (7 bit) character which does not fall in any category listed
* above is mapped to 0xff.
*/
@@ -1841,10 +1841,12 @@
/**
* Reads an attribute value.
*
- * The grammar which this method can read is:<br />
- * <code>eqstr := S "=" qstr</code><br />
- * <code>qstr := S ("'" string "'") |
- * ('"' string '"')</code><br /> This method resolves entities
+ * The grammar this method can read is:
+ * <pre>{@code
+ * eqstr := S "=" qstr
+ * qstr := S ("'" string "'") | ('"' string '"')
+ * }</pre>
+ * This method resolves entities
* inside a string unless the parser parses DTD.
*
* @param flag The '=' character forces the method to accept the '='
@@ -2633,7 +2635,7 @@
* Reports characters and empties the parser's buffer. This method is called
* only if parser is going to return control to the main loop. This means
* that this method may use parser buffer to report white space without
- * copeing characters to temporary buffer.
+ * copying characters to temporary buffer.
*/
protected abstract void bflash()
throws Exception;
@@ -2642,7 +2644,7 @@
* Reports white space characters and empties the parser's buffer. This
* method is called only if parser is going to return control to the main
* loop. This means that this method may use parser buffer to report white
- * space without copeing characters to temporary buffer.
+ * space without copying characters to temporary buffer.
*/
protected abstract void bflash_ws()
throws Exception;
@@ -3290,16 +3292,20 @@
}
/**
- * Maps a character to it's type.
+ * Maps a character to its type.
*
- * Possible character type values are:<br /> - ' ' for any kind of white
- * space character;<br /> - 'a' for any lower case alphabetical character
- * value;<br /> - 'A' for any upper case alphabetical character value;<br />
- * - 'd' for any decimal digit character value;<br /> - 'z' for any
- * character less then ' ' except '\t', '\n', '\r';<br /> - 'X' for any not
- * ASCII character;<br /> - 'Z' for EOS character.<br /> An ASCII (7 bit)
- * character which does not fall in any category listed above is mapped to
- * it self.
+ * Possible character type values are:
+ * <ul>
+ * <li>' ' - for any kind of whitespace character;</li>
+ * <li>'a' - for any lower case alphabetical character value;</li>
+ * <li>'A' - for any upper case alphabetical character value;</li>
+ * <li>'d' - for any decimal digit character value;</li>
+ * <li>'z' - for any character less than ' ' except '\t', '\n', '\r';</li>
+ * <li>'X' - for any not ASCII character;</li>
+ * <li>'Z' - for EOS character.</li>
+ * </ul>
+ * An ASCII (7 bit) character which does not fall in any category
+ * listed above is mapped to itself.
*
* @param ch The character to map.
* @return The type of character.
--- a/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/ParserSAX.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/jdk/internal/util/xml/impl/ParserSAX.java Fri May 22 09:50:33 2015 +0200
@@ -649,7 +649,7 @@
* Reports characters and empties the parser's buffer. This method is called
* only if parser is going to return control to the main loop. This means
* that this method may use parser buffer to report white space without
- * copeing characters to temporary buffer.
+ * copying characters to temporary buffer.
*/
protected void bflash() throws SAXException {
if (mBuffIdx >= 0) {
@@ -663,7 +663,7 @@
* Reports white space characters and empties the parser's buffer. This
* method is called only if parser is going to return control to the main
* loop. This means that this method may use parser buffer to report white
- * space without copeing characters to temporary buffer.
+ * space without copying characters to temporary buffer.
*/
protected void bflash_ws() throws SAXException {
if (mBuffIdx >= 0) {
--- a/jdk/src/java.base/share/classes/sun/misc/Cache.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/Cache.java Fri May 22 09:50:33 2015 +0200
@@ -196,8 +196,8 @@
/**
* Gets the object associated with the specified key in the Cache.
* @param key the key in the hash table
- * @returns the element for the key or null if the key
- * is not defined in the hash table.
+ * @return the element for the key or null if the key
+ * is not defined in the hash table.
* @see Cache#put
*/
public synchronized Object get(Object key) {
--- a/jdk/src/java.base/share/classes/sun/misc/CharacterDecoder.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/CharacterDecoder.java Fri May 22 09:50:33 2015 +0200
@@ -120,7 +120,7 @@
/**
* This method does an actual decode. It takes the decoded bytes and
* writes them to the OutputStream. The integer <i>l</i> tells the
- * method how many bytes are required. This is always <= bytesPerAtom().
+ * method how many bytes are required. This is always {@literal <=} bytesPerAtom().
*/
protected void decodeAtom(PushbackInputStream aStream, OutputStream bStream, int l) throws IOException {
throw new CEStreamExhausted();
--- a/jdk/src/java.base/share/classes/sun/misc/CharacterEncoder.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/CharacterEncoder.java Fri May 22 09:50:33 2015 +0200
@@ -68,7 +68,7 @@
* referenced in the See Also list below.
*
* @author Chuck McManis
- * @see CharacterDecoder;
+ * @see CharacterDecoder
* @see UCEncoder
* @see UUEncoder
* @see BASE64Encoder
@@ -107,7 +107,7 @@
/**
* Encode the suffix that ends every output line. By default
- * this method just prints a <newline> into the output stream.
+ * this method just prints a newline into the output stream.
*/
protected void encodeLineSuffix(OutputStream aStream) throws IOException {
pStream.println();
--- a/jdk/src/java.base/share/classes/sun/misc/ConditionLock.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/ConditionLock.java Fri May 22 09:50:33 2015 +0200
@@ -34,7 +34,7 @@
* with the lock() and unlock() methods. However if there is a thread
* waiting for the state variable to become a particular value and you
* simply call Unlock(), that thread will not be able to acquire the
- * lock until the state variable equals its desired value. <p>
+ * lock until the state variable equals its desired value.
*
* @author Peter King
*/
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java Fri May 22 09:50:33 2015 +0200
@@ -45,26 +45,26 @@
import sun.net.www.ParseUtil;
/**
- * <p>
* This class checks dependent extensions a particular jar file may have
* declared through its manifest attributes.
- * </p>
+ * <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 :
- * key-Extension-Name: (Specification package name)
- * key-Specification-Version: (Specification-Version)
- * key-Implementation-Version: (Implementation-Version)
- * key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)
- * key-Implementation-Version: (Implementation version)
- * key-Implementation-URL: (URL to download the requested extension)
+ * 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.
- * </p>
*
* @deprecated this class will be removed in a future release.
* @author Jerome Dochez
@@ -76,10 +76,9 @@
private static Vector<ExtensionInstallationProvider> providers;
/**
- * <p>
* Register an ExtensionInstallationProvider. The provider is responsible
* for handling the installation (upgrade) of any missing extensions.
- * </p>
+ *
* @param eip ExtensionInstallationProvider implementation
*/
public synchronized static void addExtensionInstallationProvider
@@ -92,9 +91,7 @@
}
/**
- * <p>
* Unregister a previously installed installation provider
- * </p>
*/
public synchronized static void removeExtensionInstallationProvider
(ExtensionInstallationProvider eip)
@@ -103,10 +100,9 @@
}
/**
- * <p>
* Checks the dependencies of the jar file on installed extension.
- * </p>
- * @param jarFile containing the attriutes declaring the dependencies
+ *
+ * @param jar containing the attributes declaring the dependencies
*/
public static boolean checkExtensionsDependencies(JarFile jar)
{
@@ -182,9 +178,8 @@
/*
- * <p>
* Check that a particular dependency on an extension is satisfied.
- * </p>
+ *
* @param extensionName is the key used for the attributes in the manifest
* @param attr is the attributes of the manifest file
*
@@ -204,10 +199,9 @@
}
/*
- * <p>
* Check if a particular extension is part of the currently installed
* extensions.
- * </p>
+ *
* @param extensionName is the key for the attributes in the manifest
* @param attr is the attributes of the manifest
*
@@ -262,11 +256,9 @@
}
/*
- * <p>
* Check if the requested extension described by the attributes
* in the manifest under the key extensionName is compatible with
* the jar file.
- * </p>
*
* @param extensionName key in the attribute list
* @param attr manifest file attributes
@@ -337,10 +329,8 @@
}
/*
- * <p>
* An required extension is missing, if an ExtensionInstallationProvider is
* registered, delegate the installation of that particular extension to it.
- * </p>
*
* @param reqInfo Missing extension information
* @param instInfo Older installed version information
@@ -380,11 +370,9 @@
}
/**
- * <p>
* 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).
- * </p>
*
* @param extensionName extension name in the extension-list
*
@@ -428,9 +416,7 @@
}
/**
- * <p>
* @return the java.ext.dirs property as a list of directory
- * </p>
*/
private static File[] getExtDirs() {
String s = java.security.AccessController.doPrivileged(
@@ -456,9 +442,8 @@
}
/*
- * <p>
* Scan the directories and return all files installed in those
- * </p>
+ *
* @param dirs list of directories to scan
*
* @return the list of files installed in all the directories
@@ -483,9 +468,7 @@
}
/*
- * <p>
* @return the list of installed extensions jar files
- * </p>
*/
private File[] getInstalledExtensions() throws IOException {
return AccessController.doPrivileged(
@@ -503,9 +486,7 @@
}
/*
- * <p>
* Add the newly installed jar file to the extension class loader.
- * </p>
*
* @param cl the current installed extension class loader
*
--- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/ExtensionInfo.java Fri May 22 09:50:33 2015 +0200
@@ -45,9 +45,7 @@
public class ExtensionInfo {
/**
- * <p>
* public static values returned by the isCompatible method
- * </p>
*/
public static final int COMPATIBLE = 0;
public static final int REQUIRE_SPECIFICATION_UPGRADE = 1;
@@ -56,10 +54,8 @@
public static final int INCOMPATIBLE = 4;
/**
- * <p>
* attributes fully describer an extension. The underlying described
* extension may be installed and requested.
- * <p>
*/
public String title;
public String name;
@@ -76,15 +72,12 @@
/**
- * <p>
* Create a new uninitialized extension information object
- * </p>
*/
public ExtensionInfo() {
}
/**
- * <p>
* 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
@@ -93,7 +86,7 @@
* 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
- * <p>
+ *
* @param extensionKey unique extension key in the manifest
* @param attr Attributes of a manifest file
*/
@@ -149,13 +142,11 @@
}
/**
- * <p>
* @return true if the extension described by this extension information
* is compatible with the extension described by the extension
* information passed as a parameter
- * </p>
*
- * @param the requested extension information to compare to
+ * @param ei the requested extension information to compare to
*/
public int isCompatibleWith(ExtensionInfo ei) {
@@ -204,10 +195,8 @@
}
/**
- * <p>
* helper method to print sensible information on the undelying described
* extension
- * </p>
*/
public String toString() {
return "Extension : title(" + title + "), name(" + name + "), spec vendor(" +
@@ -217,15 +206,15 @@
}
/*
- * <p>
* helper method to compare two versions.
* version are in the x.y.z.t pattern.
- * </p>
+ *
* @param source version to compare to
* @param target version used to compare against
- * @return < 0 if source < version
- * > 0 if source > version
- * = 0 if source = version
+ * @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
@@ -238,15 +227,15 @@
/*
- * <p>
* helper method to compare two versions.
* version are in the x.y.z.t pattern.
- * </p>
+ *
* @param source version to compare to
* @param target version used to compare against
- * @return < 0 if source < version
- * > 0 if source > version
- * = 0 if source = version
+ * @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
--- a/jdk/src/java.base/share/classes/sun/misc/FDBigInteger.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/FDBigInteger.java Fri May 22 09:50:33 2015 +0200
@@ -384,8 +384,8 @@
* Retrieves the normalization bias of the <code>FDBigIntger</code>. The
* normalization bias is a left shift such that after it the highest word
* of the value will have the 4 highest bits equal to zero:
- * <code>(highestWord & 0xf0000000) == 0</code>, but the next bit should be 1
- * <code>(highestWord & 0x08000000) != 0</code>.
+ * {@code (highestWord & 0xf0000000) == 0}, but the next bit should be 1
+ * {@code (highestWord & 0x08000000) != 0}.
*
* @return The normalization bias.
*/
@@ -546,9 +546,9 @@
* We assume that S has been normalized, as above, and that
* "this" has been left-shifted accordingly.
* Also assumed, of course, is that the result, q, can be expressed
- * as an integer, 0 <= q < 10.
+ * as an integer, {@code 0 <= q < 10}.
*
- * @param The divisor of this <code>FDBigInteger</code>.
+ * @param S The divisor of this <code>FDBigInteger</code>.
* @return <code>q = (int)(this / S)</code>.
*/
/*@
@@ -685,7 +685,7 @@
*
* @param p5 The exponent of the power-of-five factor.
* @param p2 The exponent of the power-of-two factor.
- * @return
+ * @return The multiplication result.
*/
/*@
@ requires this.value() == 0 || p5 == 0 && p2 == 0;
@@ -931,11 +931,11 @@
/**
* Compares the parameter with this <code>FDBigInteger</code>. Returns an
* integer accordingly as:
- * <pre>
- * >0: this > other
- * 0: this == other
- * <0: this < other
- * </pre>
+ * <pre>{@code
+ * > 0: this > other
+ * 0: this == other
+ * < 0: this < other
+ * }</pre>
*
* @param other The <code>FDBigInteger</code> to compare.
* @return A negative value, zero, or a positive value according to the
@@ -974,11 +974,11 @@
* Compares this <code>FDBigInteger</code> with
* <code>5<sup>p5</sup> * 2<sup>p2</sup></code>.
* Returns an integer accordingly as:
- * <pre>
- * >0: this > other
- * 0: this == other
- * <0: this < other
- * </pre>
+ * <pre>{@code
+ * > 0: this > other
+ * 0: this == other
+ * < 0: this < other
+ * }</pre>
* @param p5 The exponent of the power-of-five factor.
* @param p2 The exponent of the power-of-two factor.
* @return A negative value, zero, or a positive value according to the
@@ -1011,11 +1011,11 @@
/**
* Compares this <code>FDBigInteger</code> with <code>x + y</code>. Returns a
* value according to the comparison as:
- * <pre>
+ * <pre>{@code
* -1: this < x + y
* 0: this == x + y
* 1: this > x + y
- * </pre>
+ * }</pre>
* @param x The first addend of the sum to compare.
* @param y The second addend of the sum to compare.
* @return -1, 0, or 1 according to the result of the comparison.
--- a/jdk/src/java.base/share/classes/sun/misc/FloatingDecimal.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/FloatingDecimal.java Fri May 22 09:50:33 2015 +0200
@@ -154,7 +154,7 @@
/**
* Indicates the sign of the value.
- * @return <code>value < 0.0</code>.
+ * @return {@code value < 0.0}.
*/
public boolean isNegative();
--- a/jdk/src/java.base/share/classes/sun/misc/IOUtils.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/IOUtils.java Fri May 22 09:50:33 2015 +0200
@@ -39,7 +39,7 @@
/**
* Read up to <code>length</code> of bytes from <code>in</code>
* until EOF is detected.
- * @param in input stream, must not be null
+ * @param is input stream, must not be null
* @param length number of bytes to read, -1 or Integer.MAX_VALUE means
* read as much as possible
* @param readAll if true, an EOFException will be thrown if not enough
--- a/jdk/src/java.base/share/classes/sun/misc/JarFilter.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/JarFilter.java Fri May 22 09:50:33 2015 +0200
@@ -29,10 +29,8 @@
import java.io.FilenameFilter;
/**
- * <p>
* This class checks that only jar and zip files are included in the file list.
* This class is used in extension installation support (ExtensionDependency).
- * <p>
*
* @deprecated this class will be removed in a future release.
* @author Michael Colburn
--- a/jdk/src/java.base/share/classes/sun/misc/JavaLangAccess.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/JavaLangAccess.java Fri May 22 09:50:33 2015 +0200
@@ -91,14 +91,14 @@
* may be added to the delete on exit list by the application shutdown
* hooks.
*
- * @params slot the slot in the shutdown hook array, whose element
- * will be invoked in order during shutdown
- * @params registerShutdownInProgress true to allow the hook
- * to be registered even if the shutdown is in progress.
- * @params hook the hook to be registered
+ * @param slot the slot in the shutdown hook array, whose element
+ * will be invoked in order during shutdown
+ * @param registerShutdownInProgress true to allow the hook
+ * to be registered even if the shutdown is in progress.
+ * @param hook the hook to be registered
*
- * @throw IllegalStateException if shutdown is in progress and
- * the slot is not valid to register.
+ * @throws IllegalStateException if shutdown is in progress and
+ * the slot is not valid to register.
*/
void registerShutdownHook(int slot, boolean registerShutdownInProgress, Runnable hook);
--- a/jdk/src/java.base/share/classes/sun/misc/Perf.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/Perf.java Fri May 22 09:50:33 2015 +0200
@@ -67,13 +67,13 @@
* <code>AccessController.doPrivileged(PrivilegedAction)</code>.
* <p> Here is a suggested idiom for use of this class:
*
- * <blockquote><pre>
+ * <blockquote><pre>{@code
* class MyTrustedClass {
* private static final Perf perf =
* AccessController.doPrivileged(new Perf.GetPerfAction<Perf>());
* ...
* }
- * </pre></blockquote>
+ * }</pre></blockquote>
* <p>
* In the presence of a security manager, the <code>MyTrustedClass</code>
* class in the above example will need to be granted the
@@ -171,8 +171,7 @@
* The attach mode specifies the access permissions requested for the
* instrumentation buffer of the target virtual machine. The permitted
* access permissions are:
- * <p>
- * <bl>
+ * <ul>
* <li>"r" - Read only access. This Java virtual machine has only
* read access to the instrumentation buffer for the target Java
* virtual machine.
@@ -180,7 +179,7 @@
* write access to the instrumentation buffer for the target Java virtual
* machine. This mode is currently not supported and is reserved for
* future enhancements.
- * </bl>
+ * </ul>
*
* @param lvmid an integer that uniquely identifies the
* target local Java virtual machine.
--- a/jdk/src/java.base/share/classes/sun/misc/PerfCounter.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/PerfCounter.java Fri May 22 09:50:33 2015 +0200
@@ -37,7 +37,7 @@
* The perf counters will be created in the jvmstat perf buffer
* that the HotSpot VM creates. The default size is 32K and thus
* the number of counters is bounded. You can alter the size
- * with -XX:PerfDataMemorySize=<bytes> option. If there is
+ * with {@code -XX:PerfDataMemorySize=<bytes>} option. If there is
* insufficient memory in the jvmstat perf buffer, the C heap memory
* will be used and thus the application will continue to run if
* the counters added exceeds the buffer size but the counters
--- a/jdk/src/java.base/share/classes/sun/misc/PerformanceLogger.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/PerformanceLogger.java Fri May 22 09:50:33 2015 +0200
@@ -51,10 +51,12 @@
* <P>
* To automatically track startup performance in an app or applet,
* use the command-line parameter sun.perflog as follows:<BR>
+ * <pre>{@code
* -Dsun.perflog[=file:<filename>]
+ * }</pre>
* <BR>
* where simply using the parameter with no value will enable output
- * to the console and a value of "file:<filename>" will cause
+ * to the console and a value of "{@code file:<filename>}" will cause
* that given filename to be created and used for all output.
* <P>
* By default, times are measured using System.currentTimeMillis(). To use
--- a/jdk/src/java.base/share/classes/sun/misc/Resource.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/Resource.java Fri May 22 09:50:33 2015 +0200
@@ -154,7 +154,8 @@
/**
* Returns the Resource data as a ByteBuffer, but only if the input stream
- * was implemented on top of a ByteBuffer. Return <tt>null</tt> otherwise.
+ * was implemented on top of a ByteBuffer. Return {@code null} otherwise.
+ * @return Resource data or null.
*/
public ByteBuffer getByteBuffer() throws IOException {
InputStream in = cachedInputStream();
--- a/jdk/src/java.base/share/classes/sun/misc/Signal.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/Signal.java Fri May 22 09:50:33 2015 +0200
@@ -50,7 +50,7 @@
* Signal objects are created based on their names. For example:
* <blockquote><pre>
* new Signal("INT");
- * </blockquote></pre>
+ * </pre></blockquote>
* constructs a signal object corresponding to <code>SIGINT</code>, which is
* typically produced when the user presses <code>Ctrl-C</code> at the command line.
* The <code>Signal</code> constructor throws <code>IllegalArgumentException</code>
@@ -64,7 +64,7 @@
* }
* };
* Signal.handle(new Signal("INT"), handler);
- * </blockquote></pre>
+ * </pre></blockquote>
*
* @author Sheng Liang
* @author Bill Shannon
@@ -149,7 +149,7 @@
*
* @param sig a signal
* @param handler the handler to be registered with the given signal.
- * @result the old handler
+ * @return the old handler
* @exception IllegalArgumentException the signal is in use by the VM
* @see sun.misc.Signal#raise(Signal sig)
* @see sun.misc.SignalHandler
--- a/jdk/src/java.base/share/classes/sun/misc/Unsafe.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/Unsafe.java Fri May 22 09:50:33 2015 +0200
@@ -641,9 +641,9 @@
* <li>String: any object (not just a java.lang.String)
* <li>InterfaceMethodRef: (NYI) a method handle to invoke on that call site's arguments
* </ul>
- * @params hostClass context for linkage, access control, protection domain, and class loader
- * @params data bytes of a class file
- * @params cpPatches where non-null entries exist, they replace corresponding CP entries in data
+ * @param hostClass context for linkage, access control, protection domain, and class loader
+ * @param data bytes of a class file
+ * @param cpPatches where non-null entries exist, they replace corresponding CP entries in data
*/
public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches);
@@ -808,9 +808,9 @@
* The system imposes a maximum of 3 samples, representing
* averages over the last 1, 5, and 15 minutes, respectively.
*
- * @params loadavg an array of double of size nelems
- * @params nelems the number of samples to be retrieved and
- * must be 1 to 3.
+ * @param loadavg an array of double of size nelems
+ * @param nelems the number of samples to be retrieved and
+ * must be 1 to 3.
*
* @return the number of samples actually retrieved; or -1
* if the load average is unobtainable.
@@ -1108,7 +1108,6 @@
* <p>
* 8-byte atomicity is only guaranteed on platforms on which
* support atomic accesses to longs.
- * <p>
*
* @param o Java heap object in which the value resides, if any, else
* null
--- a/jdk/src/java.base/share/classes/sun/misc/VM.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/VM.java Fri May 22 09:50:33 2015 +0200
@@ -315,7 +315,7 @@
}
/*
- * Add <tt>n</tt> to the objects pending for finalization count.
+ * Add {@code n} to the objects pending for finalization count.
*
* @param n an integer value to be added to the objects pending
* for finalization count
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_de.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_de.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_de extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_es.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_es.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_es extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_fr.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_fr.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_fr extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_it.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_it.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_it extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ja.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ja.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_ja extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ko.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_ko.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_ko extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_pt_BR.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_pt_BR.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_pt_BR extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_sv.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_sv.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_sv extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_CN.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_CN.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_zh_CN extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_TW.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/misc/resources/Messages_zh_TW.java Fri May 22 09:50:33 2015 +0200
@@ -26,7 +26,7 @@
package sun.misc.resources;
/**
- * <p> This class represents the <code>ResourceBundle</code>
+ * This class represents the {@code ResourceBundle}
* for sun.misc.
*
* @author Michael Colburn
@@ -35,9 +35,9 @@
public class Messages_zh_TW extends java.util.ListResourceBundle {
/**
- * Returns the contents of this <code>ResourceBundle</code>.
- * <p>
- * @return the contents of this <code>ResourceBundle</code>.
+ * Returns the contents of this {@code ResourceBundle}.
+ *
+ * @return the contents of this {@code ResourceBundle}.
*/
public Object[][] getContents() {
return contents;
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Fri May 22 09:50:33 2015 +0200
@@ -983,7 +983,7 @@
SocketPermission p = URLtoSocketPermission(this.url);
if (p != null) {
try {
- AccessController.doPrivileged(
+ AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public Void run() throws IOException {
plainConnect0();
@@ -1244,7 +1244,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public OutputStream run() throws IOException {
return getOutputStream0();
@@ -1422,7 +1422,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public InputStream run() throws IOException {
return getInputStream0();
@@ -2565,7 +2565,7 @@
if (p != null) {
try {
- return AccessController.doPrivileged(
+ return AccessController.doPrivilegedWithCombiner(
new PrivilegedExceptionAction<>() {
public Boolean run() throws IOException {
return followRedirect0(loc, stat, locUrl0);
--- a/jdk/src/java.base/share/classes/sun/nio/cs/HKSCS.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/HKSCS.java Fri May 22 09:50:33 2015 +0200
@@ -378,7 +378,6 @@
dst[dp++] = repl[1];
continue;
}
- sp++;
}
if (bb > MAX_SINGLEBYTE) { // DoubleByte
dst[dp++] = (byte)(bb >> 8);
--- a/jdk/src/java.base/share/classes/sun/nio/cs/Surrogate.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/nio/cs/Surrogate.java Fri May 22 09:50:33 2015 +0200
@@ -175,10 +175,10 @@
* @param in The source buffer, from which one more character
* will be consumed if c is a high surrogate
*
- * @returns Either a parsed UCS-4 character, in which case the isPair()
- * and increment() methods will return meaningful values, or
- * -1, in which case error() will return a descriptive result
- * object
+ * @return Either a parsed UCS-4 character, in which case the isPair()
+ * and increment() methods will return meaningful values, or
+ * -1, in which case error() will return a descriptive result
+ * object
*/
public int parse(char c, CharBuffer in) {
if (Character.isHighSurrogate(c)) {
@@ -216,10 +216,10 @@
* @param ip The input index
* @param il The input limit
*
- * @returns Either a parsed UCS-4 character, in which case the isPair()
- * and increment() methods will return meaningful values, or
- * -1, in which case error() will return a descriptive result
- * object
+ * @return Either a parsed UCS-4 character, in which case the isPair()
+ * and increment() methods will return meaningful values, or
+ * -1, in which case error() will return a descriptive result
+ * object
*/
public int parse(char c, char[] ia, int ip, int il) {
assert (ia[ip] == c);
@@ -280,9 +280,9 @@
* @param dst The destination buffer, to which one or two UTF-16
* characters will be written
*
- * @returns Either a positive count of the number of UTF-16 characters
- * written to the destination buffer, or -1, in which case
- * error() will return a descriptive result object
+ * @return Either a positive count of the number of UTF-16 characters
+ * written to the destination buffer, or -1, in which case
+ * error() will return a descriptive result object
*/
public int generate(int uc, int len, CharBuffer dst) {
if (Character.isBmpCodePoint(uc)) {
@@ -325,9 +325,9 @@
* @param dp The destination position
* @param dl The destination limit
*
- * @returns Either a positive count of the number of UTF-16 characters
- * written to the destination buffer, or -1, in which case
- * error() will return a descriptive result object
+ * @return Either a positive count of the number of UTF-16 characters
+ * written to the destination buffer, or -1, in which case
+ * error() will return a descriptive result object
*/
public int generate(int uc, int len, char[] da, int dp, int dl) {
if (Character.isBmpCodePoint(uc)) {
--- a/jdk/src/java.base/share/classes/sun/security/provider/SunEntries.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SunEntries.java Fri May 22 09:50:33 2015 +0200
@@ -67,10 +67,6 @@
* in RFC 5280. The ValidationAlgorithm attribute notes the
* specification that this provider implements.
*
- * - LDAP is the CertStore type for LDAP repositories. The
- * LDAPSchema attribute notes the specification defining the
- * schema that this provider uses to find certificates and CRLs.
- *
* - JavaPolicy is the default file-based Policy type.
*
* - JavaLoginConfig is the default file-based LoginModule Configuration type.
@@ -275,9 +271,6 @@
/*
* CertStores
*/
- map.put("CertStore.LDAP",
- "sun.security.provider.certpath.ldap.LDAPCertStore");
- map.put("CertStore.LDAP LDAPSchema", "RFC2587");
map.put("CertStore.Collection",
"sun.security.provider.certpath.CollectionCertStore");
map.put("CertStore.com.sun.security.IndexedCollection",
@@ -310,7 +303,6 @@
map.put("KeyStore.JKS ImplementedIn", "Software");
map.put("CertPathValidator.PKIX ImplementedIn", "Software");
map.put("CertPathBuilder.PKIX ImplementedIn", "Software");
- map.put("CertStore.LDAP ImplementedIn", "Software");
map.put("CertStore.Collection ImplementedIn", "Software");
map.put("CertStore.com.sun.security.IndexedCollection ImplementedIn",
"Software");
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/CertStoreHelper.java Thu May 21 18:23:01 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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.security.provider.certpath;
-
-import java.net.URI;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.security.AccessController;
-import java.security.NoSuchAlgorithmException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
-import java.security.cert.CertStore;
-import java.security.cert.CertStoreException;
-import java.security.cert.X509CertSelector;
-import java.security.cert.X509CRLSelector;
-import javax.security.auth.x500.X500Principal;
-import java.io.IOException;
-
-import sun.security.util.Cache;
-
-/**
- * Helper used by URICertStore and others when delegating to another CertStore
- * to fetch certs and CRLs.
- */
-
-public abstract class CertStoreHelper {
-
- private static final int NUM_TYPES = 2;
- private final static Map<String,String> classMap = new HashMap<>(NUM_TYPES);
- static {
- classMap.put(
- "LDAP",
- "sun.security.provider.certpath.ldap.LDAPCertStoreHelper");
- classMap.put(
- "SSLServer",
- "sun.security.provider.certpath.ssl.SSLServerCertStoreHelper");
- };
- private static Cache<String, CertStoreHelper> cache
- = Cache.newSoftMemoryCache(NUM_TYPES);
-
- public static CertStoreHelper getInstance(final String type)
- throws NoSuchAlgorithmException
- {
- CertStoreHelper helper = cache.get(type);
- if (helper != null) {
- return helper;
- }
- final String cl = classMap.get(type);
- if (cl == null) {
- throw new NoSuchAlgorithmException(type + " not available");
- }
- try {
- helper = AccessController.doPrivileged(
- new PrivilegedExceptionAction<CertStoreHelper>() {
- public CertStoreHelper run() throws ClassNotFoundException {
- try {
- Class<?> c = Class.forName(cl, true, null);
- CertStoreHelper csh
- = (CertStoreHelper)c.newInstance();
- cache.put(type, csh);
- return csh;
- } catch (InstantiationException |
- IllegalAccessException e) {
- throw new AssertionError(e);
- }
- }
- });
- return helper;
- } catch (PrivilegedActionException e) {
- throw new NoSuchAlgorithmException(type + " not available",
- e.getException());
- }
- }
-
- static boolean isCausedByNetworkIssue(String type, CertStoreException cse) {
- switch (type) {
- case "LDAP":
- case "SSLServer":
- try {
- CertStoreHelper csh = CertStoreHelper.getInstance(type);
- return csh.isCausedByNetworkIssue(cse);
- } catch (NoSuchAlgorithmException nsae) {
- return false;
- }
- case "URI":
- Throwable t = cse.getCause();
- return (t != null && t instanceof IOException);
- default:
- // we don't know about any other remote CertStore types
- return false;
- }
- }
-
- /**
- * Returns a CertStore using the given URI as parameters.
- */
- public abstract CertStore getCertStore(URI uri)
- throws NoSuchAlgorithmException, InvalidAlgorithmParameterException;
-
- /**
- * Wraps an existing X509CertSelector when needing to avoid DN matching
- * issues.
- */
- public abstract X509CertSelector wrap(X509CertSelector selector,
- X500Principal certSubject,
- String dn)
- throws IOException;
-
- /**
- * Wraps an existing X509CRLSelector when needing to avoid DN matching
- * issues.
- */
- public abstract X509CRLSelector wrap(X509CRLSelector selector,
- Collection<X500Principal> certIssuers,
- String dn)
- throws IOException;
-
- /**
- * Returns true if the cause of the CertStoreException is a network
- * related issue.
- */
- public abstract boolean isCausedByNetworkIssue(CertStoreException e);
-}
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/RevocationChecker.java Fri May 22 09:50:33 2015 +0200
@@ -466,6 +466,34 @@
stackedCerts, params.trustAnchors());
}
+ static boolean isCausedByNetworkIssue(String type, CertStoreException cse) {
+ boolean result;
+ Throwable t = cse.getCause();
+
+ switch (type) {
+ case "LDAP":
+ if (t != null) {
+ // These two exception classes are inside java.naming module
+ String cn = t.getClass().getName();
+ result = (cn.equals("javax.naming.ServiceUnavailableException") ||
+ cn.equals("javax.naming.CommunicationException"));
+ } else {
+ result = false;
+ }
+ break;
+ case "SSLServer":
+ result = (t != null && t instanceof IOException);
+ break;
+ case "URI":
+ result = (t != null && t instanceof IOException);
+ break;
+ default:
+ // we don't know about any other remote CertStore types
+ return false;
+ }
+ return result;
+ }
+
private void checkCRLs(X509Certificate cert, PublicKey prevKey,
X509Certificate prevCert, boolean signFlag,
boolean allowSeparateKey,
@@ -510,7 +538,7 @@
"CertStoreException: " + e.getMessage());
}
if (networkFailureException == null &&
- CertStoreHelper.isCausedByNetworkIssue(store.getType(),e)) {
+ isCausedByNetworkIssue(store.getType(),e)) {
// save this exception, we may need to throw it later
networkFailureException = new CertPathValidatorException(
"Unable to determine revocation status due to " +
@@ -557,8 +585,7 @@
} catch (CertStoreException e) {
if (e instanceof CertStoreTypeException) {
CertStoreTypeException cste = (CertStoreTypeException)e;
- if (CertStoreHelper.isCausedByNetworkIssue(cste.getType(),
- e)) {
+ if (isCausedByNetworkIssue(cste.getType(), e)) {
throw new CertPathValidatorException(
"Unable to determine revocation status due to " +
"network error", e, null, -1,
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/URICertStore.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,6 +42,7 @@
import java.security.cert.CertStoreSpi;
import java.security.cert.CRLException;
import java.security.cert.CRLSelector;
+import java.security.cert.URICertStoreParameters;
import java.security.cert.X509Certificate;
import java.security.cert.X509CertSelector;
import java.security.cert.X509CRL;
@@ -118,9 +119,7 @@
// true if URI is ldap
private boolean ldap = false;
- private CertStoreHelper ldapHelper;
private CertStore ldapCertStore;
- private String ldapPath;
// Default maximum connect timeout in milliseconds (15 seconds)
// allowed when downloading CRLs
@@ -165,13 +164,8 @@
// if ldap URI, use an LDAPCertStore to fetch certs and CRLs
if (uri.getScheme().toLowerCase(Locale.ENGLISH).equals("ldap")) {
ldap = true;
- ldapHelper = CertStoreHelper.getInstance("LDAP");
- ldapCertStore = ldapHelper.getCertStore(uri);
- ldapPath = uri.getPath();
- // strip off leading '/'
- if (ldapPath.charAt(0) == '/') {
- ldapPath = ldapPath.substring(1);
- }
+ URICertStoreParameters lparams = new URICertStoreParameters(uri);
+ ldapCertStore = CertStore.getInstance("LDAP", lparams);
}
try {
factory = CertificateFactory.getInstance("X.509");
@@ -246,20 +240,10 @@
public synchronized Collection<X509Certificate> engineGetCertificates
(CertSelector selector) throws CertStoreException {
- // if ldap URI we wrap the CertSelector in an LDAPCertSelector to
- // avoid LDAP DN matching issues (see LDAPCertSelector for more info)
if (ldap) {
- X509CertSelector xsel = (X509CertSelector) selector;
- try {
- xsel = ldapHelper.wrap(xsel, xsel.getSubject(), ldapPath);
- } catch (IOException ioe) {
- throw new CertStoreException(ioe);
- }
- // Fetch the certificates via LDAP. LDAPCertStore has its own
// caching mechanism, see the class description for more info.
- // Safe cast since xsel is an X509 certificate selector.
return (Collection<X509Certificate>)
- ldapCertStore.getCertificates(xsel);
+ ldapCertStore.getCertificates(selector);
}
// Return the Certificates for this entry. It returns the cached value
@@ -356,20 +340,11 @@
public synchronized Collection<X509CRL> engineGetCRLs(CRLSelector selector)
throws CertStoreException {
- // if ldap URI we wrap the CRLSelector in an LDAPCRLSelector to
- // avoid LDAP DN matching issues (see LDAPCRLSelector for more info)
if (ldap) {
- X509CRLSelector xsel = (X509CRLSelector) selector;
- try {
- xsel = ldapHelper.wrap(xsel, null, ldapPath);
- } catch (IOException ioe) {
- throw new CertStoreException(ioe);
- }
// Fetch the CRLs via LDAP. LDAPCertStore has its own
// caching mechanism, see the class description for more info.
- // Safe cast since xsel is an X509 certificate selector.
try {
- return (Collection<X509CRL>) ldapCertStore.getCRLs(xsel);
+ return (Collection<X509CRL>) ldapCertStore.getCRLs(selector);
} catch (CertStoreException cse) {
throw new PKIX.CertStoreTypeException("LDAP", cse);
}
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/ssl/SSLServerCertStore.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/certpath/ssl/SSLServerCertStore.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 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
@@ -153,7 +153,7 @@
throw new UnsupportedOperationException();
}
- static CertStore getInstance(URI uri)
+ public static CertStore getInstance(URI uri)
throws InvalidAlgorithmParameterException
{
return new CS(new SSLServerCertStore(uri), null, "SSLServer", null);
--- a/jdk/src/java.base/share/classes/sun/security/provider/certpath/ssl/SSLServerCertStoreHelper.java Thu May 21 18:23:01 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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.security.provider.certpath.ssl;
-
-import java.io.IOException;
-import java.net.URI;
-import java.security.NoSuchAlgorithmException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.cert.CertStore;
-import java.security.cert.CertStoreException;
-import java.security.cert.X509CertSelector;
-import java.security.cert.X509CRLSelector;
-import java.util.Collection;
-import javax.security.auth.x500.X500Principal;
-
-import sun.security.provider.certpath.CertStoreHelper;
-
-/**
- * SSL implementation of CertStoreHelper.
- */
-public final class SSLServerCertStoreHelper extends CertStoreHelper {
-
- @Override
- public CertStore getCertStore(URI uri)
- throws NoSuchAlgorithmException, InvalidAlgorithmParameterException
- {
- return SSLServerCertStore.getInstance(uri);
- }
-
- @Override
- public X509CertSelector wrap(X509CertSelector selector,
- X500Principal certSubject,
- String ldapDN)
- throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public X509CRLSelector wrap(X509CRLSelector selector,
- Collection<X500Principal> certIssuers,
- String ldapDN)
- throws IOException
- {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isCausedByNetworkIssue(CertStoreException e) {
- Throwable t = e.getCause();
- return (t != null && t instanceof IOException);
- }
-}
--- a/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/tools/keytool/Main.java Fri May 22 09:50:33 2015 +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
@@ -46,6 +46,9 @@
import java.security.cert.CRL;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateException;
+import java.security.cert.URICertStoreParameters;
+
+
import java.text.Collator;
import java.text.MessageFormat;
import java.util.*;
@@ -69,7 +72,7 @@
import sun.security.pkcs10.PKCS10;
import sun.security.pkcs10.PKCS10Attribute;
import sun.security.provider.X509Factory;
-import sun.security.provider.certpath.CertStoreHelper;
+import sun.security.provider.certpath.ssl.SSLServerCertStore;
import sun.security.util.Password;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
@@ -2208,14 +2211,10 @@
}
}
} else { // must be LDAP, and uri is not null
- // Lazily load LDAPCertStoreHelper if present
- CertStoreHelper helper = CertStoreHelper.getInstance("LDAP");
- String path = uri.getPath();
- if (path.charAt(0) == '/') path = path.substring(1);
- CertStore s = helper.getCertStore(uri);
- X509CRLSelector sel =
- helper.wrap(new X509CRLSelector(), null, path);
- return s.getCRLs(sel);
+ URICertStoreParameters params =
+ new URICertStoreParameters(uri);
+ CertStore s = CertStore.getInstance("LDAP", params);
+ return s.getCRLs(new X509CRLSelector());
}
}
@@ -2463,9 +2462,7 @@
out.println(rb.getString("Not.a.signed.jar.file"));
}
} else if (sslserver != null) {
- // Lazily load SSLCertStoreHelper if present
- CertStoreHelper helper = CertStoreHelper.getInstance("SSLServer");
- CertStore cs = helper.getCertStore(new URI("https://" + sslserver));
+ CertStore cs = SSLServerCertStore.getInstance(new URI("https://" + sslserver));
Collection<? extends Certificate> chain;
try {
chain = cs.getCertificates(null);
--- a/jdk/src/java.base/share/classes/sun/security/x509/AVA.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AVA.java Fri May 22 09:50:33 2015 +0200
@@ -454,7 +454,7 @@
if (embeddedHex.size() > 0) {
// add space(s) before embedded hex bytes
for (int i = 0; i < spaceCount; i++) {
- temp.append(" ");
+ temp.append(' ');
}
spaceCount = 0;
@@ -472,7 +472,7 @@
} else {
// add space(s)
for (int i = 0; i < spaceCount; i++) {
- temp.append(" ");
+ temp.append(' ');
}
spaceCount = 0;
temp.append((char)c);
@@ -853,7 +853,7 @@
}
sbuffer.append(c);
}
- typeAndValue.append(sbuffer.toString());
+ typeAndValue.append(sbuffer);
}
return typeAndValue.toString();
}
@@ -1039,7 +1039,7 @@
StringBuilder retval = new StringBuilder(40);
retval.append(keyword);
- retval.append("=");
+ retval.append('=');
try {
String valStr = value.getAsString();
@@ -1147,9 +1147,11 @@
// Emit the string ... quote it if needed
// if string is already quoted, don't re-quote
if (!alreadyQuoted && quoteNeeded) {
- retval.append("\"" + sbuffer.toString() + "\"");
+ retval.append('\"')
+ .append(sbuffer)
+ .append('\"');
} else {
- retval.append(sbuffer.toString());
+ retval.append(sbuffer);
}
}
} catch (IOException e) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/AuthorityKeyIdentifierExtension.java Fri May 22 09:50:33 2015 +0200
@@ -196,17 +196,20 @@
* Return the object as a string.
*/
public String toString() {
- String s = super.toString() + "AuthorityKeyIdentifier [\n";
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("AuthorityKeyIdentifier [\n");
if (id != null) {
- s += id.toString(); // id already has a newline
+ sb.append(id); // id already has a newline
}
if (names != null) {
- s += names.toString() + "\n";
+ sb.append(names).append('\n');
}
if (serialNum != null) {
- s += serialNum.toString() + "\n";
+ sb.append(serialNum).append('\n');
}
- return (s + "]\n");
+ sb.append("]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/BasicConstraintsExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/BasicConstraintsExtension.java Fri May 22 09:50:33 2015 +0200
@@ -171,15 +171,11 @@
* Return user readable form of extension.
*/
public String toString() {
- String s = super.toString() + "BasicConstraints:[\n";
-
- s += ((ca) ? (" CA:true") : (" CA:false")) + "\n";
- if (pathLen >= 0) {
- s += " PathLen:" + pathLen + "\n";
- } else {
- s += " PathLen: undefined\n";
- }
- return (s + "]\n");
+ return super.toString() +
+ "BasicConstraints:[\n CA:" + ca +
+ "\n PathLen:" +
+ ((pathLen >= 0) ? String.valueOf(pathLen) : " undefined") +
+ "\n]\n";
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/CRLDistributionPointsExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CRLDistributionPointsExtension.java Fri May 22 09:50:33 2015 +0200
@@ -231,8 +231,8 @@
distributionPoints = (List<DistributionPoint>)obj;
} else {
throw new IOException("Attribute name [" + name +
- "] not recognized by " +
- "CertAttrSet:" + extensionName + ".");
+ "] not recognized by " +
+ "CertAttrSet:" + extensionName + '.');
}
encodeThis();
}
@@ -245,8 +245,8 @@
return distributionPoints;
} else {
throw new IOException("Attribute name [" + name +
- "] not recognized by " +
- "CertAttrSet:" + extensionName + ".");
+ "] not recognized by " +
+ "CertAttrSet:" + extensionName + '.');
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/CRLNumberExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CRLNumberExtension.java Fri May 22 09:50:33 2015 +0200
@@ -146,8 +146,8 @@
}
crlNumber = (BigInteger)obj;
} else {
- throw new IOException("Attribute name not recognized by"
- + " CertAttrSet:" + extensionName + ".");
+ throw new IOException("Attribute name not recognized by" +
+ " CertAttrSet:" + extensionName + '.');
}
encodeThis();
}
@@ -172,8 +172,8 @@
if (name.equalsIgnoreCase(NUMBER)) {
crlNumber = null;
} else {
- throw new IOException("Attribute name not recognized by"
- + " CertAttrSet:" + extensionName + ".");
+ throw new IOException("Attribute name not recognized by" +
+ " CertAttrSet:" + extensionName + '.');
}
encodeThis();
}
@@ -182,10 +182,15 @@
* Returns a printable representation of the CRLNumberExtension.
*/
public String toString() {
- String s = super.toString() + extensionLabel + ": " +
- ((crlNumber == null) ? "" : Debug.toHexString(crlNumber))
- + "\n";
- return (s);
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append(extensionLabel)
+ .append(": ");
+ if (crlNumber != null) {
+ sb.append(Debug.toHexString(crlNumber));
+ }
+ sb.append('\n');
+ return sb.toString();
}
/**
@@ -195,7 +200,7 @@
* @exception IOException on encoding errors.
*/
public void encode(OutputStream out) throws IOException {
- DerOutputStream tmp = new DerOutputStream();
+ DerOutputStream tmp = new DerOutputStream();
encode(out, PKIXExtensions.CRLNumber_Id, true);
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertException.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertException.java Fri May 22 09:50:33 2015 +0200
@@ -158,7 +158,7 @@
*/
public String toString()
{
- return "[Certificate Exception: " + getMessage() + "]";
+ return "[Certificate Exception: " + getMessage() + ']';
}
/**
@@ -168,6 +168,6 @@
{
return getVerfDescription()
+ ( (moreData != null)
- ? ( "\n (" + moreData + ")" ) : "" );
+ ? ( "\n (" + moreData + ')' ) : "" );
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertificatePoliciesExtension.java Fri May 22 09:50:33 2015 +0200
@@ -160,10 +160,12 @@
if (certPolicies == null) {
return "";
}
- StringBuilder sb = new StringBuilder(super.toString());
- sb.append("CertificatePolicies [\n");
+
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("CertificatePolicies [\n");
for (PolicyInformation info : certPolicies) {
- sb.append(info.toString());
+ sb.append(info);
}
sb.append("]\n");
return sb.toString();
--- a/jdk/src/java.base/share/classes/sun/security/x509/CertificateValidity.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/CertificateValidity.java Fri May 22 09:50:33 2015 +0200
@@ -134,8 +134,8 @@
public String toString() {
if (notBefore == null || notAfter == null)
return "";
- return ("Validity: [From: " + notBefore.toString() +
- ",\n To: " + notAfter.toString() + "]");
+ return "Validity: [From: " + notBefore +
+ ",\n To: " + notAfter + ']';
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/DistributionPoint.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/DistributionPoint.java Fri May 22 09:50:33 2015 +0200
@@ -380,23 +380,29 @@
*/
public String toString() {
StringBuilder sb = new StringBuilder();
+ sb.append("DistributionPoint:\n ");
if (fullName != null) {
- sb.append("DistributionPoint:\n " + fullName + "\n");
+ sb.append(fullName);
}
if (relativeName != null) {
- sb.append("DistributionPoint:\n " + relativeName + "\n");
+ sb.append(relativeName);
}
+ sb.append('\n');
if (reasonFlags != null) {
sb.append(" ReasonFlags:\n");
for (int i = 0; i < reasonFlags.length; i++) {
if (reasonFlags[i]) {
- sb.append(" " + reasonToString(i) + "\n");
+ sb.append(" ")
+ .append(reasonToString(i))
+ .append('\n');
}
}
}
if (crlIssuer != null) {
- sb.append(" CRLIssuer:" + crlIssuer + "\n");
+ sb.append(" CRLIssuer:")
+ .append(crlIssuer)
+ .append('\n');
}
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/DistributionPointName.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/DistributionPointName.java Fri May 22 09:50:33 2015 +0200
@@ -230,13 +230,13 @@
*/
public String toString() {
StringBuilder sb = new StringBuilder();
+ sb.append("DistributionPointName:\n ");
if (fullName != null) {
- sb.append("DistributionPointName:\n " + fullName + "\n");
-
+ sb.append(fullName);
} else {
- sb.append("DistributionPointName:\n " + relativeName + "\n");
+ sb.append(relativeName);
}
-
+ sb.append('\n');
return sb.toString();
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/EDIPartyName.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/EDIPartyName.java Fri May 22 09:50:33 2015 +0200
@@ -209,10 +209,15 @@
* Return the printable string.
*/
public String toString() {
- return ("EDIPartyName: " +
- ((assigner == null) ? "" :
- (" nameAssigner = " + assigner + ","))
- + " partyName = " + party);
+ StringBuilder sb = new StringBuilder("EDIPartyName: ");
+ if (assigner != null) {
+ sb.append(" nameAssigner = ")
+ .append(assigner)
+ .append(',');
+ }
+ sb.append(" partyName = ")
+ .append(party);
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/Extension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/Extension.java Fri May 22 09:50:33 2015 +0200
@@ -219,13 +219,8 @@
* Returns the Extension in user readable form.
*/
public String toString() {
- String s = "ObjectId: " + extensionId.toString();
- if (critical) {
- s += " Criticality=true\n";
- } else {
- s += " Criticality=false\n";
- }
- return (s);
+ return "ObjectId: " + extensionId +
+ " Criticality=" + critical + '\n';
}
// Value to mix up the hash
--- a/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtree.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtree.java Fri May 22 09:50:33 2015 +0200
@@ -127,15 +127,22 @@
* Return a printable string of the GeneralSubtree.
*/
public String toString() {
- String s = "\n GeneralSubtree: [\n" +
- " GeneralName: " + ((name == null) ? "" : name.toString()) +
- "\n Minimum: " + minimum;
- if (maximum == -1) {
- s += "\t Maximum: undefined";
- } else
- s += "\t Maximum: " + maximum;
- s += " ]\n";
- return (s);
+ StringBuilder sb = new StringBuilder();
+ sb.append("\n GeneralSubtree: [")
+ .append("\n GeneralName: ");
+ if (name != null) {
+ sb.append(name);
+ }
+ sb.append("\n Minimum: ")
+ .append(minimum)
+ .append("\n Maximum: ");
+ if (maximum == -1) {
+ sb.append("undefined");
+ } else {
+ sb.append(maximum);
+ }
+ sb.append(" ]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtrees.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/GeneralSubtrees.java Fri May 22 09:50:33 2015 +0200
@@ -124,8 +124,7 @@
* Return a printable string of the GeneralSubtree.
*/
public String toString() {
- String s = " GeneralSubtrees:\n" + trees.toString() + "\n";
- return s;
+ return " GeneralSubtrees:\n" + trees + '\n';
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/IPAddressName.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IPAddressName.java Fri May 22 09:50:33 2015 +0200
@@ -263,7 +263,7 @@
if (address.length == 8) {
byte[] mask = new byte[4];
System.arraycopy(address, 4, mask, 0, 4);
- name = name + "/" +
+ name = name + '/' +
InetAddress.getByAddress(mask).getHostAddress();
}
} else {
@@ -285,7 +285,7 @@
if (!ba.get(i))
break;
}
- name = name + "/" + i;
+ name = name + '/' + i;
// Verify remaining bits 0
for (; i < 16*8; i++) {
if (ba.get(i)) {
--- a/jdk/src/java.base/share/classes/sun/security/x509/IssuerAlternativeNameExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IssuerAlternativeNameExtension.java Fri May 22 09:50:33 2015 +0200
@@ -140,17 +140,20 @@
* Returns a printable representation of the IssuerAlternativeName.
*/
public String toString() {
-
- String result = super.toString() + "IssuerAlternativeName [\n";
- if(names == null) {
- result += " null\n";
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("IssuerAlternativeName [\n");
+ if (names == null) {
+ sb.append(" null\n");
} else {
- for(GeneralName name: names.names()) {
- result += " "+name+"\n";
+ for (GeneralName name : names.names()) {
+ sb.append(" ")
+ .append(name)
+ .append('\n');
}
}
- result += "]\n";
- return result;
+ sb.append("]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/IssuingDistributionPointExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/IssuingDistributionPointExtension.java Fri May 22 09:50:33 2015 +0200
@@ -441,9 +441,9 @@
* Returns the extension as user readable string.
*/
public String toString() {
-
- StringBuilder sb = new StringBuilder(super.toString());
- sb.append("IssuingDistributionPoint [\n ");
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("IssuingDistributionPoint [\n ");
if (distributionPoint != null) {
sb.append(distributionPoint);
@@ -453,23 +453,18 @@
sb.append(revocationReasons);
}
- sb.append((hasOnlyUserCerts)
- ? (" Only contains user certs: true")
- : (" Only contains user certs: false")).append("\n");
-
- sb.append((hasOnlyCACerts)
- ? (" Only contains CA certs: true")
- : (" Only contains CA certs: false")).append("\n");
-
- sb.append((hasOnlyAttributeCerts)
- ? (" Only contains attribute certs: true")
- : (" Only contains attribute certs: false")).append("\n");
-
- sb.append((isIndirectCRL)
- ? (" Indirect CRL: true")
- : (" Indirect CRL: false")).append("\n");
-
- sb.append("]\n");
+ sb.append(" Only contains user certs: ")
+ .append(hasOnlyUserCerts)
+ .append('\n')
+ .append(" Only contains CA certs: ")
+ .append(hasOnlyCACerts)
+ .append('\n')
+ .append(" Only contains attribute certs: ")
+ .append(hasOnlyAttributeCerts)
+ .append('\n')
+ .append(" Indirect CRL: ")
+ .append(isIndirectCRL)
+ .append("\n]\n");
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/NameConstraintsExtension.java Fri May 22 09:50:33 2015 +0200
@@ -214,12 +214,19 @@
* Return the printable string.
*/
public String toString() {
- return (super.toString() + "NameConstraints: [" +
- ((permitted == null) ? "" :
- ("\n Permitted:" + permitted.toString())) +
- ((excluded == null) ? "" :
- ("\n Excluded:" + excluded.toString()))
- + " ]\n");
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("NameConstraints: [");
+ if (permitted != null) {
+ sb.append("\n Permitted:")
+ .append(permitted);
+ }
+ if (excluded != null) {
+ sb.append("\n Excluded:")
+ .append(excluded);
+ }
+ sb.append(" ]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java Fri May 22 09:50:33 2015 +0200
@@ -175,19 +175,24 @@
* Return the extension as user readable string.
*/
public String toString() {
- String s;
- s = super.toString() + "PolicyConstraints: [" + " Require: ";
- if (require == -1)
- s += "unspecified;";
- else
- s += require + ";";
- s += "\tInhibit: ";
- if (inhibit == -1)
- s += "unspecified";
- else
- s += inhibit;
- s += " ]\n";
- return s;
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("PolicyConstraints: [")
+ .append(" Require: ");
+ if (require == -1) {
+ sb.append("unspecified;");
+ } else {
+ sb.append(require)
+ .append(';');
+ }
+ sb.append("\tInhibit: ");
+ if (inhibit == -1) {
+ sb.append("unspecified");
+ } else {
+ sb.append(inhibit);
+ }
+ sb.append(" ]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyInformation.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyInformation.java Fri May 22 09:50:33 2015 +0200
@@ -258,9 +258,7 @@
* Return a printable representation of the PolicyInformation.
*/
public String toString() {
- StringBuilder s = new StringBuilder(" [" + policyIdentifier.toString());
- s.append(policyQualifiers + " ]\n");
- return s.toString();
+ return " [" + policyIdentifier + policyQualifiers + " ]\n";
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PrivateKeyUsageExtension.java Fri May 22 09:50:33 2015 +0200
@@ -175,11 +175,22 @@
* Return the printable string.
*/
public String toString() {
- return(super.toString() +
- "PrivateKeyUsage: [\n" +
- ((notBefore == null) ? "" : "From: " + notBefore.toString() + ", ")
- + ((notAfter == null) ? "" : "To: " + notAfter.toString())
- + "]\n");
+ StringBuilder sb = new StringBuilder();
+ sb.append(super.toString())
+ .append("PrivateKeyUsage: [\n");
+ if (notBefore != null) {
+ sb.append("From: ")
+ .append(notBefore);
+ if (notAfter != null) {
+ sb.append(", ");
+ }
+ }
+ if (notAfter != null) {
+ sb.append("To: ")
+ .append(notAfter);
+ }
+ sb.append("]\n");
+ return sb.toString();
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/RDN.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/RDN.java Fri May 22 09:50:33 2015 +0200
@@ -348,14 +348,11 @@
return assertion[0].toString();
}
- StringBuilder sb = new StringBuilder();
+ StringJoiner sj = new StringJoiner(" + ");
for (int i = 0; i < assertion.length; i++) {
- if (i != 0) {
- sb.append(" + ");
- }
- sb.append(assertion[i].toString());
+ sj.add(assertion[i].toString());
}
- return sb.toString();
+ return sj.toString();
}
/*
@@ -376,14 +373,11 @@
return assertion[0].toRFC1779String(oidMap);
}
- StringBuilder sb = new StringBuilder();
+ StringJoiner sj = new StringJoiner(" + ");
for (int i = 0; i < assertion.length; i++) {
- if (i != 0) {
- sb.append(" + ");
- }
- sb.append(assertion[i].toRFC1779String(oidMap));
+ sj.add(assertion[i].toRFC1779String(oidMap));
}
- return sb.toString();
+ return sj.toString();
}
/*
--- a/jdk/src/java.base/share/classes/sun/security/x509/SerialNumber.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SerialNumber.java Fri May 22 09:50:33 2015 +0200
@@ -101,7 +101,7 @@
* Return the SerialNumber as user readable string.
*/
public String toString() {
- return ("SerialNumber: [" + Debug.toHexString(serialNum) + "]");
+ return "SerialNumber: [" + Debug.toHexString(serialNum) + ']';
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SubjectInfoAccessExtension.java Fri May 22 09:50:33 2015 +0200
@@ -238,8 +238,8 @@
* Return the extension as user readable string.
*/
public String toString() {
- return super.toString() + "SubjectInfoAccess [\n "
- + accessDescriptions + "\n]\n";
+ return super.toString() +
+ "SubjectInfoAccess [\n " + accessDescriptions + "\n]\n";
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/SubjectKeyIdentifierExtension.java Fri May 22 09:50:33 2015 +0200
@@ -115,8 +115,8 @@
* Returns a printable representation.
*/
public String toString() {
- return super.toString() + "SubjectKeyIdentifier [\n"
- + String.valueOf(id) + "]\n";
+ return super.toString() +
+ "SubjectKeyIdentifier [\n" + id + "]\n";
}
/**
--- a/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X500Name.java Fri May 22 09:50:33 2015 +0200
@@ -31,6 +31,7 @@
import java.security.AccessController;
import java.security.Principal;
import java.util.*;
+import java.util.StringJoiner;
import sun.security.util.*;
import javax.security.auth.x500.X500Principal;
@@ -689,14 +690,11 @@
* The encodings of adjoining RelativeDistinguishedNames are separated
* by a comma character (',' ASCII 44).
*/
- StringBuilder fullname = new StringBuilder(48);
+ StringJoiner sj = new StringJoiner(",");
for (int i = names.length - 1; i >= 0; i--) {
- if (i < names.length - 1) {
- fullname.append(',');
- }
- fullname.append(names[i].toRFC2253String(oidMap));
+ sj.add(names[i].toRFC2253String(oidMap));
}
- return fullname.toString();
+ return sj.toString();
}
public String getRFC2253CanonicalName() {
@@ -722,14 +720,11 @@
* The encodings of adjoining RelativeDistinguishedNames are separated
* by a comma character (',' ASCII 44).
*/
- StringBuilder fullname = new StringBuilder(48);
+ StringJoiner sj = new StringJoiner(",");
for (int i = names.length - 1; i >= 0; i--) {
- if (i < names.length - 1) {
- fullname.append(',');
- }
- fullname.append(names[i].toRFC2253String(true));
+ sj.add(names[i].toRFC2253String(true));
}
- canonicalDn = fullname.toString();
+ canonicalDn = sj.toString();
return canonicalDn;
}
@@ -1064,16 +1059,16 @@
return;
}
- StringBuilder sb = new StringBuilder(48);
- if (names != null) {
- for (int i = names.length - 1; i >= 0; i--) {
- if (i != names.length - 1) {
- sb.append(", ");
- }
- sb.append(names[i].toString());
- }
+ if (names == null) {
+ dn = "";
+ return;
}
- dn = sb.toString();
+
+ StringJoiner sj = new StringJoiner(", ");
+ for (int i = names.length - 1; i >= 0; i--) {
+ sj.add(names[i].toString());
+ }
+ dn = sj.toString();
}
/*
@@ -1090,16 +1085,15 @@
return names[0].toRFC1779String(oidMap);
}
- StringBuilder sb = new StringBuilder(48);
- if (names != null) {
- for (int i = names.length - 1; i >= 0; i--) {
- if (i != names.length - 1) {
- sb.append(", ");
- }
- sb.append(names[i].toRFC1779String(oidMap));
- }
+ if (names == null) {
+ return "";
}
- return sb.toString();
+
+ StringJoiner sj = new StringJoiner(", ");
+ for (int i = names.length - 1; i >= 0; i--) {
+ sj.add(names[i].toRFC1779String(oidMap));
+ }
+ return sj.toString();
}
/****************************************************************/
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLEntryImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLEntryImpl.java Fri May 22 09:50:33 2015 +0200
@@ -291,40 +291,47 @@
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append(serialNumber.toString());
- sb.append(" On: " + revocationDate.toString());
+ sb.append(serialNumber)
+ .append(" On: ")
+ .append(revocationDate);
if (certIssuer != null) {
- sb.append("\n Certificate issuer: " + certIssuer);
+ sb.append("\n Certificate issuer: ")
+ .append(certIssuer);
}
if (extensions != null) {
Collection<Extension> allEntryExts = extensions.getAllExtensions();
Extension[] exts = allEntryExts.toArray(new Extension[0]);
- sb.append("\n CRL Entry Extensions: " + exts.length);
+ sb.append("\n CRL Entry Extensions: ")
+ .append(exts.length);
for (int i = 0; i < exts.length; i++) {
- sb.append("\n [" + (i+1) + "]: ");
+ sb.append("\n [")
+ .append(i+1)
+ .append("]: ");
Extension ext = exts[i];
try {
if (OIDMap.getClass(ext.getExtensionId()) == null) {
- sb.append(ext.toString());
+ sb.append(ext);
byte[] extValue = ext.getExtensionValue();
if (extValue != null) {
DerOutputStream out = new DerOutputStream();
out.putOctetString(extValue);
extValue = out.toByteArray();
HexDumpEncoder enc = new HexDumpEncoder();
- sb.append("Extension unknown: "
- + "DER encoded OCTET string =\n"
- + enc.encodeBuffer(extValue) + "\n");
+ sb.append("Extension unknown: ")
+ .append("DER encoded OCTET string =\n")
+ .append(enc.encodeBuffer(extValue))
+ .append('\n');
}
- } else
- sb.append(ext.toString()); //sub-class exists
+ } else {
+ sb.append(ext); //sub-class exists
+ }
} catch (Exception e) {
sb.append(", Error parsing this extension");
}
}
}
- sb.append("\n");
+ sb.append('\n');
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CRLImpl.java Fri May 22 09:50:33 2015 +0200
@@ -537,47 +537,65 @@
*/
public String toString() {
StringBuilder sb = new StringBuilder();
- sb.append("X.509 CRL v" + (version+1) + "\n");
+ sb.append("X.509 CRL v")
+ .append(version+1)
+ .append('\n');
if (sigAlgId != null)
- sb.append("Signature Algorithm: " + sigAlgId.toString() +
- ", OID=" + (sigAlgId.getOID()).toString() + "\n");
+ sb.append("Signature Algorithm: ")
+ .append(sigAlgId)
+ .append(", OID=")
+ .append(sigAlgId.getOID())
+ .append('\n');
if (issuer != null)
- sb.append("Issuer: " + issuer.toString() + "\n");
+ sb.append("Issuer: ")
+ .append(issuer)
+ .append('\n');
if (thisUpdate != null)
- sb.append("\nThis Update: " + thisUpdate.toString() + "\n");
+ sb.append("\nThis Update: ")
+ .append(thisUpdate)
+ .append('\n');
if (nextUpdate != null)
- sb.append("Next Update: " + nextUpdate.toString() + "\n");
+ sb.append("Next Update: ")
+ .append(nextUpdate)
+ .append('\n');
if (revokedList.isEmpty())
sb.append("\nNO certificates have been revoked\n");
else {
- sb.append("\nRevoked Certificates: " + revokedList.size());
+ sb.append("\nRevoked Certificates: ")
+ .append(revokedList.size());
int i = 1;
for (X509CRLEntry entry: revokedList) {
- sb.append("\n[" + i++ + "] " + entry.toString());
+ sb.append("\n[")
+ .append(i++)
+ .append("] ")
+ .append(entry);
}
}
if (extensions != null) {
Collection<Extension> allExts = extensions.getAllExtensions();
Object[] objs = allExts.toArray();
- sb.append("\nCRL Extensions: " + objs.length);
+ sb.append("\nCRL Extensions: ")
+ .append(objs.length);
for (int i = 0; i < objs.length; i++) {
- sb.append("\n[" + (i+1) + "]: ");
+ sb.append("\n[").append(i+1).append("]: ");
Extension ext = (Extension)objs[i];
try {
- if (OIDMap.getClass(ext.getExtensionId()) == null) {
- sb.append(ext.toString());
- byte[] extValue = ext.getExtensionValue();
- if (extValue != null) {
- DerOutputStream out = new DerOutputStream();
- out.putOctetString(extValue);
- extValue = out.toByteArray();
- HexDumpEncoder enc = new HexDumpEncoder();
- sb.append("Extension unknown: "
- + "DER encoded OCTET string =\n"
- + enc.encodeBuffer(extValue) + "\n");
- }
- } else
- sb.append(ext.toString()); // sub-class exists
+ if (OIDMap.getClass(ext.getExtensionId()) == null) {
+ sb.append(ext);
+ byte[] extValue = ext.getExtensionValue();
+ if (extValue != null) {
+ DerOutputStream out = new DerOutputStream();
+ out.putOctetString(extValue);
+ extValue = out.toByteArray();
+ HexDumpEncoder enc = new HexDumpEncoder();
+ sb.append("Extension unknown: ")
+ .append("DER encoded OCTET string =\n")
+ .append(enc.encodeBuffer(extValue))
+ .append('\n');
+ }
+ } else {
+ sb.append(ext); // sub-class exists
+ }
} catch (Exception e) {
sb.append(", Error parsing this extension");
}
@@ -585,10 +603,12 @@
}
if (signature != null) {
HexDumpEncoder encoder = new HexDumpEncoder();
- sb.append("\nSignature:\n" + encoder.encodeBuffer(signature)
- + "\n");
- } else
+ sb.append("\nSignature:\n")
+ .append(encoder.encodeBuffer(signature))
+ .append('\n');
+ } else {
sb.append("NOT signed yet\n");
+ }
return sb.toString();
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CertImpl.java Fri May 22 09:50:33 2015 +0200
@@ -81,7 +81,7 @@
private static final long serialVersionUID = -3457612960190864406L;
- private static final String DOT = ".";
+ private static final char DOT = '.';
/**
* Public attribute names.
*/
@@ -799,17 +799,10 @@
if (info == null || algId == null || signature == null)
return "";
- StringBuilder sb = new StringBuilder();
-
- sb.append("[\n");
- sb.append(info.toString() + "\n");
- sb.append(" Algorithm: [" + algId.toString() + "]\n");
-
HexDumpEncoder encoder = new HexDumpEncoder();
- sb.append(" Signature:\n" + encoder.encodeBuffer(signature));
- sb.append("\n]");
-
- return sb.toString();
+ return "[\n" + info + '\n' +
+ " Algorithm: [" + algId + "]\n" +
+ " Signature:\n" + encoder.encodeBuffer(signature) + "\n]";
}
// the strongly typed gets, as per java.security.cert.X509Certificate
@@ -1941,31 +1934,30 @@
* only contains 0-9 and A-F. No small case, no colon.
*/
private String getCertificateFingerPrint(String mdAlg) {
- String fingerPrint = "";
try {
byte[] encCertInfo = getEncoded();
MessageDigest md = MessageDigest.getInstance(mdAlg);
byte[] digest = md.digest(encCertInfo);
- StringBuffer buf = new StringBuffer();
+ StringBuilder sb = new StringBuilder(digest.length * 2);
for (int i = 0; i < digest.length; i++) {
- byte2hex(digest[i], buf);
+ byte2hex(digest[i], sb);
}
- fingerPrint = buf.toString();
+ return sb.toString();
} catch (NoSuchAlgorithmException | CertificateEncodingException e) {
// ignored
}
- return fingerPrint;
+ return "";
}
/**
- * Converts a byte to hex digit and writes to the supplied buffer
+ * Converts a byte to hex digit and writes to the supplied builder
*/
- private static void byte2hex(byte b, StringBuffer buf) {
+ private static void byte2hex(byte b, StringBuilder buf) {
char[] hexChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'A', 'B', 'C', 'D', 'E', 'F' };
int high = ((b & 0xf0) >> 4);
int low = (b & 0x0f);
- buf.append(hexChars[high]);
- buf.append(hexChars[low]);
+ buf.append(hexChars[high])
+ .append(hexChars[low]);
}
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/X509CertInfo.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/X509CertInfo.java Fri May 22 09:50:33 2015 +0200
@@ -299,55 +299,60 @@
}
StringBuilder sb = new StringBuilder();
- sb.append("[\n");
- sb.append(" " + version.toString() + "\n");
- sb.append(" Subject: " + subject.toString() + "\n");
- sb.append(" Signature Algorithm: " + algId.toString() + "\n");
- sb.append(" Key: " + pubKey.toString() + "\n");
- sb.append(" " + interval.toString() + "\n");
- sb.append(" Issuer: " + issuer.toString() + "\n");
- sb.append(" " + serialNum.toString() + "\n");
+ sb.append("[\n")
+ .append(" ").append(version).append('\n')
+ .append(" Subject: ").append(subject).append('\n')
+ .append(" Signature Algorithm: ").append(algId).append('\n')
+ .append(" Key: ").append(pubKey).append('\n')
+ .append(" ").append(interval).append('\n')
+ .append(" Issuer: ").append(issuer).append('\n')
+ .append(" ").append(serialNum).append('\n');
// optional v2, v3 extras
if (issuerUniqueId != null) {
- sb.append(" Issuer Id:\n" + issuerUniqueId.toString() + "\n");
+ sb.append(" Issuer Id:\n").append(issuerUniqueId).append('\n');
}
if (subjectUniqueId != null) {
- sb.append(" Subject Id:\n" + subjectUniqueId.toString() + "\n");
+ sb.append(" Subject Id:\n").append(subjectUniqueId).append('\n');
}
if (extensions != null) {
Collection<Extension> allExts = extensions.getAllExtensions();
Extension[] exts = allExts.toArray(new Extension[0]);
- sb.append("\nCertificate Extensions: " + exts.length);
+ sb.append("\nCertificate Extensions: ").append(exts.length);
for (int i = 0; i < exts.length; i++) {
- sb.append("\n[" + (i+1) + "]: ");
+ sb.append("\n[").append(i+1).append("]: ");
Extension ext = exts[i];
try {
if (OIDMap.getClass(ext.getExtensionId()) == null) {
- sb.append(ext.toString());
+ sb.append(ext);
byte[] extValue = ext.getExtensionValue();
if (extValue != null) {
DerOutputStream out = new DerOutputStream();
out.putOctetString(extValue);
extValue = out.toByteArray();
HexDumpEncoder enc = new HexDumpEncoder();
- sb.append("Extension unknown: "
- + "DER encoded OCTET string =\n"
- + enc.encodeBuffer(extValue) + "\n");
+ sb.append("Extension unknown: ")
+ .append("DER encoded OCTET string =\n")
+ .append(enc.encodeBuffer(extValue))
+ .append('\n');
}
- } else
- sb.append(ext.toString()); //sub-class exists
+ } else {
+ sb.append(ext); //sub-class exists
+ }
} catch (Exception e) {
sb.append(", Error parsing this extension");
}
}
Map<String,Extension> invalid = extensions.getUnparseableExtensions();
if (invalid.isEmpty() == false) {
- sb.append("\nUnparseable certificate extensions: " + invalid.size());
+ sb.append("\nUnparseable certificate extensions: ")
+ .append(invalid.size());
int i = 1;
for (Extension ext : invalid.values()) {
- sb.append("\n[" + (i++) + "]: ");
- sb.append(ext);
+ sb.append("\n[")
+ .append(i++)
+ .append("]: ")
+ .append(ext);
}
}
}
--- a/jdk/src/java.base/share/classes/sun/text/CompactByteArray.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/CompactByteArray.java Fri May 22 09:50:33 2015 +0200
@@ -49,7 +49,7 @@
* Han ideographs have the same value. However, lookup is much faster than a
* hash table.
* A compact array of any primitive data type serves two purposes:
- * <UL type = round>
+ * <UL type = circle>
* <LI>Fast access of the indexed values.
* <LI>Smaller memory footprint.
* </UL>
--- a/jdk/src/java.base/share/classes/sun/text/ComposedCharIter.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/ComposedCharIter.java Fri May 22 09:50:33 2015 +0200
@@ -50,7 +50,7 @@
}
/**
- * Construct a new <tt>ComposedCharIter</tt>. The iterator will return
+ * Construct a new {@code ComposedCharIter}. The iterator will return
* all Unicode characters with canonical decompositions, excluding Korean
* Hangul characters.
*/
@@ -58,10 +58,10 @@
/**
* Returns the next precomposed Unicode character.
- * Repeated calls to <tt>next</tt> return all of the precomposed characters defined
+ * Repeated calls to {@code next} return all of the precomposed characters defined
* by Unicode, in ascending order. After all precomposed characters have
- * been returned, {@link #hasNext} will return <tt>false</tt> and further calls
- * to <tt>next</tt> will return {@link #DONE}.
+ * been returned, {@link #hasNext} will return {@code false} and further calls
+ * to {@code next} will return {@link #DONE}.
*/
public int next() {
if (curChar == decompNum - 1) {
--- a/jdk/src/java.base/share/classes/sun/text/Normalizer.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/Normalizer.java Fri May 22 09:50:33 2015 +0200
@@ -32,7 +32,7 @@
* This Normalizer is for Unicode 3.2 support for IDNA only.
* Developers should not use this class.
*
- * @ since 1.6
+ * @since 1.6
*/
public final class Normalizer {
--- a/jdk/src/java.base/share/classes/sun/text/bidi/BidiBase.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/bidi/BidiBase.java Fri May 22 09:50:33 2015 +0200
@@ -81,14 +81,13 @@
*
* <h3>General remarks about the API:</h3>
*
- * The "limit" of a sequence of characters is the position just after
+ * The "limit" of a sequence of characters is the position just after
* their last character, i.e., one more than that position.
* <p>
*
- * Some of the API methods provide access to "runs". Such a
- * "run" is defined as a sequence of characters that are at the same
+ * Some of the API methods provide access to "runs". Such a
+ * "run" is defined as a sequence of characters that are at the same
* embedding level after performing the Bidi algorithm.
- * <p>
*
* <h3>Basic concept: paragraph</h3>
* A piece of text can be divided into several paragraphs by characters
@@ -141,7 +140,8 @@
* these special values are designed that way. Also, the implementation
* assumes that MAX_EXPLICIT_LEVEL is odd.
*
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
* <li>{@link #LEVEL_DEFAULT_LTR}
* <li>{@link #LEVEL_DEFAULT_RTL}
* <li>{@link #LEVEL_OVERRIDE}
@@ -153,7 +153,8 @@
* Reordering mode values indicate which variant of the Bidi algorithm to
* use.
*
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
* <li>{@link #setReorderingMode}
* <li>{@link #REORDER_DEFAULT}
* <li>{@link #REORDER_NUMBERS_SPECIAL}
@@ -166,7 +167,8 @@
*
* <h3>Basic concept: Reordering Options</h3>
* Reordering options can be applied during Bidi text transformations.
- * <ul><b>See Also:</b>
+ * <p><b>See Also:</b>
+ * <ul>
* <li>{@link #setReorderingOptions}
* <li>{@link #OPTION_DEFAULT}
* <li>{@link #OPTION_INSERT_MARKS}
@@ -202,7 +204,7 @@
* and therefore its implementation omitted from this sample code.</li>
* </ul>
*
- * <pre>
+ * <pre>{@code
*
* package com.ibm.icu.dev.test.bidi;
*
@@ -451,7 +453,7 @@
* }
* }
*
- * </pre>
+ * }</pre>
*/
public class BidiBase {
@@ -2419,9 +2421,9 @@
* (same index) character if the level has the
* <code>LEVEL_OVERRIDE</code> bit set.<br><br>
* Except for that bit, it must be
- * <code>paraLevel<=embeddingLevels[]<=MAX_EXPLICIT_LEVEL</code>,
+ * {@code paraLevel<=embeddingLevels[]<=MAX_EXPLICIT_LEVEL},
* with one exception: a level of zero may be specified for a
- * paragraph separator even if <code>paraLevel>0</code> when multiple
+ * paragraph separator even if {@code paraLevel > 0} when multiple
* paragraphs are submitted in the same call to <code>setPara()</code>.<br><br>
* <strong>Caution: </strong>A reference to this array, not a copy
* of the levels, will be stored in the <code>Bidi</code> object;
@@ -2680,7 +2682,7 @@
* For example, in pure LTR text with numbers the numbers would get
* a resolved level of 2 higher than the surrounding text according to
* the algorithm. This implementation may set all resolved levels to
- * the same value in such a case.<p>
+ * the same value in such a case.
*
* @param paragraph a paragraph of text with optional character and
* paragraph attribute information
@@ -2817,7 +2819,7 @@
}
/**
- * Get the index of a paragraph, given a position within the text.<p>
+ * Get the index of a paragraph, given a position within the text.
*
* @param charIndex is the index of a character within the text, in the
* range <code>[0..getProcessedLength()-1]</code>.
--- a/jdk/src/java.base/share/classes/sun/text/bidi/BidiRun.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/bidi/BidiRun.java Fri May 22 09:50:33 2015 +0200
@@ -42,7 +42,7 @@
/**
* A BidiRun represents a sequence of characters at the same embedding level.
* The Bidi algorithm decomposes a piece of text into sequences of characters
- * at the same embedding level, each such sequence is called a <quote>run</quote>.
+ * at the same embedding level, each such sequence is called a "run".
*
* <p>A BidiRun represents such a run by storing its essential properties,
* but does not duplicate the characters which form the run.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ICUBinary.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ICUBinary.java Fri May 22 09:50:33 2015 +0200
@@ -65,7 +65,7 @@
/**
* <p>ICU data header reader method.
* Takes a ICU generated big-endian input stream, parse the ICU standard
- * file header and authenticates them.</p>
+ * file header and authenticates them.
* <p>Header format:
* <ul>
* <li> Header size (char)
@@ -84,7 +84,7 @@
* [0] major [1] minor [2] milli [3] micro
* <li> Unicode version (4 bytes) this ICU is based on.
* </ul>
- * </p>
+ *
* <p>
* Example of use:<br>
* <pre>
@@ -98,7 +98,7 @@
* System.out.println("This is not a ICU data file");
* }
* </pre>
- * </p>
+ *
* @param inputStream input stream that contains the ICU data header
* @param dataFormatIDExpected Data format expected. An array of 4 bytes
* information about the data format.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/IntTrie.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/IntTrie.java Fri May 22 09:50:33 2015 +0200
@@ -58,7 +58,7 @@
* trie.</p>
* @param inputStream file input stream to a ICU data file, containing
* the trie
- * @param dataManipulate object which provides methods to parse the char
+ * @param datamanipulate object which provides methods to parse the char
* data
* @throws IOException thrown when data reading fails
* @draft 2.1
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/NormalizerBase.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/NormalizerBase.java Fri May 22 09:50:33 2015 +0200
@@ -55,16 +55,16 @@
* In Unicode, this can be encoded as a single character (the
* "composed" form):
*
- * <p>
+ * <pre>
* 00C1 LATIN CAPITAL LETTER A WITH ACUTE
- * </p>
+ * </pre>
*
* or as two separate characters (the "decomposed" form):
*
- * <p>
+ * <pre>
* 0041 LATIN CAPITAL LETTER A
* 0301 COMBINING ACUTE ACCENT
- * </p>
+ * </pre>
*
* To a user of your program, however, both of these sequences should be
* treated as the same "user-level" character "A with acute accent". When you
@@ -76,17 +76,17 @@
*
* Similarly, the string "ffi" can be encoded as three separate letters:
*
- * <p>
+ * <pre>
* 0066 LATIN SMALL LETTER F
* 0066 LATIN SMALL LETTER F
* 0069 LATIN SMALL LETTER I
- * </p>
+ * </pre>
*
* or as the single character
*
- * <p>
+ * <pre>
* FB03 LATIN SMALL LIGATURE FFI
- * </p>
+ * </pre>
*
* The ffi ligature is not a distinct semantic character, and strictly speaking
* it shouldn't be in Unicode at all, but it was included for compatibility
@@ -555,12 +555,12 @@
//-------------------------------------------------------------------------
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of a given string.
* <p>
- * The <tt>options</tt> parameter specifies which optional
- * <tt>Normalizer</tt> features are to be enabled for this object.
- * <p>
+ * The {@code options} parameter specifies which optional
+ * {@code Normalizer} features are to be enabled for this object.
+ *
* @param str The string to be normalized. The normalization
* will start at the beginning of the string.
*
@@ -579,9 +579,9 @@
}
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of the given text.
- * <p>
+ *
* @param iter The input text to be normalized. The normalization
* will start at the beginning of the string.
*
@@ -592,9 +592,9 @@
}
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of the given text.
- * <p>
+ *
* @param iter The input text to be normalized. The normalization
* will start at the beginning of the string.
*
@@ -615,13 +615,13 @@
}
/**
- * Clones this <tt>Normalizer</tt> object. All properties of this
+ * Clones this {@code Normalizer} object. All properties of this
* object are duplicated in the new object, including the cloning of any
* {@link CharacterIterator} that was passed in to the constructor
* or to {@link #setText(CharacterIterator) setText}.
* However, the text storage underlying
- * the <tt>CharacterIterator</tt> is not duplicated unless the
- * iterator's <tt>clone</tt> method does so.
+ * the {@code CharacterIterator} is not duplicated unless the
+ * iterator's {@code clone} method does so.
* @stable ICU 2.8
*/
public Object clone() {
@@ -791,7 +791,7 @@
//-------------------------------------------------------------------------
/**
- * Return the current character in the normalized text->
+ * Return the current character in the normalized text.
* @return The codepoint as an int
* @stable ICU 2.8
*/
@@ -872,10 +872,10 @@
* while {@link #next} and {@link #previous} iterate through characters
* in the normalized <em>output</em>. This means that there is not
* necessarily a one-to-one correspondence between characters returned
- * by <tt>next</tt> and <tt>previous</tt> and the indices passed to and
- * returned from <tt>setIndex</tt> and {@link #getIndex}.
- * <p>
- * @param index the desired index in the input text->
+ * by {@code next} and {@code previous} and the indices passed to and
+ * returned from {@code setIndex} and {@link #getIndex}.
+ *
+ * @param index the desired index in the input text.
*
* @return the first normalized character that is the result of iterating
* forward starting at the given index.
@@ -894,8 +894,8 @@
/**
* Retrieve the index of the start of the input text. This is the begin
- * index of the <tt>CharacterIterator</tt> or the start (i.e. 0) of the
- * <tt>String</tt> over which this <tt>Normalizer</tt> is iterating
+ * index of the {@code CharacterIterator} or the start (i.e. 0) of the
+ * {@code String} over which this {@code Normalizer} is iterating
* @deprecated ICU 2.2. Use startIndex() instead.
* @return The codepoint as an int
* @see #startIndex
@@ -907,8 +907,8 @@
/**
* Retrieve the index of the end of the input text. This is the end index
- * of the <tt>CharacterIterator</tt> or the length of the <tt>String</tt>
- * over which this <tt>Normalizer</tt> is iterating
+ * of the {@code CharacterIterator} or the length of the {@code String}
+ * over which this {@code Normalizer} is iterating
* @deprecated ICU 2.2. Use endIndex() instead.
* @return The codepoint as an int
* @see #endIndex
@@ -927,9 +927,9 @@
* <b>Note:</b> This method sets the position in the <em>input</em>, while
* {@link #next} and {@link #previous} iterate through characters in the
* <em>output</em>. This means that there is not necessarily a one-to-one
- * correspondence between characters returned by <tt>next</tt> and
- * <tt>previous</tt> and the indices passed to and returned from
- * <tt>setIndex</tt> and {@link #getIndex}.
+ * correspondence between characters returned by {@code next} and
+ * {@code previous} and the indices passed to and returned from
+ * {@code setIndex} and {@link #getIndex}.
* @return The current iteration position
* @stable ICU 2.8
*/
@@ -942,9 +942,9 @@
}
/**
- * Retrieve the index of the end of the input text-> This is the end index
- * of the <tt>CharacterIterator</tt> or the length of the <tt>String</tt>
- * over which this <tt>Normalizer</tt> is iterating
+ * Retrieve the index of the end of the input text. This is the end index
+ * of the {@code CharacterIterator} or the length of the {@code String}
+ * over which this {@code Normalizer} is iterating
* @return The current iteration position
* @stable ICU 2.8
*/
@@ -963,9 +963,9 @@
* return previously buffers characters in the old normalization mode
* until the iteration is able to re-sync at the next base character.
* It is safest to call {@link #setText setText()}, {@link #first},
- * {@link #last}, etc. after calling <tt>setMode</tt>.
- * <p>
- * @param newMode the new mode for this <tt>Normalizer</tt>.
+ * {@link #last}, etc. after calling {@code setMode}.
+ *
+ * @param newMode the new mode for this {@code Normalizer}.
* The supported modes are:
* <ul>
* <li>{@link #COMPOSE} - Unicode canonical decompositiion
@@ -985,7 +985,7 @@
mode = newMode;
}
/**
- * Return the basic operation performed by this <tt>Normalizer</tt>
+ * Return the basic operation performed by this {@code Normalizer}
*
* @see #setMode
* @stable ICU 2.8
@@ -995,8 +995,8 @@
}
/**
- * Set the input text over which this <tt>Normalizer</tt> will iterate.
- * The iteration position is set to the beginning of the input text->
+ * Set the input text over which this {@code Normalizer} will iterate.
+ * The iteration position is set to the beginning of the input text.
* @param newText The new string to be normalized.
* @stable ICU 2.8
*/
@@ -1011,8 +1011,8 @@
}
/**
- * Set the input text over which this <tt>Normalizer</tt> will iterate.
- * The iteration position is set to the beginning of the input text->
+ * Set the input text over which this {@code Normalizer} will iterate.
+ * The iteration position is set to the beginning of the input text.
* @param newText The new string to be normalized.
* @stable ICU 2.8
*/
@@ -1571,7 +1571,7 @@
//
/**
- * Creates a new <tt>Normalizer</tt> object for iterating over the
+ * Creates a new {@code Normalizer} object for iterating over the
* normalized form of a given string.
*
* @param str The string to be normalized. The normalization
@@ -1646,7 +1646,6 @@
* perform further tests to arrive at a true/false result.
* @param str the input string to be checked to see if it is normalized
* @param form the normalization form
- * @param options the optional features to be enabled.
*/
public static boolean isNormalized(String str, Normalizer.Form form) {
return isNormalized(str, form, UNICODE_LATEST);
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/RangeValueIterator.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/RangeValueIterator.java Fri May 22 09:50:33 2015 +0200
@@ -38,12 +38,13 @@
package sun.text.normalizer;
/**
- * <p>Interface for enabling iteration over sets of <int index, int value>,
+ * <p>Interface for enabling iteration over sets of
+ * {@code <int index, int value>},
* where index is the sorted integer index in ascending order and value, its
- * associated integer value.</p>
+ * associated integer value.
* <p>The result for each iteration is the consecutive range of
- * <int index, int value> with the same value. Result is represented by
- * <start, limit, value> where</p>
+ * {@code <int index, int value>} with the same value. Result is represented by
+ * {@code <start, limit, value>} where
* <ul>
* <li> start is the starting integer of the result range
* <li> limit is 1 after the maximum integer that follows start, such that
@@ -56,10 +57,10 @@
* Hence value(start) = value(start + 1) = .... = value(start + n) = .... =
* value(limit - 1). However value(start -1) != value(start) and
* value(limit) != value(start).
- * </p>
+ *
* <p>Most implementations will be created by factory methods, such as the
* character type iterator in UCharacter.getTypeIterator. See example below.
- * </p>
+ *
* Example of use:<br>
* <pre>
* RangeValueIterator iterator = UCharacter.getTypeIterator();
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Replaceable.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Replaceable.java Fri May 22 09:50:33 2015 +0200
@@ -71,10 +71,9 @@
* <li>If there is no previous character (i.e. start == 0), use the
* following character</li>
* <li>If there is no following character (i.e. the replaceable was
- * empty), use default metadata<br>
+ * empty), use default metadata</li>
* <li>If the code point U+FFFF is seen, it should be interpreted as
- * a special marker having no metadata<li>
- * </li>
+ * a special marker having no metadata</li>
* </ul>
* If this is not the behavior, the subclass should document any differences.
*
@@ -111,10 +110,10 @@
* starting at index <code>dstStart</code> and ending at index
* <code>dstStart + (srcLimit-srcStart) - 1</code>.
*
- * @param srcStart the beginning index to copy, inclusive; <code>0
- * <= start <= limit</code>.
+ * @param srcStart the beginning index to copy, inclusive;
+ * {@code 0 <= start <= limit}.
* @param srcLimit the ending index to copy, exclusive;
- * <code>start <= limit <= length()</code>.
+ * {@code start <= limit <= length()}.
* @param dst the destination array.
* @param dstStart the start offset in the destination array.
* @stable ICU 2.0
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableString.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableString.java Fri May 22 09:50:33 2015 +0200
@@ -109,10 +109,10 @@
* starting at index <code>dstStart</code> and ending at index
* <code>dstStart + (srcLimit-srcStart) - 1</code>.
*
- * @param srcStart the beginning index to copy, inclusive; <code>0
- * <= start <= limit</code>.
+ * @param srcStart the beginning index to copy, inclusive;
+ * {@code 0 <= start <= limit}.
* @param srcLimit the ending index to copy, exclusive;
- * <code>start <= limit <= length()</code>.
+ * {@code start <= limit <= length()}.
* @param dst the destination array.
* @param dstStart the start offset in the destination array.
* @stable ICU 2.0
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableUCharacterIterator.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/ReplaceableUCharacterIterator.java Fri May 22 09:50:33 2015 +0200
@@ -150,14 +150,12 @@
}
/**
- * <p>Sets the currentIndex to the specified currentIndex in the text and returns that
+ * Sets the currentIndex to the specified currentIndex in the text and returns that
* single UTF16 character at currentIndex.
- * This assumes the text is stored as 16-bit code units.</p>
+ * This assumes the text is stored as 16-bit code units.
* @param currentIndex the currentIndex within the text.
* @exception IllegalArgumentException is thrown if an invalid currentIndex is
* supplied. i.e. currentIndex is out of bounds.
- * @return the character at the specified currentIndex or DONE if the specified
- * currentIndex is equal to the end of the text.
*/
public void setIndex(int currentIndex) {
if (currentIndex < 0 || currentIndex > replaceable.length()) {
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/RuleCharacterIterator.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/RuleCharacterIterator.java Fri May 22 09:50:33 2015 +0200
@@ -101,22 +101,25 @@
public static final int DONE = -1;
/**
- * Bitmask option to enable parsing of variable names. If (options &
- * PARSE_VARIABLES) != 0, then an embedded variable will be expanded to
+ * Bitmask option to enable parsing of variable names.
+ * If {@code (options & PARSE_VARIABLES) != 0},
+ * then an embedded variable will be expanded to
* its value. Variables are parsed using the SymbolTable API.
*/
public static final int PARSE_VARIABLES = 1;
/**
- * Bitmask option to enable parsing of escape sequences. If (options &
- * PARSE_ESCAPES) != 0, then an embedded escape sequence will be expanded
+ * Bitmask option to enable parsing of escape sequences.
+ * If {@code (options & PARSE_ESCAPES) != 0},
+ * then an embedded escape sequence will be expanded
* to its value. Escapes are parsed using Utility.unescapeAt().
*/
public static final int PARSE_ESCAPES = 2;
/**
- * Bitmask option to enable skipping of whitespace. If (options &
- * SKIP_WHITESPACE) != 0, then whitespace characters will be silently
+ * Bitmask option to enable skipping of whitespace.
+ * If {@code (options & SKIP_WHITESPACE) != 0},
+ * then whitespace characters will be silently
* skipped, as if they were not present in the input. Whitespace
* characters are defined by UCharacterProperty.isRuleWhiteSpace().
*/
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/SymbolTable.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/SymbolTable.java Fri May 22 09:50:33 2015 +0200
@@ -78,7 +78,7 @@
/**
* Lookup the characters associated with this string and return it.
- * Return <tt>null</tt> if no such name exists. The resultant
+ * Return {@code null} if no such name exists. The resultant
* array may have length zero.
* @param s the symbolic name to lookup
* @return a char array containing the name's value, or null if
@@ -91,7 +91,7 @@
/**
* Lookup the UnicodeMatcher associated with the given character, and
- * return it. Return <tt>null</tt> if not found.
+ * return it. Return {@code null} if not found.
* @param ch a 32-bit code point from 0 to 0x10FFFF inclusive.
* @return the UnicodeMatcher object represented by the given
* character, or null if there is no mapping for ch.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Trie.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Trie.java Fri May 22 09:50:33 2015 +0200
@@ -160,8 +160,10 @@
/**
* Lead surrogate code points' index displacement in the index array.
+ * <pre>{@code
* 0x10000-0xd800=0x2800
* 0x2800 >> INDEX_STAGE_1_SHIFT_
+ * }</pre>
*/
protected static final int LEAD_INDEX_OFFSET_ = 0x2800 >> 5;
/**
@@ -191,7 +193,7 @@
/**
* Number of index (stage 1) entries per lead surrogate.
* Same as number of index entries for 1024 trail surrogates,
- * ==0x400>>INDEX_STAGE_1_SHIFT_
+ * {@code ==0x400>>INDEX_STAGE_1_SHIFT_}
*/
protected static final int SURROGATE_BLOCK_COUNT=(1<<SURROGATE_BLOCK_BITS);
/** Length of the BMP portion of the index (stage 1) array. */
@@ -297,7 +299,7 @@
/**
* Internal trie getter from a code point.
* Could be faster(?) but longer with
- * if((c32)<=0xd7ff) { (result)=_TRIE_GET_RAW(trie, data, 0, c32); }
+ * {@code if((c32)<=0xd7ff) { (result)=_TRIE_GET_RAW(trie, data, 0, c32); }}
* Gets the offset to data which the codepoint points to
* @param ch codepoint
* @return offset to data
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/TrieIterator.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/TrieIterator.java Fri May 22 09:50:33 2015 +0200
@@ -37,17 +37,17 @@
package sun.text.normalizer;
/**
- * <p>Class enabling iteration of the values in a Trie.</p>
+ * Class enabling iteration of the values in a Trie.
* <p>Result of each iteration contains the interval of codepoints that have
- * the same value type and the value type itself.</p>
+ * the same value type and the value type itself.
* <p>The comparison of each codepoint value is done via extract(), which the
- * default implementation is to return the value as it is.</p>
+ * default implementation is to return the value as it is.
* <p>Method extract() can be overwritten to perform manipulations on
- * codepoint values in order to perform specialized comparison.</p>
+ * codepoint values in order to perform specialized comparison.
* <p>TrieIterator is designed to be a generic iterator for the CharTrie
* and the IntTrie, hence to accommodate both types of data, the return
- * result will be in terms of int (32 bit) values.</p>
- * <p>See com.ibm.icu.text.UCharacterTypeIterator for examples of use.</p>
+ * result will be in terms of int (32 bit) values.
+ * <p>See com.ibm.icu.text.UCharacterTypeIterator for examples of use.
* <p>Notes for porting utrie_enum from icu4c to icu4j:<br>
* Internally, icu4c's utrie_enum performs all iterations in its body. In Java
* sense, the caller will have to pass a object with a callback function
@@ -63,18 +63,17 @@
* the method extract(int) (equivalent to UTrieEnumValue). Independent of icu4j,
* the caller will have to code his own iteration and flesh out the task
* (equivalent to UTrieEnumRange) to be performed in the iteration loop.
- * </p>
- * <p>There are basically 3 usage scenarios for porting:</p>
+ *
+ * <p>There are basically 3 usage scenarios for porting:
* <p>1) UTrieEnumValue is the only implemented callback then just implement a
* subclass of TrieIterator and override the extract(int) method. The
* extract(int) method is analogus to UTrieEnumValue callback.
- * </p>
+ *
* <p>2) UTrieEnumValue and UTrieEnumRange both are implemented then implement
- * a subclass of TrieIterator, override the extract method and iterate, e.g
- * </p>
- * <p>utrie_enum(&normTrie, _enumPropertyStartsValue, _enumPropertyStartsRange,
- * set);<br>
- * In Java :<br>
+ * a subclass of TrieIterator, override the extract method and iterate, e.g.<br>
+ * {@code utrie_enum(&normTrie, _enumPropertyStartsValue, _enumPropertyStartsRange,
+ * set);}<br>
+ * In Java:<br>
* <pre>
* class TrieIteratorImpl extends TrieIterator{
* public TrieIteratorImpl(Trie data){
@@ -90,17 +89,17 @@
* // port the implementation of _enumPropertyStartsRange
* }
* </pre>
- * </p>
+ *
* <p>3) UTrieEnumRange is the only implemented callback then just implement
* the while loop, when utrie_enum is called
- * <pre>
+ * <pre>{@code
* // utrie_enum(&fcdTrie, NULL, _enumPropertyStartsRange, set);
* TrieIterator fcdIter = new TrieIterator(fcdTrieImpl.fcdTrie);
* while(fcdIter.next(result)){
* set.add(result.start);
* }
- * </pre>
- * </p>
+ * }</pre>
+ *
* @author synwee
* @see com.ibm.icu.impl.Trie
* @see com.ibm.icu.lang.UCharacterTypeIterator
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacter.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacter.java Fri May 22 09:50:33 2015 +0200
@@ -128,7 +128,7 @@
* Annex C: Compatibility Properties of UTS #18 Unicode Regular Expressions
* (http://www.unicode.org/reports/tr18/#Compatibility_Properties).
* </p>
- * <p>
+ * <pre>{@code
* API access for C/POSIX character classes is as follows:
* - alpha: isUAlphabetic(c) or hasBinaryProperty(c, UProperty.ALPHABETIC)
* - lower: isULowercase(c) or hasBinaryProperty(c, UProperty.LOWERCASE)
@@ -142,7 +142,7 @@
* - cntrl: getType(c)==CONTROL
* - graph: hasBinaryProperty(c, UProperty.POSIX_GRAPH)
* - print: hasBinaryProperty(c, UProperty.POSIX_PRINT)
- * </p>
+ * }</pre>
* <p>
* The C/POSIX character classes are also available in UnicodeSet patterns,
* using patterns like [:graph:] or \p{graph}.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacterIterator.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UCharacterIterator.java Fri May 22 09:50:33 2015 +0200
@@ -200,8 +200,7 @@
* iterator obtained by calling <code>getLength()</code>.
* <b>Usage:</b>
*
- * <code>
- * <pre>
+ * <pre>{@code
* UChacterIterator iter = new UCharacterIterator.getInstance(text);
* char[] buf = new char[iter.getLength()];
* iter.getText(buf);
@@ -217,15 +216,14 @@
* buf = new char[iter.getLength()];
* }
* }
- * </pre>
- * </code>
+ * }</pre>
*
* @param fillIn an array of chars to fill with the underlying UTF-16 code
* units.
* @param offset the position within the array to start putting the data.
* @return the number of code units added to fillIn, as a convenience
* @exception IndexOutOfBounds exception if there is not enough
- * room after offset in the array, or if offset < 0.
+ * room after offset in the array, or if offset {@literal <} 0.
* @stable ICU 2.4
*/
public abstract int getText(char[] fillIn, int offset);
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UTF16.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UTF16.java Fri May 22 09:50:33 2015 +0200
@@ -38,26 +38,26 @@
/**
* <p>Standalone utility class providing UTF16 character conversions and
- * indexing conversions.</p>
+ * indexing conversions.
* <p>Code that uses strings alone rarely need modification.
* By design, UTF-16 does not allow overlap, so searching for strings is a safe
* operation. Similarly, concatenation is always safe. Substringing is safe if
* the start and end are both on UTF-32 boundaries. In normal code, the values
* for start and end are on those boundaries, since they arose from operations
* like searching. If not, the nearest UTF-32 boundaries can be determined
- * using <code>bounds()</code>.</p>
+ * using <code>bounds()</code>.
* <strong>Examples:</strong>
* <p>The following examples illustrate use of some of these methods.
- * <pre>
+ * <pre>{@code
* // iteration forwards: Original
- * for (int i = 0; i < s.length(); ++i) {
+ * for (int i = 0; i < s.length(); ++i) {
* char ch = s.charAt(i);
* doSomethingWith(ch);
* }
*
* // iteration forwards: Changes for UTF-32
* int ch;
- * for (int i = 0; i < s.length(); i+=UTF16.getCharCount(ch)) {
+ * for (int i = 0; i < s.length(); i+=UTF16.getCharCount(ch)) {
* ch = UTF16.charAt(s,i);
* doSomethingWith(ch);
* }
@@ -74,7 +74,7 @@
* ch = UTF16.charAt(s,i);
* doSomethingWith(ch);
* }
- * </pre>
+ * }</pre>
* <strong>Notes:</strong>
* <ul>
* <li>
@@ -515,12 +515,12 @@
/**
* <p>Converts argument code point and returns a String object representing
- * the code point's value in UTF16 format.</p>
+ * the code point's value in UTF16 format.
* <p>This method does not check for the validity of the codepoint, the
* results are not guaranteed if a invalid codepoint is passed as
- * argument.</p>
+ * argument.
* <p>The result is a string whose length is 1 for non-supplementary code
- * points, 2 otherwise.</p>
+ * points, 2 otherwise.
* @param ch code point
* @return string representation of the code point
*/
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeMatcher.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeMatcher.java Fri May 22 09:50:33 2015 +0200
@@ -45,7 +45,8 @@
public interface UnicodeMatcher {
/**
- * The character at index i, where i < contextStart || i >= contextLimit,
+ * The character at index {@code i}, where
+ * {@code i < contextStart || i >= contextLimit},
* is ETHER. This allows explicit matching by rules and UnicodeSets
* of text outside the context. In traditional terms, this allows anchoring
* at the start and/or end.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSet.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSet.java Fri May 22 09:50:33 2015 +0200
@@ -107,8 +107,8 @@
* </tr>
* <tr>
* <td nowrap valign="top" align="left"><code>[a{ab}{ac}]</code></td>
- * <td valign="top">The character 'a' and the multicharacter strings "ab" and
- * "ac"</td>
+ * <td valign="top">The character 'a' and the multicharacter strings "ab" and
+ * "ac"</td>
* </tr>
* <tr>
* <td nowrap valign="top" align="left"><code>[\p{Lu}]</code></td>
@@ -148,10 +148,10 @@
* literal. Thus "[a\\-b]", "[-ab]", and "[ab-]" all indicate the same
* set of three characters, 'a', 'b', and '-'.
*
- * <p>Sets may be intersected using the '&' operator or the asymmetric
+ * <p>Sets may be intersected using the {@literal '&'} operator or the asymmetric
* set difference may be taken using the '-' operator, for example,
- * "[[:L:]&[\\u0000-\\u0FFF]]" indicates the set of all Unicode letters
- * with values less than 4096. Operators ('&' and '|') have equal
+ * "{@code [[:L:]&[\\u0000-\\u0FFF]]}" indicates the set of all Unicode letters
+ * with values less than 4096. Operators ({@literal '&'} and '|') have equal
* precedence and bind left-to-right. Thus
* "[[:L:]-[a-z]-[\\u0100-\\u01FF]]" is equivalent to
* "[[[:L:]-[a-z]]-[\\u0100-\\u01FF]]". This only really matters for
@@ -166,7 +166,7 @@
* that is, U+0000 through 'a'-1 and 'z'+1 through U+10FFFF
* <tr valign=top><td nowrap><code>[[<em>pat1</em>][<em>pat2</em>]]</code>
* <td>The union of sets specified by <em>pat1</em> and <em>pat2</em>
- * <tr valign=top><td nowrap><code>[[<em>pat1</em>]&[<em>pat2</em>]]</code>
+ * <tr valign=top><td nowrap><code>[[<em>pat1</em>]&[<em>pat2</em>]]</code>
* <td>The intersection of sets specified by <em>pat1</em> and <em>pat2</em>
* <tr valign=top><td nowrap><code>[[<em>pat1</em>]-[<em>pat2</em>]]</code>
* <td>The asymmetric difference of sets specified by <em>pat1</em> and
@@ -227,7 +227,7 @@
* </tr>
* <tr>
* <td nowrap valign="top" align="right"><code>property := </code></td>
- * <td valign="top"><em>a Unicode property set pattern</td>
+ * <td valign="top"><em>a Unicode property set pattern</em></td>
* </tr>
* </table>
* <br>
@@ -337,8 +337,8 @@
}
/**
- * Constructs a set containing the given range. If <code>end >
- * start</code> then an empty set is created.
+ * Constructs a set containing the given range.
+ * If {@code end > start} then an empty set is created.
*
* @param start first character, inclusive, of range
* @param end last character, inclusive, of range
@@ -651,7 +651,7 @@
* Adds the specified multicharacter to this set if it is not already
* present. If this set already contains the multicharacter,
* the call leaves this set unchanged.
- * Thus "ch" => {"ch"}
+ * Thus {@code "ch" => {"ch"}}
* <br><b>Warning: you cannot add an empty string ("") to a UnicodeSet.</b>
* @param s the source string
* @return this object, for chaining
@@ -691,7 +691,7 @@
/**
* Complements the specified range in this set. Any character in
* the range will be removed if it is in this set, or will be
- * added if it is not in this set. If <code>end > start</code>
+ * added if it is not in this set. If {@code end > start}
* then an empty range is complemented, leaving the set unchanged.
*
* @param start first character, inclusive, of range to be removed
@@ -1698,8 +1698,8 @@
* Modifies this set to contain those code points which have the
* given value for the given property. Prior contents of this
* set are lost.
- * @param propertyAlias
- * @param valueAlias
+ * @param propertyAlias the property alias
+ * @param valueAlias the value alias
* @param symbols if not null, then symbols are first called to see if a property
* is available. If true, then everything else is skipped.
* @return this set
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSetIterator.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/UnicodeSetIterator.java Fri May 22 09:50:33 2015 +0200
@@ -73,35 +73,35 @@
public class UnicodeSetIterator {
/**
- * Value of <tt>codepoint</tt> if the iterator points to a string.
- * If <tt>codepoint == IS_STRING</tt>, then examine
- * <tt>string</tt> for the current iteration result.
+ * Value of {@code codepoint} if the iterator points to a string.
+ * If {@code codepoint == IS_STRING}, then examine
+ * {@code string} for the current iteration result.
* @stable ICU 2.0
*/
public static int IS_STRING = -1;
/**
- * Current code point, or the special value <tt>IS_STRING</tt>, if
+ * Current code point, or the special value {@code IS_STRING}, if
* the iterator points to a string.
* @stable ICU 2.0
*/
public int codepoint;
/**
- * When iterating over ranges using <tt>nextRange()</tt>,
- * <tt>codepointEnd</tt> contains the inclusive end of the
- * iteration range, if <tt>codepoint != IS_STRING</tt>. If
- * iterating over code points using <tt>next()</tt>, or if
- * <tt>codepoint == IS_STRING</tt>, then the value of
- * <tt>codepointEnd</tt> is undefined.
+ * When iterating over ranges using {@code nextRange()},
+ * {@code codepointEnd} contains the inclusive end of the
+ * iteration range, if {@code codepoint != IS_STRING}. If
+ * iterating over code points using {@code next()}, or if
+ * {@code codepoint == IS_STRING}, then the value of
+ * {@code codepointEnd} is undefined.
* @stable ICU 2.0
*/
public int codepointEnd;
/**
- * If <tt>codepoint == IS_STRING</tt>, then <tt>string</tt> points
- * to the current string. If <tt>codepoint != IS_STRING</tt>, the
- * value of <tt>string</tt> is undefined.
+ * If {@code codepoint == IS_STRING}, then {@code string} points
+ * to the current string. If {@code codepoint != IS_STRING}, the
+ * value of {@code string} is undefined.
* @stable ICU 2.0
*/
public String string;
@@ -118,17 +118,17 @@
/**
* Returns the next element in the set, either a code point range
* or a string. If there are no more elements in the set, return
- * false. If <tt>codepoint == IS_STRING</tt>, the value is a
- * string in the <tt>string</tt> field. Otherwise the value is a
- * range of one or more code points from <tt>codepoint</tt> to
- * <tt>codepointeEnd</tt> inclusive.
+ * false. If {@code codepoint == IS_STRING}, the value is a
+ * string in the {@code string} field. Otherwise the value is a
+ * range of one or more code points from {@code codepoint} to
+ * {@code codepointeEnd} inclusive.
*
* <p>The order of iteration is all code points ranges in sorted
* order, followed by all strings sorted order. Ranges are
- * disjoint and non-contiguous. <tt>string</tt> is undefined
- * unless <tt>codepoint == IS_STRING</tt>. Do not mix calls to
- * <tt>next()</tt> and <tt>nextRange()</tt> without calling
- * <tt>reset()</tt> between them. The results of doing so are
+ * disjoint and non-contiguous. {@code string} is undefined
+ * unless {@code codepoint == IS_STRING}. Do not mix calls to
+ * {@code next()} and {@code nextRange()} without calling
+ * {@code reset()} between them. The results of doing so are
* undefined.
*
* @return true if there was another element in the set and this
@@ -162,8 +162,8 @@
/**
* Sets this iterator to visit the elements of the given set and
* resets it to the start of that set. The iterator is valid only
- * so long as <tt>set</tt> is valid.
- * @param set the set to iterate over.
+ * so long as {@code set} is valid.
+ * @param uset the set to iterate over.
* @stable ICU 2.0
*/
public void reset(UnicodeSet uset) {
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/Utility.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/Utility.java Fri May 22 09:50:33 2015 +0200
@@ -227,7 +227,7 @@
/**
* Convert a integer to size width hex uppercase digits.
- * E.g., hex('a', 4, str) => "0041".
+ * E.g., {@code hex('a', 4, str) => "0041"}.
* Append the output to the given StringBuffer.
* If width is too small to fit, nothing will be appended to output.
*/
@@ -237,7 +237,7 @@
/**
* Convert a integer to size width (minimum) hex uppercase digits.
- * E.g., hex('a', 4, str) => "0041". If the integer requires more
+ * E.g., {@code hex('a', 4, str) => "0041"}. If the integer requires more
* than width digits, more will be used.
*/
public static String hex(int ch, int width) {
@@ -334,8 +334,8 @@
}
/**
- * Escape unprintable characters using <backslash>uxxxx notation
- * for U+0000 to U+FFFF and <backslash>Uxxxxxxxx for U+10000 and
+ * Escape unprintable characters using {@code <backslash>uxxxx} notation
+ * for U+0000 to U+FFFF and {@code <backslash>Uxxxxxxxx} for U+10000 and
* above. If the character is printable ASCII, then do nothing
* and return FALSE. Otherwise, append the escaped notation and
* return TRUE.
--- a/jdk/src/java.base/share/classes/sun/text/normalizer/VersionInfo.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/text/normalizer/VersionInfo.java Fri May 22 09:50:33 2015 +0200
@@ -53,7 +53,7 @@
* @param version version String in the format of "major.minor.milli.micro"
* or "major.minor.milli" or "major.minor" or "major",
* where major, minor, milli, micro are non-negative numbers
- * <= 255. If the trailing version numbers are
+ * {@literal <=} 255. If the trailing version numbers are
* not specified they are taken as 0s. E.g. Version "3.1" is
* equivalent to "3.1.0.0".
* @return an instance of VersionInfo with the argument version.
@@ -98,12 +98,12 @@
/**
* Returns an instance of VersionInfo with the argument version.
- * @param major major version, non-negative number <= 255.
- * @param minor minor version, non-negative number <= 255.
- * @param milli milli version, non-negative number <= 255.
- * @param micro micro version, non-negative number <= 255.
+ * @param major major version, non-negative number {@literal <=} 255.
+ * @param minor minor version, non-negative number {@literal <=} 255.
+ * @param milli milli version, non-negative number {@literal <=} 255.
+ * @param micro micro version, non-negative number {@literal <=} 255.
* @exception throws an IllegalArgumentException when either arguments are
- * negative or > 255
+ * negative or {@literal >} 255
* @stable ICU 2.6
*/
public static VersionInfo getInstance(int major, int minor, int milli,
--- a/jdk/src/java.base/share/conf/security/java.security Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/share/conf/security/java.security Fri May 22 09:50:33 2015 +0200
@@ -78,6 +78,7 @@
security.provider.tbd=com.sun.security.sasl.Provider
security.provider.tbd=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.tbd=sun.security.smartcardio.SunPCSC
+security.provider.tbd=sun.security.provider.certpath.ldap.JdkLDAP
#ifdef windows
security.provider.tbd=sun.security.mscapi.SunMSCAPI
#endif
--- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java Fri May 22 09:50:33 2015 +0200
@@ -270,22 +270,6 @@
throw x;
}
- // fail if the file is a directory
- if (flags.read) {
- UnixException exc = null;
- try {
- if (UnixFileAttributes.get(fd).isDirectory()) {
- exc = new UnixException(EISDIR);
- }
- } catch (UnixException x) {
- exc = x;
- }
- if (exc != null) {
- close(fd);
- throw exc;
- }
- }
-
// unlink file immediately if delete on close. The spec is clear that
// an implementation cannot guarantee to unlink the correct file when
// replaced by an attacker after it is opened.
--- a/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/unix/native/libnio/ch/FileDispatcherImpl.c Fri May 22 09:50:33 2015 +0200
@@ -148,6 +148,13 @@
jint fd = fdval(env, fdo);
int result = 0;
+#ifdef MACOSX
+ result = fcntl(fd, F_FULLFSYNC);
+ if (result == -1 && errno == ENOTSUP) {
+ /* Try fsync() in case F_FULLSYUNC is not implemented on the file system. */
+ result = fsync(fd);
+ }
+#else /* end MACOSX, begin not-MACOSX */
if (md == JNI_FALSE) {
result = fdatasync(fd);
} else {
@@ -163,9 +170,10 @@
if (getfl >= 0 && (getfl & O_ACCMODE) == O_RDONLY) {
return 0;
}
-#endif
+#endif /* _AIX */
result = fsync(fd);
}
+#endif /* not-MACOSX */
return handle(env, result, "Force failed");
}
--- a/jdk/src/java.base/windows/native/libjli/java_md.c Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.base/windows/native/libjli/java_md.c Fri May 22 09:50:33 2015 +0200
@@ -990,6 +990,26 @@
return JNI_FALSE;
}
+int
+filterArgs(StdArg *stdargs, const int nargc, StdArg **pargv) {
+ StdArg* argv = NULL;
+ int nargs = 0;
+ int i;
+
+ /* Copy the non-vm args */
+ for (i = 0; i < nargc ; i++) {
+ const char *arg = stdargs[i].arg;
+ if (arg[0] == '-' && arg[1] == 'J')
+ continue;
+ argv = (StdArg*) JLI_MemRealloc(argv, (nargs+1) * sizeof(StdArg));
+ argv[nargs].arg = JLI_StringDup(arg);
+ argv[nargs].has_wildcard = stdargs[i].has_wildcard;
+ nargs++;
+ }
+ *pargv = argv;
+ return nargs;
+}
+
/*
* At this point we have the arguments to the application, and we need to
* check with original stdargs in order to compare which of these truly
@@ -1005,8 +1025,9 @@
char *ostart, *astart, **nargv;
jboolean needs_expansion = JNI_FALSE;
jmethodID mid;
- int stdargc;
+ int filteredargc, stdargc;
StdArg *stdargs;
+ StdArg *filteredargs;
jclass cls = GetLauncherHelperClass(env);
NULL_CHECK0(cls);
@@ -1017,6 +1038,8 @@
stdargs = JLI_GetStdArgs();
stdargc = JLI_GetStdArgc();
+ filteredargc = filterArgs(stdargs, stdargc, &filteredargs);
+
// sanity check, this should never happen
if (argc > stdargc) {
JLI_TraceLauncher("Warning: app args is larger than the original, %d %d\n", argc, stdargc);
@@ -1025,8 +1048,8 @@
}
// sanity check, match the args we have, to the holy grail
- idx = stdargc - argc;
- ostart = stdargs[idx].arg;
+ idx = filteredargc - argc;
+ ostart = filteredargs[idx].arg;
astart = strv[0];
// sanity check, ensure that the first argument of the arrays are the same
if (JLI_StrCmp(ostart, astart) != 0) {
@@ -1039,8 +1062,8 @@
// make a copy of the args which will be expanded in java if required.
nargv = (char **)JLI_MemAlloc(argc * sizeof(char*));
for (i = 0, j = idx; i < argc; i++, j++) {
- jboolean arg_expand = (JLI_StrCmp(stdargs[j].arg, strv[i]) == 0)
- ? stdargs[j].has_wildcard
+ jboolean arg_expand = (JLI_StrCmp(filteredargs[j].arg, strv[i]) == 0)
+ ? filteredargs[j].has_wildcard
: JNI_FALSE;
if (needs_expansion == JNI_FALSE)
needs_expansion = arg_expand;
@@ -1077,5 +1100,6 @@
JLI_MemFree(nargv[i]);
}
JLI_MemFree(nargv);
+ JLI_MemFree(filteredargs);
return outArray;
}
--- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Fri May 22 09:50:33 2015 +0200
@@ -33,6 +33,7 @@
import java.lang.ref.WeakReference;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.locks.ReentrantLock;
import sun.misc.JavaAWTAccess;
import sun.misc.ManagedLocalsThread;
import sun.misc.SharedSecrets;
@@ -180,10 +181,16 @@
// initialization has been done)
private volatile boolean readPrimordialConfiguration;
// Have we initialized global (root) handlers yet?
- // This gets set to false in readConfiguration
- private boolean initializedGlobalHandlers = true;
- // True if JVM death is imminent and the exit hook has been called.
- private boolean deathImminent;
+ // This gets set to STATE_UNINITIALIZED in readConfiguration
+ private static final int
+ STATE_INITIALIZED = 0, // initial state
+ STATE_INITIALIZING = 1,
+ STATE_READING_CONFIG = 2,
+ STATE_UNINITIALIZED = 3,
+ STATE_SHUTDOWN = 4; // terminal state
+ private volatile int globalHandlersState; // = STATE_INITIALIZED;
+ // A concurrency lock for reset(), readConfiguration() and Cleaner.
+ private final ReentrantLock configurationLock = new ReentrantLock();
// This list contains the loggers for which some handlers have been
// explicitly configured in the configuration file.
@@ -264,13 +271,12 @@
// before synchronized block. Otherwise deadlocks are possible.
LogManager mgr = manager;
- // If the global handlers haven't been initialized yet, we
- // don't want to initialize them just so we can close them!
- synchronized (LogManager.this) {
- // Note that death is imminent.
- deathImminent = true;
- initializedGlobalHandlers = true;
- }
+ // set globalHandlersState to STATE_SHUTDOWN atomically so that
+ // no attempts are made to (re)initialize the handlers or (re)read
+ // the configuration again. This is terminal state.
+ configurationLock.lock();
+ globalHandlersState = STATE_SHUTDOWN;
+ configurationLock.unlock();
// Do a reset to close all active handlers.
reset();
@@ -1314,8 +1320,14 @@
public void reset() throws SecurityException {
checkPermission();
+
List<CloseOnReset> persistent;
- synchronized (this) {
+
+ // We don't want reset() and readConfiguration()
+ // to run in parallel
+ configurationLock.lock();
+ try {
+ // install new empty properties
props = new Properties();
// make sure we keep the loggers persistent until reset is done.
// Those are the loggers for which we previously created a
@@ -1323,26 +1335,41 @@
// from being gc'ed until those handlers are closed.
persistent = new ArrayList<>(closeOnResetLoggers);
closeOnResetLoggers.clear();
- // Since we are doing a reset we no longer want to initialize
- // the global handlers, if they haven't been initialized yet.
- initializedGlobalHandlers = true;
+
+ // if reset has been called from shutdown-hook (Cleaner),
+ // or if reset has been called from readConfiguration() which
+ // already holds the lock and will change the state itself,
+ // then do not change state here...
+ if (globalHandlersState != STATE_SHUTDOWN &&
+ globalHandlersState != STATE_READING_CONFIG) {
+ // ...else user called reset()...
+ // Since we are doing a reset we no longer want to initialize
+ // the global handlers, if they haven't been initialized yet.
+ globalHandlersState = STATE_INITIALIZED;
+ }
+
+ for (LoggerContext cx : contexts()) {
+ resetLoggerContext(cx);
+ }
+
+ persistent.clear();
+ } finally {
+ configurationLock.unlock();
}
- for (LoggerContext cx : contexts()) {
- Enumeration<String> enum_ = cx.getLoggerNames();
- while (enum_.hasMoreElements()) {
- String name = enum_.nextElement();
- Logger logger = cx.findLogger(name);
- if (logger != null) {
- resetLogger(logger);
- }
+ }
+
+ private void resetLoggerContext(LoggerContext cx) {
+ Enumeration<String> enum_ = cx.getLoggerNames();
+ while (enum_.hasMoreElements()) {
+ String name = enum_.nextElement();
+ Logger logger = cx.findLogger(name);
+ if (logger != null) {
+ resetLogger(logger);
}
}
- persistent.clear();
}
- // Private method to reset an individual target logger.
- private void resetLogger(Logger logger) {
- // Close all the Logger's handlers.
+ private void closeHandlers(Logger logger) {
Handler[] targets = logger.getHandlers();
for (Handler h : targets) {
logger.removeHandler(h);
@@ -1352,6 +1379,14 @@
// Problems closing a handler? Keep going...
}
}
+ }
+
+ // Private method to reset an individual target logger.
+ private void resetLogger(Logger logger) {
+ // Close all the Logger handlers.
+ closeHandlers(logger);
+
+ // Reset Logger level
String name = logger.getName();
if (name != null && name.equals("")) {
// This is the root logger.
@@ -1408,48 +1443,74 @@
*/
public void readConfiguration(InputStream ins) throws IOException, SecurityException {
checkPermission();
- reset();
- // Load the properties
+ // We don't want reset() and readConfiguration() to run
+ // in parallel.
+ configurationLock.lock();
try {
- props.load(ins);
- } catch (IllegalArgumentException x) {
- // props.load may throw an IllegalArgumentException if the stream
- // contains malformed Unicode escape sequences.
- // We wrap that in an IOException as readConfiguration is
- // specified to throw IOException if there are problems reading
- // from the stream.
- // Note: new IOException(x.getMessage(), x) allow us to get a more
- // concise error message than new IOException(x);
- throw new IOException(x.getMessage(), x);
+ if (globalHandlersState == STATE_SHUTDOWN) {
+ // already in terminal state: don't even bother
+ // to read the configuration
+ return;
+ }
+
+ // change state to STATE_READING_CONFIG to signal reset() to not change it
+ globalHandlersState = STATE_READING_CONFIG;
+ try {
+ // reset configuration which leaves globalHandlersState at STATE_READING_CONFIG
+ // so that while reading configuration, any ongoing logging requests block and
+ // wait for the outcome (see the end of this try statement)
+ reset();
+
+ try {
+ // Load the properties
+ props.load(ins);
+ } catch (IllegalArgumentException x) {
+ // props.load may throw an IllegalArgumentException if the stream
+ // contains malformed Unicode escape sequences.
+ // We wrap that in an IOException as readConfiguration is
+ // specified to throw IOException if there are problems reading
+ // from the stream.
+ // Note: new IOException(x.getMessage(), x) allow us to get a more
+ // concise error message than new IOException(x);
+ throw new IOException(x.getMessage(), x);
+ }
+
+ // Instantiate new configuration objects.
+ String names[] = parseClassNames("config");
+
+ for (String word : names) {
+ try {
+ Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(word);
+ clz.newInstance();
+ } catch (Exception ex) {
+ System.err.println("Can't load config class \"" + word + "\"");
+ System.err.println("" + ex);
+ // ex.printStackTrace();
+ }
+ }
+
+ // Set levels on any pre-existing loggers, based on the new properties.
+ setLevelsOnExistingLoggers();
+
+ // Note that we need to reinitialize global handles when
+ // they are first referenced.
+ globalHandlersState = STATE_UNINITIALIZED;
+ } catch (Throwable t) {
+ // If there were any trouble, then set state to STATE_INITIALIZED
+ // so that no global handlers reinitialization is performed on not fully
+ // initialized configuration.
+ globalHandlersState = STATE_INITIALIZED;
+ // re-throw
+ throw t;
+ }
+ } finally {
+ configurationLock.unlock();
}
- // Instantiate new configuration objects.
- String names[] = parseClassNames("config");
-
- for (String word : names) {
- try {
- Class<?> clz = ClassLoader.getSystemClassLoader().loadClass(word);
- clz.newInstance();
- } catch (Exception ex) {
- System.err.println("Can't load config class \"" + word + "\"");
- System.err.println("" + ex);
- // ex.printStackTrace();
- }
- }
-
- // Set levels on any pre-existing loggers, based on the new properties.
- setLevelsOnExistingLoggers();
-
- try {
- invokeConfigurationListeners();
- } finally {
- // Note that we need to reinitialize global handles when
- // they are first referenced.
- synchronized (this) {
- initializedGlobalHandlers = false;
- }
- }
+ // should be called out of lock to avoid dead-lock situations
+ // when user code is involved
+ invokeConfigurationListeners();
}
/**
@@ -1576,20 +1637,41 @@
// Private method to load the global handlers.
// We do the real work lazily, when the global handlers
// are first used.
- private synchronized void initializeGlobalHandlers() {
- if (initializedGlobalHandlers) {
+ private void initializeGlobalHandlers() {
+ int state = globalHandlersState;
+ if (state == STATE_INITIALIZED ||
+ state == STATE_SHUTDOWN) {
+ // Nothing to do: return.
return;
}
- initializedGlobalHandlers = true;
-
- if (deathImminent) {
- // Aaargh...
- // The VM is shutting down and our exit hook has been called.
- // Avoid allocating global handlers.
- return;
+ // If we have not initialized global handlers yet (or need to
+ // reinitialize them), lets do it now (this case is indicated by
+ // globalHandlersState == STATE_UNINITIALIZED).
+ // If we are in the process of initializing global handlers we
+ // also need to lock & wait (this case is indicated by
+ // globalHandlersState == STATE_INITIALIZING).
+ // If we are in the process of reading configuration we also need to
+ // wait to see what the outcome will be (this case
+ // is indicated by globalHandlersState == STATE_READING_CONFIG)
+ // So in either case we need to wait for the lock.
+ configurationLock.lock();
+ try {
+ if (globalHandlersState != STATE_UNINITIALIZED) {
+ return; // recursive call or nothing to do
+ }
+ // set globalHandlersState to STATE_INITIALIZING first to avoid
+ // getting an infinite recursion when loadLoggerHandlers(...)
+ // is going to call addHandler(...)
+ globalHandlersState = STATE_INITIALIZING;
+ try {
+ loadLoggerHandlers(rootLogger, null, "handlers");
+ } finally {
+ globalHandlersState = STATE_INITIALIZED;
+ }
+ } finally {
+ configurationLock.unlock();
}
- loadLoggerHandlers(rootLogger, null, "handlers");
}
static final Permission controlPermission = new LoggingPermission("control", null);
@@ -1684,7 +1766,7 @@
// Private method to be called when the configuration has
// changed to apply any level settings to any pre-existing loggers.
- synchronized private void setLevelsOnExistingLoggers() {
+ private void setLevelsOnExistingLoggers() {
Enumeration<?> enum_ = props.propertyNames();
while (enum_.hasMoreElements()) {
String key = (String)enum_.nextElement();
--- a/jdk/src/java.logging/share/classes/java/util/logging/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.logging/share/classes/java/util/logging/package.html Fri May 22 09:50:33 2015 +0200
@@ -30,8 +30,7 @@
<body bgcolor="white">
<P>
Provides the classes and interfaces of
-the Java<SUP><FONT SIZE="-2">TM</FONT></SUP> 2
- platform's core logging facilities.
+the Java™ 2 platform's core logging facilities.
The central goal of the logging APIs is to support maintaining and servicing
software at customer sites.
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java Fri May 22 09:50:33 2015 +0200
@@ -79,44 +79,46 @@
/**
* <p>A converter between Java types and the limited set of classes
- * defined by Open MBeans.</p>
+ * defined by Open MBeans.
*
- * <p>A Java type is an instance of java.lang.reflect.Type. For our
+ * <p>A Java type is an instance of java.lang.reflect.Type. For our
* purposes, it is either a Class, such as String.class or int.class;
- * or a ParameterizedType, such as List<String> or Map<Integer,
- * String[]>. On J2SE 1.4 and earlier, it can only be a Class.</p>
+ * or a ParameterizedType, such as {@code List<String>} or
+ * {@code Map<Integer, String[]>}.
+ * On J2SE 1.4 and earlier, it can only be a Class.
*
- * <p>Each Type is associated with an DefaultMXBeanMappingFactory. The
- * DefaultMXBeanMappingFactory defines an OpenType corresponding to the Type, plus a
- * Java class corresponding to the OpenType. For example:</p>
+ * <p>Each Type is associated with an DefaultMXBeanMappingFactory. The
+ * DefaultMXBeanMappingFactory defines an
+ * OpenType corresponding to the Type, plus a
+ * Java class corresponding to the OpenType. For example:
*
- * <pre>
+ * <pre>{@code
* Type Open class OpenType
* ---- ---------- --------
- * Integer Integer SimpleType.INTEGER
- * int int SimpleType.INTEGER
- * Integer[] Integer[] ArrayType(1, SimpleType.INTEGER)
- * int[] Integer[] ArrayType(SimpleType.INTEGER, true)
- * String[][] String[][] ArrayType(2, SimpleType.STRING)
- * List<String> String[] ArrayType(1, SimpleType.STRING)
+ * Integer Integer SimpleType.INTEGER
+ * int int SimpleType.INTEGER
+ * Integer[] Integer[] ArrayType(1, SimpleType.INTEGER)
+ * int[] Integer[] ArrayType(SimpleType.INTEGER, true)
+ * String[][] String[][] ArrayType(2, SimpleType.STRING)
+ * List<String> String[] ArrayType(1, SimpleType.STRING)
* ThreadState (an Enum) String SimpleType.STRING
- * Map<Integer, String[]> TabularData TabularType(
+ * Map<Integer, String[]> TabularData TabularType(
* CompositeType(
* {"key", SimpleType.INTEGER},
* {"value",
* ArrayType(1,
* SimpleType.STRING)}),
* indexNames={"key"})
- * </pre>
+ * }</pre>
*
* <p>Apart from simple types, arrays, and collections, Java types are
* converted through introspection into CompositeType. The Java type
* must have at least one getter (method such as "int getSize()" or
* "boolean isBig()"), and we must be able to deduce how to
* reconstruct an instance of the Java class from the values of the
- * getters using one of various heuristics.</p>
+ * getters using one of various heuristics.
*
- * @since 1.6
+ * @since 1.6
*/
public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
static abstract class NonNullMXBeanMapping extends MXBeanMapping {
@@ -148,8 +150,8 @@
throws OpenDataException;
/**
- * <p>True if and only if this MXBeanMapping's toOpenValue and
- * fromOpenValue methods are the identity function.</p>
+ * True if and only if this MXBeanMapping's toOpenValue and
+ * fromOpenValue methods are the identity function.
*/
boolean isIdentity() {
return false;
--- a/jdk/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/remote/internal/ServerCommunicatorAdmin.java Fri May 22 09:50:33 2015 +0200
@@ -57,8 +57,8 @@
* <code>rspOutgoing</code> to inform that a response is sent out
* for the received request.
* @return the value of the termination flag:
- * <ul><code>true</code> if the connection is already being terminated,
- * <br><code>false</code> otherwise.</ul>
+ * true if the connection is already being terminated,
+ * false otherwise.
*/
public boolean reqIncoming() {
if (logger.traceOn()) {
@@ -80,8 +80,8 @@
/**
* Tells that a response is sent out for a received request.
* @return the value of the termination flag:
- * <ul><code>true</code> if the connection is already being terminated,
- * <br><code>false</code> otherwise.</ul>
+ * true if the connection is already being terminated,
+ * false otherwise.
*/
public boolean rspOutgoing() {
if (logger.traceOn()) {
--- a/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/EnvHelp.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/remote/util/EnvHelp.java Fri May 22 09:50:33 2015 +0200
@@ -55,17 +55,17 @@
public class EnvHelp {
/**
- * <p>Name of the attribute that specifies a default class loader
+ * Name of the attribute that specifies a default class loader
* object.
- * The value associated with this attribute is a ClassLoader object</p>
+ * The value associated with this attribute is a ClassLoader object.
*/
private static final String DEFAULT_CLASS_LOADER =
JMXConnectorFactory.DEFAULT_CLASS_LOADER;
/**
- * <p>Name of the attribute that specifies a default class loader
- * ObjectName.
- * The value associated with this attribute is an ObjectName object</p>
+ * Name of the attribute that specifies a default class loader
+ * ObjectName.
+ * The value associated with this attribute is an ObjectName object.
*/
private static final String DEFAULT_CLASS_LOADER_NAME =
JMXConnectorServerFactory.DEFAULT_CLASS_LOADER_NAME;
@@ -74,7 +74,6 @@
* Get the Connector Server default class loader.
* <p>
* Returns:
- * <p>
* <ul>
* <li>
* The ClassLoader object found in <var>env</var> for
@@ -114,6 +113,7 @@
* <code>jmx.remote.default.class.loader.name</code> is specified
* but <var>mbs</var> is null.
* </li>
+ * </ul>
* @exception InstanceNotFoundException if
* <code>jmx.remote.default.class.loader.name</code> is specified
* and the ClassLoader MBean is not found in <var>mbs</var>.
@@ -172,7 +172,6 @@
* Get the Connector Client default class loader.
* <p>
* Returns:
- * <p>
* <ul>
* <li>
* The ClassLoader object found in <var>env</var> for
@@ -232,7 +231,7 @@
/**
* Returns the cause field of a {@code Throwable} object.
* The cause field can be got only if <var>t</var> has an
- * {@link Throwable#getCause()} method (JDK Version >= 1.4)
+ * {@link Throwable#getCause()} method (JDK Version {@literal >=} 1.4)
* @param t {@code Throwable} on which the cause must be set.
* @return the cause if getCause() succeeded and the got value is not
* null, otherwise return the <var>t</var>.
@@ -254,7 +253,7 @@
/**
- * <p>Name of the attribute that specifies the size of a notification
+ * Name of the attribute that specifies the size of a notification
* buffer for a connector server. The default value is 1000.
*/
public static final String BUFFER_SIZE_PROPERTY =
@@ -316,10 +315,10 @@
}
/**
- * <p>Name of the attribute that specifies the maximum number of
- * notifications that a client will fetch from its server.. The
+ * Name of the attribute that specifies the maximum number of
+ * notifications that a client will fetch from its server. The
* value associated with this attribute should be an
- * <code>Integer</code> object. The default value is 1000.</p>
+ * {@code Integer} object. The default value is 1000.
*/
public static final String MAX_FETCH_NOTIFS =
"jmx.remote.x.notification.fetch.max";
@@ -334,10 +333,10 @@
}
/**
- * <p>Name of the attribute that specifies the timeout for a
+ * Name of the attribute that specifies the timeout for a
* client to fetch notifications from its server. The value
* associated with this attribute should be a <code>Long</code>
- * object. The default value is 60000 milliseconds.</p>
+ * object. The default value is 60000 milliseconds.
*/
public static final String FETCH_TIMEOUT =
"jmx.remote.x.notification.fetch.timeout";
@@ -351,11 +350,12 @@
}
/**
- * <p>Name of the attribute that specifies an object that will check
+ * Name of the attribute that specifies an object that will check
* accesses to add/removeNotificationListener and also attempts to
* receive notifications. The value associated with this attribute
* should be a <code>NotificationAccessController</code> object.
- * The default value is null.</p>
+ * The default value is null.
+ * <p>
* This field is not public because of its com.sun dependency.
*/
public static final String NOTIF_ACCESS_CONTROLLER =
@@ -630,9 +630,9 @@
}
/**
- * <p>Name of the attribute that specifies the timeout to keep a
+ * Name of the attribute that specifies the timeout to keep a
* server side connection after answering last client request.
- * The default value is 120000 milliseconds.</p>
+ * The default value is 120000 milliseconds.
*/
public static final String SERVER_CONNECTION_TIMEOUT =
"jmx.remote.x.server.connection.timeout";
@@ -646,9 +646,9 @@
}
/**
- * <p>Name of the attribute that specifies the period in
- * millisecond for a client to check its connection. The default
- * value is 60000 milliseconds.</p>
+ * Name of the attribute that specifies the period in
+ * millisecond for a client to check its connection. The default
+ * value is 60000 milliseconds.
*/
public static final String CLIENT_CONNECTION_CHECK_PERIOD =
"jmx.remote.x.client.connection.check.period";
@@ -741,13 +741,13 @@
}
/**
- * <p>Name of the attribute that specifies whether a connector server
+ * Name of the attribute that specifies whether a connector server
* should not prevent the VM from exiting
*/
public static final String JMX_SERVER_DAEMON = "jmx.remote.x.daemon";
/**
- * Returns true if {@value SERVER_DAEMON} is specified in the {@code env}
+ * Returns true if {@value JMX_SERVER_DAEMON} is specified in the {@code env}
* as a key and its value is a String and it is equal to true ignoring case.
*
* @param env
--- a/jdk/src/java.management/share/classes/javax/management/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/javax/management/package.html Fri May 22 09:50:33 2015 +0200
@@ -30,7 +30,7 @@
<p>Provides the core classes for the Java Management Extensions.</p>
<p>The Java Management Extensions
- (JMX<sup><font size="-1">TM</font></sup>) API is a standard
+ (JMX™) API is a standard
API for management and monitoring. Typical uses include:</p>
<ul>
@@ -87,8 +87,7 @@
notion of <em>Standard MBeans</em>. A Standard MBean is one
whose attributes and operations are deduced from a Java
interface using certain naming patterns, similar to those used
- by JavaBeans<sup><font size="-1">TM</font></sup>. For
- example, consider an interface like this:</p>
+ by JavaBeans™. For example, consider an interface like this:</p>
<pre>
public interface ConfigurationMBean {
--- a/jdk/src/java.management/share/classes/javax/management/remote/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/javax/management/remote/package.html Fri May 22 09:50:33 2015 +0200
@@ -1,6 +1,6 @@
<html>
<head>
- <title>JMX<sup><font size="-2">TM</font></sup> Remote API.</title>
+ <title>JMX™ Remote API.</title>
<!--
Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
--- a/jdk/src/java.management/share/classes/javax/management/remote/rmi/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/javax/management/remote/rmi/package.html Fri May 22 09:50:33 2015 +0200
@@ -387,12 +387,11 @@
@see <a href="{@docRoot}/../technotes/guides/rmi/index.html">
- Java<sup><font size="-1">TM</font></sup> Remote Method
+ Java™ Remote Method
Invocation (RMI)</a>
@see <a href="{@docRoot}/../technotes/guides/jndi/index.html">
- Java Naming and Directory Interface<sup><font
- size="-1">TM</font></sup> (JNDI)</a>
+ Java Naming and Directory Interface™ (JNDI)</a>
@see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045,
section 6.8, "Base64 Content-Transfer-Encoding"</a>
--- a/jdk/src/java.management/share/classes/sun/management/Agent.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/Agent.java Fri May 22 09:50:33 2015 +0200
@@ -345,6 +345,7 @@
if (jmxServer != null) {
ConnectorBootstrap.unexportRegistry();
+ ConnectorAddressLink.unexportRemote();
// Attempt to stop already stopped agent
// Don't cause any errors.
--- a/jdk/src/java.management/share/classes/sun/management/ConnectorAddressLink.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/ConnectorAddressLink.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,6 +27,7 @@
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -45,9 +46,26 @@
* @since 1.5
*/
public class ConnectorAddressLink {
+ /**
+ * A simple wrapper for the perf-counter backing {@linkplain ByteBuffer}
+ */
+ private static final class PerfHandle {
+ private ByteBuffer bb;
+
+ private PerfHandle(ByteBuffer bb) {
+ this.bb = bb.order(ByteOrder.nativeOrder());
+ }
+
+ private void putLong(long l) {
+ this.bb = bb.clear();
+ this.bb.asLongBuffer().put(l);
+ }
+ }
private static final String CONNECTOR_ADDRESS_COUNTER =
"sun.management.JMXConnectorServer.address";
+ private static final String REMOTE_CONNECTOR_STATE_COUNTER =
+ "sun.management.JMXConnectorServer.remote.enabled";
/*
* The format of the jvmstat counters representing the properties of
@@ -78,7 +96,9 @@
* JMX remote connector counter (it will be incremented every
* time a new out-of-the-box JMX remote connector is created).
*/
- private static AtomicInteger counter = new AtomicInteger();
+ private static final AtomicInteger counter = new AtomicInteger();
+
+ private static PerfHandle remotePerfHandle = null;
/**
* Exports the specified connector address to the instrumentation buffer
@@ -93,7 +113,17 @@
}
Perf perf = Perf.getPerf();
perf.createString(
- CONNECTOR_ADDRESS_COUNTER, 1, Units.STRING.intValue(), address);
+ CONNECTOR_ADDRESS_COUNTER, 1, Units.STRING.intValue(), address);
+ }
+
+ public static void unexportRemote() {
+ unexport(remotePerfHandle);
+ }
+
+ private static void unexport(PerfHandle ph) {
+ if (ph != null) {
+ ph.putLong(-1L);
+ }
}
/**
@@ -143,6 +173,13 @@
perf.createString(REMOTE_CONNECTOR_COUNTER_PREFIX + index + "." +
entry.getKey(), 1, Units.STRING.intValue(), entry.getValue());
}
+ if (remotePerfHandle != null) {
+ remotePerfHandle.putLong(index);
+ } else {
+ remotePerfHandle = new PerfHandle(
+ perf.createLong(REMOTE_CONNECTOR_STATE_COUNTER, 1, Units.NONE.intValue(), (long)index)
+ );
+ }
}
/**
--- a/jdk/src/java.management/share/classes/sun/management/HotspotRuntimeMBean.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/HotspotRuntimeMBean.java Fri May 22 09:50:33 2015 +0200
@@ -64,7 +64,7 @@
* Returns a list of internal counters maintained in the Java
* virtual machine for the runtime system.
*
- * @return a <tt>List</tt> of internal counters maintained in the VM
+ * @return a {@code List} of internal counters maintained in the VM
* for the runtime system.
*/
public java.util.List<Counter> getInternalRuntimeCounters();
--- a/jdk/src/java.management/share/classes/sun/management/HotspotThreadMBean.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/HotspotThreadMBean.java Fri May 22 09:50:33 2015 +0200
@@ -40,12 +40,11 @@
public int getInternalThreadCount();
/**
- * Returns a <tt>Map</tt> of the name of all VM internal threads
+ * Returns a {@code Map} of the name of all VM internal threads
* to the thread CPU time in nanoseconds. The returned value is
* of nanoseconds precision but not necessarily nanoseconds accuracy.
- * <p>
*
- * @return a <tt>Map</tt> object of the name of all VM internal threads
+ * @return a {@code Map} object of the name of all VM internal threads
* to the thread CPU time in nanoseconds.
*
* @throws java.lang.UnsupportedOperationException if the Java virtual
--- a/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java Fri May 22 09:50:33 2015 +0200
@@ -45,13 +45,15 @@
* A mapped mxbean type maps a Java type to an open type.
* Only the following Java types are mappable
* (currently required by the platform MXBeans):
- * 1. Primitive types
- * 2. Wrapper classes such java.lang.Integer, etc
- * 3. Classes with only getter methods and with a static "from" method
- * that takes a CompositeData argument.
- * 4. E[] where E is a type of 1-4 (can be multi-dimensional array)
- * 5. List<E> where E is a type of 1-3
- * 6. Map<K, V> where K and V are a type of 1-4
+ * <ol>
+ * <li>Primitive types</li>
+ * <li>Wrapper classes such java.lang.Integer, etc</li>
+ * <li>Classes with only getter methods and with a static "from" method
+ * that takes a CompositeData argument.</li>
+ * <li>{@code E[]} where {@code E} is a type of 1-4 (can be multi-dimensional array)</li>
+ * <li>{@code List<E>} where E is a type of 1-3</li>
+ * <li>{@code Map<K, V>} where {@code K} and {@code V} are a type of 1-4</li>
+ * </ol>
*
* OpenDataException will be thrown if a Java type is not supported.
*/
--- a/jdk/src/java.management/share/classes/sun/management/Sensor.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/Sensor.java Fri May 22 09:50:33 2015 +0200
@@ -34,12 +34,12 @@
* An abstract sensor.
*
* <p>
- * A <tt>AbstractSensor</tt> object consists of two attributes:
+ * A {@code AbstractSensor} object consists of two attributes:
* <ul>
- * <li><tt>on</tt> is a boolean flag indicating if a sensor is
+ * <li>{@code on} is a boolean flag indicating if a sensor is
* triggered. This flag will be set or cleared by the
* component that owns the sensor.</li>
- * <li><tt>count</tt> is the total number of times that a sensor
+ * <li>{@code count} is the total number of times that a sensor
* has been triggered.</li>
* </ul>
*
@@ -54,7 +54,7 @@
private boolean on;
/**
- * Constructs a <tt>Sensor</tt> object.
+ * Constructs a {@code Sensor} object.
*
* @param name The name of this sensor.
*/
@@ -88,8 +88,8 @@
/**
* Tests if this sensor is currently on.
*
- * @return <tt>true</tt> if the sensor is currently on;
- * <tt>false</tt> otherwise.
+ * @return {@code true} if the sensor is currently on;
+ * {@code false} otherwise.
*
*/
public boolean isOn() {
@@ -112,7 +112,7 @@
/**
* Triggers this sensor. This method sets this sensor on
- * and increments the count with the input <tt>increment</tt>.
+ * and increments the count with the input {@code increment}.
*/
public void trigger(int increment) {
synchronized (lock) {
@@ -126,7 +126,7 @@
/**
* Triggers this sensor piggybacking a memory usage object.
* This method sets this sensor on
- * and increments the count with the input <tt>increment</tt>.
+ * and increments the count with the input {@code increment}.
*/
public void trigger(int increment, MemoryUsage usage) {
synchronized (lock) {
@@ -150,7 +150,7 @@
/**
* Clears this sensor
- * and increments the count with the input <tt>increment</tt>.
+ * and increments the count with the input {@code increment}.
*/
public void clear(int increment) {
synchronized (lock) {
--- a/jdk/src/java.management/share/classes/sun/management/counter/Counter.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/counter/Counter.java Fri May 22 09:50:33 2015 +0200
@@ -63,7 +63,7 @@
public Object getValue();
/**
- * Returns <tt>true</tt> if this counter is an internal counter.
+ * Returns {@code true} if this counter is an internal counter.
*/
public boolean isInternal();
--- a/jdk/src/java.management/share/classes/sun/management/counter/perf/InstrumentationException.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/counter/perf/InstrumentationException.java Fri May 22 09:50:33 2015 +0200
@@ -27,14 +27,14 @@
public class InstrumentationException extends RuntimeException {
/**
- * Constructs a <tt>InstrumentationException</tt> with no
+ * Constructs a {@code InstrumentationException} with no
* detail message.
*/
public InstrumentationException() {
}
/**
- * Constructs a <tt>InstrumentationException</tt> with a specified
+ * Constructs a {@code InstrumentationException} with a specified
* detail message.
*
* @param message the detail message
--- a/jdk/src/java.management/share/classes/sun/management/jdp/JdpController.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.management/share/classes/sun/management/jdp/JdpController.java Fri May 22 09:50:33 2015 +0200
@@ -37,19 +37,18 @@
import sun.misc.ManagedLocalsThread;
/**
- * JdpController is responsible to create and manage a broadcast loop
+ * JdpController is responsible to create and manage a broadcast loop.
*
* <p> Other part of code has no access to broadcast loop and have to use
* provided static methods
* {@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService}
- * and {@link #stopDiscoveryService() stopDiscoveryService}</p>
+ * and {@link #stopDiscoveryService() stopDiscoveryService}
* <p>{@link #startDiscoveryService(InetAddress,int,String,String) startDiscoveryService} could be called multiple
- * times as it stops the running service if it is necessary. Call to {@link #stopDiscoveryService() stopDiscoveryService}
- * ignored if service isn't run</p>
+ * times as it stops the running service if it is necessary.
+ * Call to {@link #stopDiscoveryService() stopDiscoveryService}
+ * ignored if service isn't run.
*
*
- * </p>
- *
* <p> System properties below could be used to control broadcast loop behavior.
* Property below have to be set explicitly in command line. It's not possible to
* set it in management.config file. Careless changes of these properties could
@@ -59,9 +58,9 @@
* <li>com.sun.management.jdp.pause - set broadcast interval in seconds</li>
* <li>com.sun.management.jdp.source_addr - an address of interface to use for broadcast</li>
* </ul>
- </p>
+ *
* <p>null parameters values are filtered out on {@link JdpPacketWriter} level and
- * corresponding keys are not placed to packet.</p>
+ * corresponding keys are not placed to packet.
*/
public final class JdpController {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BasicControl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BasicControl.java Fri May 22 09:50:33 2015 +0200
@@ -28,7 +28,7 @@
import javax.naming.ldap.*;
/**
- * This class provides a basic implementation of the <tt>Control</tt>
+ * This class provides a basic implementation of the {@code Control}
* interface. It represents an LDAPv3 Control as defined in RFC-2251.
*
* @author Vincent Ryan
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java Fri May 22 09:50:33 2015 +0200
@@ -295,7 +295,7 @@
* the relative parsed position is not returned.
* @return A non-null array containing the octet string.
* @throws DecodeException If the next byte in the BER buffer is not
- * <tt>tag</tt>, or if length specified in the BER buffer exceeds the
+ * {@code tag}, or if length specified in the BER buffer exceeds the
* number of bytes left in the buffer.
*/
public byte[] parseOctetString(int tag, int rlen[]) throws DecodeException {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventQueue.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventQueue.java Fri May 22 09:50:33 2015 +0200
@@ -73,16 +73,16 @@
// package private;
/**
* Enqueue an event.
- * @param event Either a <tt>NamingExceptionEvent</tt> or a subclass
- * of <tt>NamingEvent</tt> or
- * <tt>UnsolicitedNotificationEvent</tt>.
- * If it is a subclass of <tt>NamingEvent</tt>, all listeners must implement
- * the corresponding subinterface of <tt>NamingListener</tt>.
- * For example, for a <tt>ObjectAddedEvent</tt>, all listeners <em>must</em>
- * implement the <tt>ObjectAddedListener</tt> interface.
+ * @param event Either a {@code NamingExceptionEvent} or a subclass
+ * of {@code NamingEvent} or
+ * {@code UnsolicitedNotificationEvent}.
+ * If it is a subclass of {@code NamingEvent}, all listeners must implement
+ * the corresponding subinterface of {@code NamingListener}.
+ * For example, for a {@code ObjectAddedEvent}, all listeners <em>must</em>
+ * implement the {@code ObjectAddedListener} interface.
* <em>The current implementation does not check this before dispatching
* the event.</em>
- * If the event is a <tt>NamingExceptionEvent</tt>, then all listeners
+ * If the event is a {@code NamingExceptionEvent}, then all listeners
* are notified.
* @param vector List of NamingListeners that will be notified of event.
*/
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventSupport.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/EventSupport.java Fri May 22 09:50:33 2015 +0200
@@ -55,14 +55,14 @@
*<li>The filter (default is "(objectclass=*)").
*<li>The search controls (default is null SearchControls).
*<li>The events that the listener is interested in. This is determined by
- * finding out which <tt>NamingListener</tt> interface the listener supports.
+ * finding out which {@code NamingListener} interface the listener supports.
*</ul>
*<p>
- *A notifier (<tt>NamingEventNotifier</tt>) is a worker thread that is responsible
+ *A notifier ({@code NamingEventNotifier}) is a worker thread that is responsible
*for gathering information for generating events requested by its listeners.
*Each notifier maintains its own list of listeners; these listeners have
*all made the same registration request (at different times) and implements
- *the same <tt>NamingListener</tt> interfaces.
+ *the same {@code NamingListener} interfaces.
*<p>
*For unsolicited listeners, this class maintains a vector, unsolicited.
*When an unsolicited listener is registered, this class adds itself
@@ -93,7 +93,7 @@
*The notifiers are responsible for gather information for generating events
*requested by their respective listeners. When a notifier gets sufficient
*information to generate an event, it creates invokes the
- *appropriate <tt>fireXXXEvent</tt> on this class with the information and list of
+ *appropriate {@code fireXXXEvent} on this class with the information and list of
*listeners. This causes an event and the list of listeners to be added
*to the <em>event queue</em>.
*This class maintains an event queue and a dispatching thread that dequeues
@@ -138,7 +138,7 @@
}
/**
- * Adds <tt>l</tt> to list of listeners interested in <tt>nm</tt>.
+ * Adds {@code l} to list of listeners interested in {@code nm}.
*/
/*
* Make the add/removeNamingListeners synchronized to:
@@ -173,7 +173,7 @@
}
/**
- * Adds <tt>l</tt> to list of listeners interested in <tt>nm</tt>
+ * Adds {@code l} to list of listeners interested in {@code nm}
* and filter.
*/
synchronized void addNamingListener(String nm, String filter,
@@ -201,7 +201,7 @@
}
/**
- * Removes <tt>l</tt> from all notifiers in this context.
+ * Removes {@code l} from all notifiers in this context.
*/
synchronized void removeNamingListener(NamingListener l) {
if (debug) System.err.println("EventSupport removing listener");
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapName.java Fri May 22 09:50:33 2015 +0200
@@ -336,7 +336,7 @@
* characters:
*<ul>
*<li>leading and trailing whitespace
- *<li><pre>, = + < > # ; " \</pre>
+ *<li><pre>{@literal , = + < > # ; " \}</pre>
*</ul>
* If the value is a byte array, it is converted to hex
* notation (such as "#CEB1DF80").
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralException.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapReferralException.java Fri May 22 09:50:33 2015 +0200
@@ -35,7 +35,7 @@
* This exception is raised when a referral to an alternative context
* is encountered.
* <p>
- * An <tt>LdapReferralException</tt> object contains one or more referrals.
+ * An {@code LdapReferralException} object contains one or more referrals.
* Each referral is an alternative location for the same target entry.
* For example, a referral may be an LDAP URL.
* The referrals are attempted in sequence until one is successful or
@@ -46,20 +46,20 @@
* of an authentication error, a referral may be retried with different
* environment properties.
* <p>
- * An <tt>LdapReferralException</tt> object may also contain a reference
- * to a chain of unprocessed <tt>LdapReferralException</tt> objects.
+ * An {@code LdapReferralException} object may also contain a reference
+ * to a chain of unprocessed {@code LdapReferralException} objects.
* Once the current set of referrals have been exhausted and unprocessed
- * <tt>LdapReferralException</tt> objects remain, then the
- * <tt>LdapReferralException</tt> object referenced by the current
+ * {@code LdapReferralException} objects remain, then the
+ * {@code LdapReferralException} object referenced by the current
* object is thrown and the cycle continues.
* <p>
- * If new <tt>LdapReferralException</tt> objects are generated while
+ * If new {@code LdapReferralException} objects are generated while
* following an existing referral then these new objects are appended
- * to the end of the chain of unprocessed <tt>LdapReferralException</tt>
+ * to the end of the chain of unprocessed {@code LdapReferralException}
* objects.
* <p>
* If an exception was recorded while processing a chain of
- * <tt>LdapReferralException</tt> objects then it is throw once
+ * {@code LdapReferralException} objects then it is throw once
* processing has completed.
*
* @author Vincent Ryan
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/UnsolicitedResponseImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/UnsolicitedResponseImpl.java Fri May 22 09:50:33 2015 +0200
@@ -65,7 +65,7 @@
* Retrieves the object identifier of the response.
*
* @return A possibly null object identifier string representing the LDAP
- * <tt>ExtendedResponse.responseName</tt> component.
+ * {@code ExtendedResponse.responseName} component.
*/
public String getID() {
return oid;
@@ -79,7 +79,7 @@
* the response value. It does not include the response OID.
*
* @return A possibly null byte array representing the ASN.1 BER encoded
- * contents of the LDAP <tt>ExtendedResponse.response</tt>
+ * contents of the LDAP {@code ExtendedResponse.response}
* component.
*/
public byte[] getEncodedValue() {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/ext/StartTlsResponseImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/ext/StartTlsResponseImpl.java Fri May 22 09:50:33 2015 +0200
@@ -52,10 +52,10 @@
* The object identifier for StartTLS is 1.3.6.1.4.1.1466.20037
* and no extended response value is defined.
*
- *<p>
+ * <p>
* The Start TLS extended request and response are used to establish
* a TLS connection over the existing LDAP connection associated with
- * the JNDI context on which <tt>extendedOperation()</tt> is invoked.
+ * the JNDI context on which {@code extendedOperation()} is invoked.
*
* @see StartTlsRequest
* @author Vincent Ryan
@@ -124,7 +124,7 @@
/**
* Overrides the default list of cipher suites enabled for use on the
* TLS connection. The cipher suites must have already been listed by
- * <tt>SSLSocketFactory.getSupportedCipherSuites()</tt> as being supported.
+ * {@code SSLSocketFactory.getSupportedCipherSuites()} as being supported.
* Even if a suite has been enabled, it still might not be used because
* the peer does not support it, or because the requisite certificates
* (and private keys) are not available.
@@ -140,12 +140,12 @@
}
/**
- * Overrides the default hostname verifier used by <tt>negotiate()</tt>
+ * Overrides the default hostname verifier used by {@code negotiate()}
* after the TLS handshake has completed. If
- * <tt>setHostnameVerifier()</tt> has not been called before
- * <tt>negotiate()</tt> is invoked, <tt>negotiate()</tt>
+ * {@code setHostnameVerifier()} has not been called before
+ * {@code negotiate()} is invoked, {@code negotiate()}
* will perform a simple case ignore match. If called after
- * <tt>negotiate()</tt>, this method does not do anything.
+ * {@code negotiate()}, this method does not do anything.
*
* @param verifier The non-null hostname verifier callback.
* @see #negotiate
@@ -157,10 +157,10 @@
/**
* Negotiates a TLS session using the default SSL socket factory.
* <p>
- * This method is equivalent to <tt>negotiate(null)</tt>.
+ * This method is equivalent to {@code negotiate(null)}.
*
* @return The negotiated SSL session
- * @throw IOException If an IO error was encountered while establishing
+ * @throws IOException If an IO error was encountered while establishing
* the TLS session.
* @see #setEnabledCipherSuites
* @see #setHostnameVerifier
@@ -177,7 +177,7 @@
* attaches it to the existing connection. Performs the TLS handshake
* and returns the negotiated session information.
* <p>
- * If cipher suites have been set via <tt>setEnabledCipherSuites</tt>
+ * If cipher suites have been set via {@code setEnabledCipherSuites}
* then they are enabled before the TLS handshake begins.
* <p>
* Hostname verification is performed after the TLS handshake completes.
@@ -186,7 +186,7 @@
* hostname is extracted from the subjectAltName in the server's
* certificate (if present). Otherwise the value of the common name
* attribute of the subject name is used. If a callback has
- * been set via <tt>setHostnameVerifier</tt> then that verifier is used if
+ * been set via {@code setHostnameVerifier} then that verifier is used if
* the default check fails.
* <p>
* If an error occurs then the SSL socket is closed and an IOException
@@ -195,7 +195,7 @@
* @param factory The possibly null SSL socket factory to use.
* If null, the default SSL socket factory is used.
* @return The negotiated SSL session
- * @throw IOException If an IO error was encountered while establishing
+ * @throws IOException If an IO error was encountered while establishing
* the TLS session.
* @see #setEnabledCipherSuites
* @see #setHostnameVerifier
@@ -252,7 +252,7 @@
* Closes the TLS connection gracefully and reverts back to the underlying
* connection.
*
- * @throw IOException If an IO error was encountered while closing the
+ * @throws IOException If an IO error was encountered while closing the
* TLS connection
*/
public void close() throws IOException {
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/LdapSasl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/LdapSasl.java Fri May 22 09:50:33 2015 +0200
@@ -72,12 +72,12 @@
* property has not been set, Context.SECURITY_PRINCIPAL is used.
* If SASL_CALLBACK has been set, use that instead of the default
* CallbackHandler.
- *<p>
+ * <p>
* If bind is successful and the selected SASL mechanism has a security
* layer, set inStream and outStream to be filter streams that use
* the security layer. These will be used for subsequent communication
* with the server.
- *<p>
+ *
* @param conn The non-null connection to use for sending an LDAP BIND
* @param server Non-null string name of host to connect to
* @param dn Non-null DN to bind as; also used as authentication ID
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java Fri May 22 09:50:33 2015 +0200
@@ -329,7 +329,7 @@
*<p>
* After this method is called, isContinuing() returns true.
*
- * @param resObj The possibly null resolved object.
+ * @param obj The possibly null resolved object.
* @param relResName The non-null resolved name relative to currCtx.
* @param currCtx The non-null context from which relResName is to be resolved.
*/
@@ -349,7 +349,7 @@
*<p>
* After this method is called, isContinuing() returns true.
*
- * @param resObj The possibly null resolved object.
+ * @param obj The possibly null resolved object.
* @param relResName The non-null resolved name relative to currCtx.
* @param currCtx The non-null context from which relResName is to be resolved.
* @param remain The non-null remaining name.
@@ -366,7 +366,7 @@
/**
* String overload.
*
- * @param resObj The possibly null resolved object.
+ * @param obj The possibly null resolved object.
* @param relResName The non-null resolved name relative to currCtx.
* @param currCtx The non-null context from which relResName is to be resolved.
* @param remain The non-null remaining name.
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/ctx/PartialCompositeContext.java Fri May 22 09:50:33 2015 +0200
@@ -452,14 +452,14 @@
* nonempty component, and if 'prefix' ends with an empty component or
* 'name' starts with one, then one empty component is dropped.
* For example:
- * <pre>
+ * <pre>{@code
* elideEmpty=false elideEmpty=true
* {"a"} + {"b"} => {"a", "b"} {"a", "b"}
* {"a"} + {""} => {"a", ""} {"a", ""}
* {"a"} + {"", "b"} => {"a", "", "b"} {"a", "b"}
* {"a", ""} + {"b", ""} => {"a", "", "b", ""} {"a", "b", ""}
* {"a", ""} + {"", "b"} => {"a", "", "", "b"} {"a", "", "b"}
- * </pre>
+ * }</pre>
*/
public Name composeName(Name name, Name prefix) throws NamingException {
Name res = (Name)prefix.clone();
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/HierMemDirCtx.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/HierMemDirCtx.java Fri May 22 09:50:33 2015 +0200
@@ -32,8 +32,8 @@
/**
* A sample service provider that implements a hierarchical directory in memory.
* Every operation begins by doing a lookup on the name passed to it and then
- * calls a corresponding "do<OperationName>" on the result of the lookup. The
- * "do<OperationName>" does the work without any further resolution (it assumes
+ * calls a corresponding "{@code do<OperationName>}" on the result of the lookup. The
+ * "{@code do<OperationName>}" does the work without any further resolution (it assumes
* that it is the target context).
*/
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/dir/SearchFilter.java Fri May 22 09:50:33 2015 +0200
@@ -548,8 +548,8 @@
/**
- * Finds the first occurrence of <tt>ch</tt> in <tt>val</tt> starting
- * from position <tt>start</tt>. It doesn't count if <tt>ch</tt>
+ * Finds the first occurrence of {@code ch} in {@code val} starting
+ * from position {@code start}. It doesn't count if {@code ch}
* has been escaped by a backslash (\)
*/
public static int findUnescaped(char ch, String val, int start) {
@@ -568,8 +568,8 @@
}
/**
- * Formats the expression <tt>expr</tt> using arguments from the array
- * <tt>args</tt>.
+ * Formats the expression {@code expr} using arguments from the array
+ * {@code args}.
*
* <code>{i}</code> specifies the <code>i</code>'th element from
* the array <code>args</code> is to be substituted for the
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/GenericURLContext.java Fri May 22 09:50:33 2015 +0200
@@ -107,12 +107,14 @@
* the subclass must override getURLSuffix() to get the correct behavior.
* Remember, the behavior must match getRootURLContext().
*
+ * <pre>{@code
* URL Suffix
* foo://host:port <empty string>
* foo://host:port/rest/of/name rest/of/name
* foo:///rest/of/name rest/of/name
* foo:/rest/of/name rest/of/name
* foo:rest/of/name rest/of/name
+ * }</pre>
*/
protected Name getURLSuffix(String prefix, String url) throws NamingException {
String suffix = url.substring(prefix.length());
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/Uri.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/toolkit/url/Uri.java Fri May 22 09:50:33 2015 +0200
@@ -47,7 +47,7 @@
* still run on pre-1.4 platforms not containing that class.
*
* <p> The format of an absolute URI (see the RFCs mentioned above) is:
- * <p><blockquote><pre>
+ * <blockquote><pre>{@code
* absoluteURI = scheme ":" ( hier_part | opaque_part )
*
* scheme = alpha *( alpha | digit | "+" | "-" | "." )
@@ -94,12 +94,12 @@
* mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
* escaped = "%" hex hex
* unwise = "{" | "}" | "|" | "\" | "^" | "`"
- * </pre></blockquote>
+ * }</pre></blockquote>
*
- * <p> Currently URIs containing <tt>userinfo</tt> or <tt>reg_name</tt>
+ * <p> Currently URIs containing {@code userinfo} or {@code reg_name}
* are not supported.
- * The <tt>opaque_part</tt> of a non-hierarchical URI is treated as if
- * if were a <tt>path</tt> without a leading slash.
+ * The {@code opaque_part} of a non-hierarchical URI is treated as if
+ * if were a {@code path} without a leading slash.
*/
--- a/jdk/src/java.naming/share/classes/javax/naming/directory/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/javax/naming/directory/package.html Fri May 22 09:50:33 2015 +0200
@@ -33,7 +33,7 @@
<p>
This package defines the directory operations of the Java Naming and
-Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/event/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/javax/naming/event/package.html Fri May 22 09:50:33 2015 +0200
@@ -33,7 +33,7 @@
<p>
This package defines the event notification operations of the Java Naming
-and Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+and Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/ldap/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/javax/naming/ldap/package.html Fri May 22 09:50:33 2015 +0200
@@ -33,7 +33,7 @@
<p>
This package extends the directory operations of the Java Naming and
-Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/javax/naming/package.html Fri May 22 09:50:33 2015 +0200
@@ -32,7 +32,7 @@
<p>
This package defines the naming operations of the Java Naming and
-Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- a/jdk/src/java.naming/share/classes/javax/naming/spi/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/javax/naming/spi/package.html Fri May 22 09:50:33 2015 +0200
@@ -34,7 +34,7 @@
<p>
This package defines the service provider interface (SPI) of the Java Naming
-and Directory Interface<font size=-2><sup>TM</sup></font> (JNDI).
+and Directory Interface™ (JNDI).
JNDI provides naming and directory functionality to applications
written in the Java programming language. It is designed to be
independent of any specific naming or directory service
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/JdkLDAP.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.security.provider.certpath.ldap;
+
+import java.util.HashMap;
+import java.util.List;
+import java.security.Provider;
+import java.security.NoSuchAlgorithmException;
+import java.security.InvalidParameterException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.ProviderException;
+import java.security.cert.CertStoreParameters;
+
+/**
+ * Provider class for the JdkLDAP provider.
+ * Supports LDAP cert store.
+ *
+ * @since 1.9
+ */
+public final class JdkLDAP extends Provider {
+
+ private static final long serialVersionUID = -2279741232933606418L;
+
+ private static final class ProviderService extends Provider.Service {
+ ProviderService(Provider p, String type, String algo, String cn,
+ List<String> aliases, HashMap<String, String> attrs) {
+ super(p, type, algo, cn, aliases, attrs);
+ }
+
+ @Override
+ public Object newInstance(Object ctrParamObj)
+ throws NoSuchAlgorithmException {
+ String type = getType();
+ String algo = getAlgorithm();
+ if (type.equals("CertStore") && algo.equals("LDAP")) {
+ if (ctrParamObj != null &&
+ !(ctrParamObj instanceof CertStoreParameters)) {
+ throw new InvalidParameterException
+ ("constructorParameter must be instanceof CertStoreParameters");
+ }
+ try {
+ return new LDAPCertStore((CertStoreParameters) ctrParamObj);
+ } catch (Exception ex) {
+ throw new NoSuchAlgorithmException("Error constructing " +
+ type + " for " + algo + " using JdkLDAP", ex);
+ }
+ }
+ throw new ProviderException("No impl for " + algo + " " + type);
+ }
+ }
+
+ public JdkLDAP() {
+ super("JdkLDAP", 1.9d, "JdkLDAP Provider (implements LDAP CertStore)");
+
+ HashMap<String, String> attrs = new HashMap<>(2);
+ attrs.put("LDAPSchema", "RFC2587");
+ attrs.put("ImplementedIn", "Software");
+
+ /*
+ * CertStore
+ * attrs: LDAPSchema, ImplementedIn
+ */
+ putService(new ProviderService(this, "CertStore",
+ "LDAP", "sun.security.provider.certpath.ldap.LDAPCertStore",
+ null, attrs));
+ }
+}
--- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Fri May 22 09:50:33 2015 +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,29 +25,15 @@
package sun.security.provider.certpath.ldap;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
import java.math.BigInteger;
import java.net.URI;
import java.util.*;
-import javax.naming.Context;
-import javax.naming.NamingEnumeration;
-import javax.naming.NamingException;
-import javax.naming.NameNotFoundException;
-import javax.naming.directory.Attribute;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.BasicAttributes;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.*;
-import javax.naming.CommunicationException;
-import javax.naming.ldap.InitialLdapContext;
-import javax.naming.ldap.LdapContext;
import javax.security.auth.x500.X500Principal;
-import sun.misc.HexDumpEncoder;
-import sun.security.provider.certpath.X509CertificatePair;
import sun.security.util.Cache;
import sun.security.util.Debug;
import sun.security.x509.X500Name;
@@ -109,480 +95,124 @@
private final static boolean DEBUG = false;
- /**
- * LDAP attribute identifiers.
- */
- private static final String USER_CERT = "userCertificate;binary";
- private static final String CA_CERT = "cACertificate;binary";
- private static final String CROSS_CERT = "crossCertificatePair;binary";
- private static final String CRL = "certificateRevocationList;binary";
- private static final String ARL = "authorityRevocationList;binary";
- private static final String DELTA_CRL = "deltaRevocationList;binary";
+ private String ldapDN;
+
+ private LDAPCertStoreImpl impl;
+
+ public LDAPCertStore(CertStoreParameters params)
+ throws InvalidAlgorithmParameterException {
+ super(params);
- // Constants for various empty values
- private final static String[] STRING0 = new String[0];
-
- private final static byte[][] BB0 = new byte[0][];
-
- private final static Attributes EMPTY_ATTRIBUTES = new BasicAttributes();
-
- // cache related constants
- private final static int DEFAULT_CACHE_SIZE = 750;
- private final static int DEFAULT_CACHE_LIFETIME = 30;
+ String serverName;
+ int port;
+ String dn = null;
+ if (params == null) {
+ throw new InvalidAlgorithmParameterException(
+ "parameters required for LDAP Certore");
+ }
+ if (params instanceof LDAPCertStoreParameters) {
+ LDAPCertStoreParameters p = (LDAPCertStoreParameters) params;
+ serverName = p.getServerName();
+ port = p.getPort();
+ } else if (params instanceof URICertStoreParameters) {
+ URICertStoreParameters p = (URICertStoreParameters) params;
+ URI u = p.getURI();
+ if (!u.getScheme().equalsIgnoreCase("ldap")) {
+ throw new InvalidAlgorithmParameterException(
+ "Only LDAP URIs are supported for LDAP Certore");
+ }
+ // Use the same default values as in LDAPCertStoreParameters
+ // if unspecified in URI
+ serverName = u.getHost();
+ if (serverName == null) {
+ serverName = "localhost";
+ }
+ port = u.getPort();
+ if (port == -1) {
+ port = 389;
+ }
+ dn = u.getPath();
+ if (dn != null && dn.charAt(0) == '/') {
+ dn = dn.substring(1);
+ }
+ } else {
+ throw new InvalidAlgorithmParameterException(
+ "parameters must be either LDAPCertStoreParameters or " +
+ "URICertStoreParameters");
+ }
- private final static int LIFETIME;
+ Key k = new Key(serverName, port);
+ LDAPCertStoreImpl lci = certStoreCache.get(k);
+ if (lci == null) {
+ this.impl = new LDAPCertStoreImpl(serverName, port);
+ certStoreCache.put(k, impl);
+ } else {
+ this.impl = lci;
+ if (debug != null) {
+ debug.println("LDAPCertStore.getInstance: cache hit");
+ }
+ }
+ this.ldapDN = dn;
+ }
- private final static String PROP_LIFETIME =
- "sun.security.certpath.ldap.cache.lifetime";
+ private static class Key {
+ volatile int hashCode;
+
+ String serverName;
+ int port;
- /*
- * Internal system property, that when set to "true", disables the
- * JNDI application resource files lookup to prevent recursion issues
- * when validating signed JARs with LDAP URLs in certificates.
- */
- private final static String PROP_DISABLE_APP_RESOURCE_FILES =
- "sun.security.certpath.ldap.disable.app.resource.files";
+ Key(String serverName, int port) {
+ this.serverName = serverName;
+ this.port = port;
+ }
- static {
- String s = AccessController.doPrivileged(
- (PrivilegedAction<String>) () -> System.getProperty(PROP_LIFETIME));
- if (s != null) {
- LIFETIME = Integer.parseInt(s); // throws NumberFormatException
- } else {
- LIFETIME = DEFAULT_CACHE_LIFETIME;
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof Key)) {
+ return false;
+ }
+ Key key = (Key) obj;
+ return (port == key.port &&
+ serverName.equalsIgnoreCase(key.serverName));
+ }
+
+ @Override
+ public int hashCode() {
+ if (hashCode == 0) {
+ int result = 17;
+ result = 37*result + port;
+ result = 37*result +
+ serverName.toLowerCase(Locale.ENGLISH).hashCode();
+ hashCode = result;
+ }
+ return hashCode;
}
}
/**
- * The CertificateFactory used to decode certificates from
- * their binary stored form.
- */
- private CertificateFactory cf;
- /**
- * The JNDI directory context.
- */
- private LdapContext ctx;
-
- /**
- * Flag indicating that communication error occurred.
- */
- private boolean communicationError = false;
-
- /**
- * Flag indicating whether we should prefetch CRLs.
- */
- private boolean prefetchCRLs = false;
-
- private final Cache<String, byte[][]> valueCache;
-
- private int cacheHits = 0;
- private int cacheMisses = 0;
- private int requests = 0;
-
- /**
- * Creates a <code>CertStore</code> with the specified parameters.
- * For this class, the parameters object must be an instance of
- * <code>LDAPCertStoreParameters</code>.
- *
- * @param params the algorithm parameters
- * @exception InvalidAlgorithmParameterException if params is not an
- * instance of <code>LDAPCertStoreParameters</code>
+ * Returns an LDAPCertStoreImpl object. This method consults a cache of
+ * LDAPCertStoreImpl objects (shared per JVM) using the corresponding
+ * LDAP server name and port info as a key.
*/
- public LDAPCertStore(CertStoreParameters params)
- throws InvalidAlgorithmParameterException {
- super(params);
- if (!(params instanceof LDAPCertStoreParameters))
- throw new InvalidAlgorithmParameterException(
- "parameters must be LDAPCertStoreParameters");
-
- LDAPCertStoreParameters lparams = (LDAPCertStoreParameters) params;
-
- // Create InitialDirContext needed to communicate with the server
- createInitialDirContext(lparams.getServerName(), lparams.getPort());
+ private static final Cache<Key, LDAPCertStoreImpl>
+ certStoreCache = Cache.newSoftMemoryCache(185);
- // Create CertificateFactory for use later on
- try {
- cf = CertificateFactory.getInstance("X.509");
- } catch (CertificateException e) {
- throw new InvalidAlgorithmParameterException(
- "unable to create CertificateFactory for X.509");
- }
- if (LIFETIME == 0) {
- valueCache = Cache.newNullCache();
- } else if (LIFETIME < 0) {
- valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE);
- } else {
- valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE, LIFETIME);
- }
- }
-
- /**
- * Returns an LDAP CertStore. This method consults a cache of
- * CertStores (shared per JVM) using the LDAP server/port as a key.
- */
- private static final Cache<LDAPCertStoreParameters, CertStore>
- certStoreCache = Cache.newSoftMemoryCache(185);
- static synchronized CertStore getInstance(LDAPCertStoreParameters params)
+ // Exist solely for regression test for ensuring that caching is done
+ static synchronized LDAPCertStoreImpl getInstance(LDAPCertStoreParameters params)
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
- // if necessary, convert params to SunLDAPCertStoreParameters because
- // LDAPCertStoreParameters does not override equals() and hashCode()
- if (! (params instanceof SunLDAPCertStoreParameters)) {
- params = new SunLDAPCertStoreParameters(params.getServerName(), params.getPort());
- }
- CertStore lcs = certStoreCache.get(params);
- if (lcs == null) {
- lcs = CertStore.getInstance("LDAP", params);
- certStoreCache.put(params, lcs);
+ String serverName = params.getServerName();
+ int port = params.getPort();
+ Key k = new Key(serverName, port);
+ LDAPCertStoreImpl lci = certStoreCache.get(k);
+ if (lci == null) {
+ lci = new LDAPCertStoreImpl(serverName, port);
+ certStoreCache.put(k, lci);
} else {
if (debug != null) {
debug.println("LDAPCertStore.getInstance: cache hit");
}
}
- return lcs;
- }
-
- /**
- * Create InitialDirContext.
- *
- * @param server Server DNS name hosting LDAP service
- * @param port Port at which server listens for requests
- * @throws InvalidAlgorithmParameterException if creation fails
- */
- private void createInitialDirContext(String server, int port)
- throws InvalidAlgorithmParameterException {
- String url = "ldap://" + server + ":" + port;
- Hashtable<String,Object> env = new Hashtable<>();
- env.put(Context.INITIAL_CONTEXT_FACTORY,
- "com.sun.jndi.ldap.LdapCtxFactory");
- env.put(Context.PROVIDER_URL, url);
-
- // If property is set to true, disable application resource file lookup.
- boolean disableAppResourceFiles = AccessController.doPrivileged(
- (PrivilegedAction<Boolean>) () -> Boolean.getBoolean(PROP_DISABLE_APP_RESOURCE_FILES));
- if (disableAppResourceFiles) {
- if (debug != null) {
- debug.println("LDAPCertStore disabling app resource files");
- }
- env.put("com.sun.naming.disable.app.resource.files", "true");
- }
-
- try {
- ctx = new InitialLdapContext(env, null);
- /*
- * By default, follow referrals unless application has
- * overridden property in an application resource file.
- */
- Hashtable<?,?> currentEnv = ctx.getEnvironment();
- if (currentEnv.get(Context.REFERRAL) == null) {
- ctx.addToEnvironment(Context.REFERRAL, "follow");
- }
- } catch (NamingException e) {
- if (debug != null) {
- debug.println("LDAPCertStore.engineInit about to throw "
- + "InvalidAlgorithmParameterException");
- e.printStackTrace();
- }
- Exception ee = new InvalidAlgorithmParameterException
- ("unable to create InitialDirContext using supplied parameters");
- ee.initCause(e);
- throw (InvalidAlgorithmParameterException)ee;
- }
- }
-
- /**
- * Private class encapsulating the actual LDAP operations and cache
- * handling. Use:
- *
- * LDAPRequest request = new LDAPRequest(dn);
- * request.addRequestedAttribute(CROSS_CERT);
- * request.addRequestedAttribute(CA_CERT);
- * byte[][] crossValues = request.getValues(CROSS_CERT);
- * byte[][] caValues = request.getValues(CA_CERT);
- *
- * At most one LDAP request is sent for each instance created. If all
- * getValues() calls can be satisfied from the cache, no request
- * is sent at all. If a request is sent, all requested attributes
- * are always added to the cache irrespective of whether the getValues()
- * method is called.
- */
- private class LDAPRequest {
-
- private final String name;
- private Map<String, byte[][]> valueMap;
- private final List<String> requestedAttributes;
-
- LDAPRequest(String name) {
- this.name = name;
- requestedAttributes = new ArrayList<>(5);
- }
-
- String getName() {
- return name;
- }
-
- void addRequestedAttribute(String attrId) {
- if (valueMap != null) {
- throw new IllegalStateException("Request already sent");
- }
- requestedAttributes.add(attrId);
- }
-
- /**
- * Gets one or more binary values from an attribute.
- *
- * @param name the location holding the attribute
- * @param attrId the attribute identifier
- * @return an array of binary values (byte arrays)
- * @throws NamingException if a naming exception occurs
- */
- byte[][] getValues(String attrId) throws NamingException {
- if (DEBUG && ((cacheHits + cacheMisses) % 50 == 0)) {
- System.out.println("Cache hits: " + cacheHits + "; misses: "
- + cacheMisses);
- }
- String cacheKey = name + "|" + attrId;
- byte[][] values = valueCache.get(cacheKey);
- if (values != null) {
- cacheHits++;
- return values;
- }
- cacheMisses++;
- Map<String, byte[][]> attrs = getValueMap();
- values = attrs.get(attrId);
- return values;
- }
-
- /**
- * Get a map containing the values for this request. The first time
- * this method is called on an object, the LDAP request is sent,
- * the results parsed and added to a private map and also to the
- * cache of this LDAPCertStore. Subsequent calls return the private
- * map immediately.
- *
- * The map contains an entry for each requested attribute. The
- * attribute name is the key, values are byte[][]. If there are no
- * values for that attribute, values are byte[0][].
- *
- * @return the value Map
- * @throws NamingException if a naming exception occurs
- */
- private Map<String, byte[][]> getValueMap() throws NamingException {
- if (valueMap != null) {
- return valueMap;
- }
- if (DEBUG) {
- System.out.println("Request: " + name + ":" + requestedAttributes);
- requests++;
- if (requests % 5 == 0) {
- System.out.println("LDAP requests: " + requests);
- }
- }
- valueMap = new HashMap<>(8);
- String[] attrIds = requestedAttributes.toArray(STRING0);
- Attributes attrs;
-
- if (communicationError) {
- ctx.reconnect(null);
- communicationError = false;
- }
-
- try {
- attrs = ctx.getAttributes(name, attrIds);
- } catch (CommunicationException ce) {
- communicationError = true;
- throw ce;
- } catch (NameNotFoundException e) {
- // name does not exist on this LDAP server
- // treat same as not attributes found
- attrs = EMPTY_ATTRIBUTES;
- }
- for (String attrId : requestedAttributes) {
- Attribute attr = attrs.get(attrId);
- byte[][] values = getAttributeValues(attr);
- cacheAttribute(attrId, values);
- valueMap.put(attrId, values);
- }
- return valueMap;
- }
-
- /**
- * Add the values to the cache.
- */
- private void cacheAttribute(String attrId, byte[][] values) {
- String cacheKey = name + "|" + attrId;
- valueCache.put(cacheKey, values);
- }
-
- /**
- * Get the values for the given attribute. If the attribute is null
- * or does not contain any values, a zero length byte array is
- * returned. NOTE that it is assumed that all values are byte arrays.
- */
- private byte[][] getAttributeValues(Attribute attr)
- throws NamingException {
- byte[][] values;
- if (attr == null) {
- values = BB0;
- } else {
- values = new byte[attr.size()][];
- int i = 0;
- NamingEnumeration<?> enum_ = attr.getAll();
- while (enum_.hasMore()) {
- Object obj = enum_.next();
- if (debug != null) {
- if (obj instanceof String) {
- debug.println("LDAPCertStore.getAttrValues() "
- + "enum.next is a string!: " + obj);
- }
- }
- byte[] value = (byte[])obj;
- values[i++] = value;
- }
- }
- return values;
- }
-
- }
-
- /*
- * Gets certificates from an attribute id and location in the LDAP
- * directory. Returns a Collection containing only the Certificates that
- * match the specified CertSelector.
- *
- * @param name the location holding the attribute
- * @param id the attribute identifier
- * @param sel a CertSelector that the Certificates must match
- * @return a Collection of Certificates found
- * @throws CertStoreException if an exception occurs
- */
- private Collection<X509Certificate> getCertificates(LDAPRequest request,
- String id, X509CertSelector sel) throws CertStoreException {
-
- /* fetch encoded certs from storage */
- byte[][] encodedCert;
- try {
- encodedCert = request.getValues(id);
- } catch (NamingException namingEx) {
- throw new CertStoreException(namingEx);
- }
-
- int n = encodedCert.length;
- if (n == 0) {
- return Collections.emptySet();
- }
-
- List<X509Certificate> certs = new ArrayList<>(n);
- /* decode certs and check if they satisfy selector */
- for (int i = 0; i < n; i++) {
- ByteArrayInputStream bais = new ByteArrayInputStream(encodedCert[i]);
- try {
- Certificate cert = cf.generateCertificate(bais);
- if (sel.match(cert)) {
- certs.add((X509Certificate)cert);
- }
- } catch (CertificateException e) {
- if (debug != null) {
- debug.println("LDAPCertStore.getCertificates() encountered "
- + "exception while parsing cert, skipping the bad data: ");
- HexDumpEncoder encoder = new HexDumpEncoder();
- debug.println(
- "[ " + encoder.encodeBuffer(encodedCert[i]) + " ]");
- }
- }
- }
-
- return certs;
- }
-
- /*
- * Gets certificate pairs from an attribute id and location in the LDAP
- * directory.
- *
- * @param name the location holding the attribute
- * @param id the attribute identifier
- * @return a Collection of X509CertificatePairs found
- * @throws CertStoreException if an exception occurs
- */
- private Collection<X509CertificatePair> getCertPairs(
- LDAPRequest request, String id) throws CertStoreException {
-
- /* fetch the encoded cert pairs from storage */
- byte[][] encodedCertPair;
- try {
- encodedCertPair = request.getValues(id);
- } catch (NamingException namingEx) {
- throw new CertStoreException(namingEx);
- }
-
- int n = encodedCertPair.length;
- if (n == 0) {
- return Collections.emptySet();
- }
-
- List<X509CertificatePair> certPairs = new ArrayList<>(n);
- /* decode each cert pair and add it to the Collection */
- for (int i = 0; i < n; i++) {
- try {
- X509CertificatePair certPair =
- X509CertificatePair.generateCertificatePair(encodedCertPair[i]);
- certPairs.add(certPair);
- } catch (CertificateException e) {
- if (debug != null) {
- debug.println(
- "LDAPCertStore.getCertPairs() encountered exception "
- + "while parsing cert, skipping the bad data: ");
- HexDumpEncoder encoder = new HexDumpEncoder();
- debug.println(
- "[ " + encoder.encodeBuffer(encodedCertPair[i]) + " ]");
- }
- }
- }
-
- return certPairs;
- }
-
- /*
- * Looks at certificate pairs stored in the crossCertificatePair attribute
- * at the specified location in the LDAP directory. Returns a Collection
- * containing all Certificates stored in the forward component that match
- * the forward CertSelector and all Certificates stored in the reverse
- * component that match the reverse CertSelector.
- * <p>
- * If either forward or reverse is null, all certificates from the
- * corresponding component will be rejected.
- *
- * @param name the location to look in
- * @param forward the forward CertSelector (or null)
- * @param reverse the reverse CertSelector (or null)
- * @return a Collection of Certificates found
- * @throws CertStoreException if an exception occurs
- */
- private Collection<X509Certificate> getMatchingCrossCerts(
- LDAPRequest request, X509CertSelector forward,
- X509CertSelector reverse)
- throws CertStoreException {
- // Get the cert pairs
- Collection<X509CertificatePair> certPairs =
- getCertPairs(request, CROSS_CERT);
-
- // Find Certificates that match and put them in a list
- ArrayList<X509Certificate> matchingCerts = new ArrayList<>();
- for (X509CertificatePair certPair : certPairs) {
- X509Certificate cert;
- if (forward != null) {
- cert = certPair.getForward();
- if ((cert != null) && forward.match(cert)) {
- matchingCerts.add(cert);
- }
- }
- if (reverse != null) {
- cert = certPair.getReverse();
- if ((cert != null) && reverse.match(cert)) {
- matchingCerts.add(cert);
- }
- }
- }
- return matchingCerts;
+ return lci;
}
/**
@@ -612,159 +242,12 @@
debug.println("LDAPCertStore.engineGetCertificates() selector: "
+ String.valueOf(selector));
}
-
if (selector == null) {
selector = new X509CertSelector();
- }
- if (!(selector instanceof X509CertSelector)) {
- throw new CertStoreException("LDAPCertStore needs an X509CertSelector " +
- "to find certs");
- }
- X509CertSelector xsel = (X509CertSelector) selector;
- int basicConstraints = xsel.getBasicConstraints();
- String subject = xsel.getSubjectAsString();
- String issuer = xsel.getIssuerAsString();
- HashSet<X509Certificate> certs = new HashSet<>();
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() basicConstraints: "
- + basicConstraints);
- }
-
- // basicConstraints:
- // -2: only EE certs accepted
- // -1: no check is done
- // 0: any CA certificate accepted
- // >1: certificate's basicConstraints extension pathlen must match
- if (subject != null) {
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() "
- + "subject is not null");
- }
- LDAPRequest request = new LDAPRequest(subject);
- if (basicConstraints > -2) {
- request.addRequestedAttribute(CROSS_CERT);
- request.addRequestedAttribute(CA_CERT);
- request.addRequestedAttribute(ARL);
- if (prefetchCRLs) {
- request.addRequestedAttribute(CRL);
- }
- }
- if (basicConstraints < 0) {
- request.addRequestedAttribute(USER_CERT);
- }
-
- if (basicConstraints > -2) {
- certs.addAll(getMatchingCrossCerts(request, xsel, null));
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() after "
- + "getMatchingCrossCerts(subject,xsel,null),certs.size(): "
- + certs.size());
- }
- certs.addAll(getCertificates(request, CA_CERT, xsel));
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() after "
- + "getCertificates(subject,CA_CERT,xsel),certs.size(): "
- + certs.size());
- }
- }
- if (basicConstraints < 0) {
- certs.addAll(getCertificates(request, USER_CERT, xsel));
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() after "
- + "getCertificates(subject,USER_CERT, xsel),certs.size(): "
- + certs.size());
- }
- }
- } else {
- if (debug != null) {
- debug.println
- ("LDAPCertStore.engineGetCertificates() subject is null");
- }
- if (basicConstraints == -2) {
- throw new CertStoreException("need subject to find EE certs");
- }
- if (issuer == null) {
- throw new CertStoreException("need subject or issuer to find certs");
- }
+ } else if (!(selector instanceof X509CertSelector)) {
+ throw new CertStoreException("need X509CertSelector to find certs");
}
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() about to "
- + "getMatchingCrossCerts...");
- }
- if ((issuer != null) && (basicConstraints > -2)) {
- LDAPRequest request = new LDAPRequest(issuer);
- request.addRequestedAttribute(CROSS_CERT);
- request.addRequestedAttribute(CA_CERT);
- request.addRequestedAttribute(ARL);
- if (prefetchCRLs) {
- request.addRequestedAttribute(CRL);
- }
-
- certs.addAll(getMatchingCrossCerts(request, null, xsel));
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() after "
- + "getMatchingCrossCerts(issuer,null,xsel),certs.size(): "
- + certs.size());
- }
- certs.addAll(getCertificates(request, CA_CERT, xsel));
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() after "
- + "getCertificates(issuer,CA_CERT,xsel),certs.size(): "
- + certs.size());
- }
- }
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCertificates() returning certs");
- }
- return certs;
- }
-
- /*
- * Gets CRLs from an attribute id and location in the LDAP directory.
- * Returns a Collection containing only the CRLs that match the
- * specified CRLSelector.
- *
- * @param name the location holding the attribute
- * @param id the attribute identifier
- * @param sel a CRLSelector that the CRLs must match
- * @return a Collection of CRLs found
- * @throws CertStoreException if an exception occurs
- */
- private Collection<X509CRL> getCRLs(LDAPRequest request, String id,
- X509CRLSelector sel) throws CertStoreException {
-
- /* fetch the encoded crls from storage */
- byte[][] encodedCRL;
- try {
- encodedCRL = request.getValues(id);
- } catch (NamingException namingEx) {
- throw new CertStoreException(namingEx);
- }
-
- int n = encodedCRL.length;
- if (n == 0) {
- return Collections.emptySet();
- }
-
- List<X509CRL> crls = new ArrayList<>(n);
- /* decode each crl and check if it matches selector */
- for (int i = 0; i < n; i++) {
- try {
- CRL crl = cf.generateCRL(new ByteArrayInputStream(encodedCRL[i]));
- if (sel.match(crl)) {
- crls.add((X509CRL)crl);
- }
- } catch (CRLException e) {
- if (debug != null) {
- debug.println("LDAPCertStore.getCRLs() encountered exception"
- + " while parsing CRL, skipping the bad data: ");
- HexDumpEncoder encoder = new HexDumpEncoder();
- debug.println("[ " + encoder.encodeBuffer(encodedCRL[i]) + " ]");
- }
- }
- }
-
- return crls;
+ return impl.getCertificates((X509CertSelector) selector, ldapDN);
}
/**
@@ -797,314 +280,9 @@
// Set up selector and collection to hold CRLs
if (selector == null) {
selector = new X509CRLSelector();
- }
- if (!(selector instanceof X509CRLSelector)) {
+ } else if (!(selector instanceof X509CRLSelector)) {
throw new CertStoreException("need X509CRLSelector to find CRLs");
}
- X509CRLSelector xsel = (X509CRLSelector) selector;
- HashSet<X509CRL> crls = new HashSet<>();
-
- // Look in directory entry for issuer of cert we're checking.
- Collection<Object> issuerNames;
- X509Certificate certChecking = xsel.getCertificateChecking();
- if (certChecking != null) {
- issuerNames = new HashSet<>();
- X500Principal issuer = certChecking.getIssuerX500Principal();
- issuerNames.add(issuer.getName(X500Principal.RFC2253));
- } else {
- // But if we don't know which cert we're checking, try the directory
- // entries of all acceptable CRL issuers
- issuerNames = xsel.getIssuerNames();
- if (issuerNames == null) {
- throw new CertStoreException("need issuerNames or certChecking to "
- + "find CRLs");
- }
- }
- for (Object nameObject : issuerNames) {
- String issuerName;
- if (nameObject instanceof byte[]) {
- try {
- X500Principal issuer = new X500Principal((byte[])nameObject);
- issuerName = issuer.getName(X500Principal.RFC2253);
- } catch (IllegalArgumentException e) {
- continue;
- }
- } else {
- issuerName = (String)nameObject;
- }
- // If all we want is CA certs, try to get the (probably shorter) ARL
- Collection<X509CRL> entryCRLs = Collections.emptySet();
- if (certChecking == null || certChecking.getBasicConstraints() != -1) {
- LDAPRequest request = new LDAPRequest(issuerName);
- request.addRequestedAttribute(CROSS_CERT);
- request.addRequestedAttribute(CA_CERT);
- request.addRequestedAttribute(ARL);
- if (prefetchCRLs) {
- request.addRequestedAttribute(CRL);
- }
- try {
- entryCRLs = getCRLs(request, ARL, xsel);
- if (entryCRLs.isEmpty()) {
- // no ARLs found. We assume that means that there are
- // no ARLs on this server at all and prefetch the CRLs.
- prefetchCRLs = true;
- } else {
- crls.addAll(entryCRLs);
- }
- } catch (CertStoreException e) {
- if (debug != null) {
- debug.println("LDAPCertStore.engineGetCRLs non-fatal error "
- + "retrieving ARLs:" + e);
- e.printStackTrace();
- }
- }
- }
- // Otherwise, get the CRL
- // if certChecking is null, we don't know if we should look in ARL or CRL
- // attribute, so check both for matching CRLs.
- if (entryCRLs.isEmpty() || certChecking == null) {
- LDAPRequest request = new LDAPRequest(issuerName);
- request.addRequestedAttribute(CRL);
- entryCRLs = getCRLs(request, CRL, xsel);
- crls.addAll(entryCRLs);
- }
- }
- return crls;
- }
-
- // converts an LDAP URI into LDAPCertStoreParameters
- static LDAPCertStoreParameters getParameters(URI uri) {
- String host = uri.getHost();
- if (host == null) {
- return new SunLDAPCertStoreParameters();
- } else {
- int port = uri.getPort();
- return (port == -1
- ? new SunLDAPCertStoreParameters(host)
- : new SunLDAPCertStoreParameters(host, port));
- }
- }
-
- /*
- * Subclass of LDAPCertStoreParameters with overridden equals/hashCode
- * methods. This is necessary because the parameters are used as
- * keys in the LDAPCertStore cache.
- */
- private static class SunLDAPCertStoreParameters
- extends LDAPCertStoreParameters {
-
- private volatile int hashCode = 0;
-
- SunLDAPCertStoreParameters(String serverName, int port) {
- super(serverName, port);
- }
- SunLDAPCertStoreParameters(String serverName) {
- super(serverName);
- }
- SunLDAPCertStoreParameters() {
- super();
- }
- @Override
- public boolean equals(Object obj) {
- if (obj == null) {
- return false;
- }
-
- if (!(obj instanceof LDAPCertStoreParameters)) {
- return false;
- }
- LDAPCertStoreParameters params = (LDAPCertStoreParameters) obj;
- return (getPort() == params.getPort() &&
- getServerName().equalsIgnoreCase(params.getServerName()));
- }
- @Override
- public int hashCode() {
- if (hashCode == 0) {
- int result = 17;
- result = 37*result + getPort();
- result = 37*result +
- getServerName().toLowerCase(Locale.ENGLISH).hashCode();
- hashCode = result;
- }
- return hashCode;
- }
- }
-
- /*
- * This inner class wraps an existing X509CertSelector and adds
- * additional criteria to match on when the certificate's subject is
- * different than the LDAP Distinguished Name entry. The LDAPCertStore
- * implementation uses the subject DN as the directory entry for
- * looking up certificates. This can be problematic if the certificates
- * that you want to fetch have a different subject DN than the entry
- * where they are stored. You could set the selector's subject to the
- * LDAP DN entry, but then the resulting match would fail to find the
- * desired certificates because the subject DNs would not match. This
- * class avoids that problem by introducing a certSubject which should
- * be set to the certificate's subject DN when it is different than
- * the LDAP DN.
- */
- static class LDAPCertSelector extends X509CertSelector {
-
- private X500Principal certSubject;
- private X509CertSelector selector;
- private X500Principal subject;
-
- /**
- * Creates an LDAPCertSelector.
- *
- * @param selector the X509CertSelector to wrap
- * @param certSubject the subject DN of the certificate that you want
- * to retrieve via LDAP
- * @param ldapDN the LDAP DN where the certificate is stored
- */
- LDAPCertSelector(X509CertSelector selector, X500Principal certSubject,
- String ldapDN) throws IOException {
- this.selector = selector == null ? new X509CertSelector() : selector;
- this.certSubject = certSubject;
- this.subject = new X500Name(ldapDN).asX500Principal();
- }
-
- // we only override the get (accessor methods) since the set methods
- // will not be invoked by the code that uses this LDAPCertSelector.
- public X509Certificate getCertificate() {
- return selector.getCertificate();
- }
- public BigInteger getSerialNumber() {
- return selector.getSerialNumber();
- }
- public X500Principal getIssuer() {
- return selector.getIssuer();
- }
- public String getIssuerAsString() {
- return selector.getIssuerAsString();
- }
- public byte[] getIssuerAsBytes() throws IOException {
- return selector.getIssuerAsBytes();
- }
- public X500Principal getSubject() {
- // return the ldap DN
- return subject;
- }
- public String getSubjectAsString() {
- // return the ldap DN
- return subject.getName();
- }
- public byte[] getSubjectAsBytes() throws IOException {
- // return the encoded ldap DN
- return subject.getEncoded();
- }
- public byte[] getSubjectKeyIdentifier() {
- return selector.getSubjectKeyIdentifier();
- }
- public byte[] getAuthorityKeyIdentifier() {
- return selector.getAuthorityKeyIdentifier();
- }
- public Date getCertificateValid() {
- return selector.getCertificateValid();
- }
- public Date getPrivateKeyValid() {
- return selector.getPrivateKeyValid();
- }
- public String getSubjectPublicKeyAlgID() {
- return selector.getSubjectPublicKeyAlgID();
- }
- public PublicKey getSubjectPublicKey() {
- return selector.getSubjectPublicKey();
- }
- public boolean[] getKeyUsage() {
- return selector.getKeyUsage();
- }
- public Set<String> getExtendedKeyUsage() {
- return selector.getExtendedKeyUsage();
- }
- public boolean getMatchAllSubjectAltNames() {
- return selector.getMatchAllSubjectAltNames();
- }
- public Collection<List<?>> getSubjectAlternativeNames() {
- return selector.getSubjectAlternativeNames();
- }
- public byte[] getNameConstraints() {
- return selector.getNameConstraints();
- }
- public int getBasicConstraints() {
- return selector.getBasicConstraints();
- }
- public Set<String> getPolicy() {
- return selector.getPolicy();
- }
- public Collection<List<?>> getPathToNames() {
- return selector.getPathToNames();
- }
-
- public boolean match(Certificate cert) {
- // temporarily set the subject criterion to the certSubject
- // so that match will not reject the desired certificates
- selector.setSubject(certSubject);
- boolean match = selector.match(cert);
- selector.setSubject(subject);
- return match;
- }
- }
-
- /**
- * This class has the same purpose as LDAPCertSelector except it is for
- * X.509 CRLs.
- */
- static class LDAPCRLSelector extends X509CRLSelector {
-
- private X509CRLSelector selector;
- private Collection<X500Principal> certIssuers;
- private Collection<X500Principal> issuers;
- private HashSet<Object> issuerNames;
-
- /**
- * Creates an LDAPCRLSelector.
- *
- * @param selector the X509CRLSelector to wrap
- * @param certIssuers the issuer DNs of the CRLs that you want
- * to retrieve via LDAP
- * @param ldapDN the LDAP DN where the CRL is stored
- */
- LDAPCRLSelector(X509CRLSelector selector,
- Collection<X500Principal> certIssuers, String ldapDN)
- throws IOException {
- this.selector = selector == null ? new X509CRLSelector() : selector;
- this.certIssuers = certIssuers;
- issuerNames = new HashSet<>();
- issuerNames.add(ldapDN);
- issuers = new HashSet<>();
- issuers.add(new X500Name(ldapDN).asX500Principal());
- }
- // we only override the get (accessor methods) since the set methods
- // will not be invoked by the code that uses this LDAPCRLSelector.
- public Collection<X500Principal> getIssuers() {
- // return the ldap DN
- return Collections.unmodifiableCollection(issuers);
- }
- public Collection<Object> getIssuerNames() {
- // return the ldap DN
- return Collections.unmodifiableCollection(issuerNames);
- }
- public BigInteger getMinCRL() {
- return selector.getMinCRL();
- }
- public BigInteger getMaxCRL() {
- return selector.getMaxCRL();
- }
- public Date getDateAndTime() {
- return selector.getDateAndTime();
- }
- public X509Certificate getCertificateChecking() {
- return selector.getCertificateChecking();
- }
- public boolean match(CRL crl) {
- // temporarily set the issuer criterion to the certIssuers
- // so that match will not reject the desired CRL
- selector.setIssuers(certIssuers);
- boolean match = selector.match(crl);
- selector.setIssuers(issuers);
- return match;
- }
+ return impl.getCRLs((X509CRLSelector) selector, ldapDN);
}
}
--- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStoreHelper.java Thu May 21 18:23:01 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. 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.security.provider.certpath.ldap;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.Collection;
-import java.security.NoSuchAlgorithmException;
-import java.security.InvalidAlgorithmParameterException;
-import java.security.cert.CertStore;
-import java.security.cert.CertStoreException;
-import java.security.cert.X509CertSelector;
-import java.security.cert.X509CRLSelector;
-import javax.naming.CommunicationException;
-import javax.naming.ServiceUnavailableException;
-import javax.security.auth.x500.X500Principal;
-
-import sun.security.provider.certpath.CertStoreHelper;
-
-/**
- * LDAP implementation of CertStoreHelper.
- */
-
-public final class LDAPCertStoreHelper
- extends CertStoreHelper
-{
- @Override
- public CertStore getCertStore(URI uri)
- throws NoSuchAlgorithmException, InvalidAlgorithmParameterException
- {
- return LDAPCertStore.getInstance(LDAPCertStore.getParameters(uri));
- }
-
- @Override
- public X509CertSelector wrap(X509CertSelector selector,
- X500Principal certSubject,
- String ldapDN)
- throws IOException
- {
- return new LDAPCertStore.LDAPCertSelector(selector, certSubject, ldapDN);
- }
-
- @Override
- public X509CRLSelector wrap(X509CRLSelector selector,
- Collection<X500Principal> certIssuers,
- String ldapDN)
- throws IOException
- {
- return new LDAPCertStore.LDAPCRLSelector(selector, certIssuers, ldapDN);
- }
-
- @Override
- public boolean isCausedByNetworkIssue(CertStoreException e) {
- Throwable t = e.getCause();
- return (t != null && (t instanceof ServiceUnavailableException ||
- t instanceof CommunicationException));
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStoreImpl.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,772 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.security.provider.certpath.ldap;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.*;
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.NameNotFoundException;
+import javax.naming.directory.Attribute;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.BasicAttributes;
+
+import java.security.*;
+import java.security.cert.Certificate;
+import java.security.cert.*;
+import javax.naming.CommunicationException;
+import javax.naming.ldap.InitialLdapContext;
+import javax.naming.ldap.LdapContext;
+import javax.security.auth.x500.X500Principal;
+
+import sun.misc.HexDumpEncoder;
+import sun.security.provider.certpath.X509CertificatePair;
+import sun.security.util.Cache;
+import sun.security.util.Debug;
+import sun.security.x509.X500Name;
+
+/**
+ * Core implementation of a LDAP Cert Store.
+ * @see java.security.cert.CertStore
+ *
+ * @since 1.9
+ */
+final class LDAPCertStoreImpl {
+
+ private static final Debug debug = Debug.getInstance("certpath");
+
+ private final static boolean DEBUG = false;
+
+ /**
+ * LDAP attribute identifiers.
+ */
+ private static final String USER_CERT = "userCertificate;binary";
+ private static final String CA_CERT = "cACertificate;binary";
+ private static final String CROSS_CERT = "crossCertificatePair;binary";
+ private static final String CRL = "certificateRevocationList;binary";
+ private static final String ARL = "authorityRevocationList;binary";
+ private static final String DELTA_CRL = "deltaRevocationList;binary";
+
+ // Constants for various empty values
+ private final static String[] STRING0 = new String[0];
+
+ private final static byte[][] BB0 = new byte[0][];
+
+ private final static Attributes EMPTY_ATTRIBUTES = new BasicAttributes();
+
+ // cache related constants
+ private final static int DEFAULT_CACHE_SIZE = 750;
+ private final static int DEFAULT_CACHE_LIFETIME = 30;
+
+ private final static int LIFETIME;
+
+ private final static String PROP_LIFETIME =
+ "sun.security.certpath.ldap.cache.lifetime";
+
+ /*
+ * Internal system property, that when set to "true", disables the
+ * JNDI application resource files lookup to prevent recursion issues
+ * when validating signed JARs with LDAP URLs in certificates.
+ */
+ private final static String PROP_DISABLE_APP_RESOURCE_FILES =
+ "sun.security.certpath.ldap.disable.app.resource.files";
+
+ static {
+ String s = AccessController.doPrivileged(
+ (PrivilegedAction<String>) () -> System.getProperty(PROP_LIFETIME));
+ if (s != null) {
+ LIFETIME = Integer.parseInt(s); // throws NumberFormatException
+ } else {
+ LIFETIME = DEFAULT_CACHE_LIFETIME;
+ }
+ }
+
+ /**
+ * The CertificateFactory used to decode certificates from
+ * their binary stored form.
+ */
+ private CertificateFactory cf;
+ /**
+ * The JNDI directory context.
+ */
+ private LdapContext ctx;
+
+ /**
+ * Flag indicating that communication error occurred.
+ */
+ private boolean communicationError = false;
+
+ /**
+ * Flag indicating whether we should prefetch CRLs.
+ */
+ private boolean prefetchCRLs = false;
+
+ private final Cache<String, byte[][]> valueCache;
+
+ private int cacheHits = 0;
+ private int cacheMisses = 0;
+ private int requests = 0;
+
+ /**
+ * Creates a <code>CertStore</code> with the specified parameters.
+ */
+ LDAPCertStoreImpl(String serverName, int port)
+ throws InvalidAlgorithmParameterException {
+ createInitialDirContext(serverName, port);
+ // Create CertificateFactory for use later on
+ try {
+ cf = CertificateFactory.getInstance("X.509");
+ } catch (CertificateException e) {
+ throw new InvalidAlgorithmParameterException(
+ "unable to create CertificateFactory for X.509");
+ }
+ if (LIFETIME == 0) {
+ valueCache = Cache.newNullCache();
+ } else if (LIFETIME < 0) {
+ valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE);
+ } else {
+ valueCache = Cache.newSoftMemoryCache(DEFAULT_CACHE_SIZE, LIFETIME);
+ }
+ }
+
+ /**
+ * Create InitialDirContext.
+ *
+ * @param server Server DNS name hosting LDAP service
+ * @param port Port at which server listens for requests
+ * @throws InvalidAlgorithmParameterException if creation fails
+ */
+ private void createInitialDirContext(String server, int port)
+ throws InvalidAlgorithmParameterException {
+ String url = "ldap://" + server + ":" + port;
+ Hashtable<String,Object> env = new Hashtable<>();
+ env.put(Context.INITIAL_CONTEXT_FACTORY,
+ "com.sun.jndi.ldap.LdapCtxFactory");
+ env.put(Context.PROVIDER_URL, url);
+
+ // If property is set to true, disable application resource file lookup.
+ boolean disableAppResourceFiles = AccessController.doPrivileged(
+ (PrivilegedAction<Boolean>) () -> Boolean.getBoolean(PROP_DISABLE_APP_RESOURCE_FILES));
+ if (disableAppResourceFiles) {
+ if (debug != null) {
+ debug.println("LDAPCertStore disabling app resource files");
+ }
+ env.put("com.sun.naming.disable.app.resource.files", "true");
+ }
+
+ try {
+ ctx = new InitialLdapContext(env, null);
+ /*
+ * By default, follow referrals unless application has
+ * overridden property in an application resource file.
+ */
+ Hashtable<?,?> currentEnv = ctx.getEnvironment();
+ if (currentEnv.get(Context.REFERRAL) == null) {
+ ctx.addToEnvironment(Context.REFERRAL, "follow");
+ }
+ } catch (NamingException e) {
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineInit about to throw "
+ + "InvalidAlgorithmParameterException");
+ e.printStackTrace();
+ }
+ Exception ee = new InvalidAlgorithmParameterException
+ ("unable to create InitialDirContext using supplied parameters");
+ ee.initCause(e);
+ throw (InvalidAlgorithmParameterException)ee;
+ }
+ }
+
+ /**
+ * Private class encapsulating the actual LDAP operations and cache
+ * handling. Use:
+ *
+ * LDAPRequest request = new LDAPRequest(dn);
+ * request.addRequestedAttribute(CROSS_CERT);
+ * request.addRequestedAttribute(CA_CERT);
+ * byte[][] crossValues = request.getValues(CROSS_CERT);
+ * byte[][] caValues = request.getValues(CA_CERT);
+ *
+ * At most one LDAP request is sent for each instance created. If all
+ * getValues() calls can be satisfied from the cache, no request
+ * is sent at all. If a request is sent, all requested attributes
+ * are always added to the cache irrespective of whether the getValues()
+ * method is called.
+ */
+ private class LDAPRequest {
+
+ private final String name;
+ private Map<String, byte[][]> valueMap;
+ private final List<String> requestedAttributes;
+
+ LDAPRequest(String name) {
+ this.name = name;
+ requestedAttributes = new ArrayList<>(5);
+ }
+
+ String getName() {
+ return name;
+ }
+
+ void addRequestedAttribute(String attrId) {
+ if (valueMap != null) {
+ throw new IllegalStateException("Request already sent");
+ }
+ requestedAttributes.add(attrId);
+ }
+
+ /**
+ * Gets one or more binary values from an attribute.
+ *
+ * @param name the location holding the attribute
+ * @param attrId the attribute identifier
+ * @return an array of binary values (byte arrays)
+ * @throws NamingException if a naming exception occurs
+ */
+ byte[][] getValues(String attrId) throws NamingException {
+ if (DEBUG && ((cacheHits + cacheMisses) % 50 == 0)) {
+ System.out.println("Cache hits: " + cacheHits + "; misses: "
+ + cacheMisses);
+ }
+ String cacheKey = name + "|" + attrId;
+ byte[][] values = valueCache.get(cacheKey);
+ if (values != null) {
+ cacheHits++;
+ return values;
+ }
+ cacheMisses++;
+ Map<String, byte[][]> attrs = getValueMap();
+ values = attrs.get(attrId);
+ return values;
+ }
+
+ /**
+ * Get a map containing the values for this request. The first time
+ * this method is called on an object, the LDAP request is sent,
+ * the results parsed and added to a private map and also to the
+ * cache of this LDAPCertStore. Subsequent calls return the private
+ * map immediately.
+ *
+ * The map contains an entry for each requested attribute. The
+ * attribute name is the key, values are byte[][]. If there are no
+ * values for that attribute, values are byte[0][].
+ *
+ * @return the value Map
+ * @throws NamingException if a naming exception occurs
+ */
+ private Map<String, byte[][]> getValueMap() throws NamingException {
+ if (valueMap != null) {
+ return valueMap;
+ }
+ if (DEBUG) {
+ System.out.println("Request: " + name + ":" + requestedAttributes);
+ requests++;
+ if (requests % 5 == 0) {
+ System.out.println("LDAP requests: " + requests);
+ }
+ }
+ valueMap = new HashMap<>(8);
+ String[] attrIds = requestedAttributes.toArray(STRING0);
+ Attributes attrs;
+
+ if (communicationError) {
+ ctx.reconnect(null);
+ communicationError = false;
+ }
+
+ try {
+ attrs = ctx.getAttributes(name, attrIds);
+ } catch (CommunicationException ce) {
+ communicationError = true;
+ throw ce;
+ } catch (NameNotFoundException e) {
+ // name does not exist on this LDAP server
+ // treat same as not attributes found
+ attrs = EMPTY_ATTRIBUTES;
+ }
+ for (String attrId : requestedAttributes) {
+ Attribute attr = attrs.get(attrId);
+ byte[][] values = getAttributeValues(attr);
+ cacheAttribute(attrId, values);
+ valueMap.put(attrId, values);
+ }
+ return valueMap;
+ }
+
+ /**
+ * Add the values to the cache.
+ */
+ private void cacheAttribute(String attrId, byte[][] values) {
+ String cacheKey = name + "|" + attrId;
+ valueCache.put(cacheKey, values);
+ }
+
+ /**
+ * Get the values for the given attribute. If the attribute is null
+ * or does not contain any values, a zero length byte array is
+ * returned. NOTE that it is assumed that all values are byte arrays.
+ */
+ private byte[][] getAttributeValues(Attribute attr)
+ throws NamingException {
+ byte[][] values;
+ if (attr == null) {
+ values = BB0;
+ } else {
+ values = new byte[attr.size()][];
+ int i = 0;
+ NamingEnumeration<?> enum_ = attr.getAll();
+ while (enum_.hasMore()) {
+ Object obj = enum_.next();
+ if (debug != null) {
+ if (obj instanceof String) {
+ debug.println("LDAPCertStore.getAttrValues() "
+ + "enum.next is a string!: " + obj);
+ }
+ }
+ byte[] value = (byte[])obj;
+ values[i++] = value;
+ }
+ }
+ return values;
+ }
+
+ }
+
+ /*
+ * Gets certificates from an attribute id and location in the LDAP
+ * directory. Returns a Collection containing only the Certificates that
+ * match the specified CertSelector.
+ *
+ * @param name the location holding the attribute
+ * @param id the attribute identifier
+ * @param sel a CertSelector that the Certificates must match
+ * @return a Collection of Certificates found
+ * @throws CertStoreException if an exception occurs
+ */
+ private Collection<X509Certificate> getCertificates(LDAPRequest request,
+ String id, X509CertSelector sel) throws CertStoreException {
+
+ /* fetch encoded certs from storage */
+ byte[][] encodedCert;
+ try {
+ encodedCert = request.getValues(id);
+ } catch (NamingException namingEx) {
+ throw new CertStoreException(namingEx);
+ }
+
+ int n = encodedCert.length;
+ if (n == 0) {
+ return Collections.emptySet();
+ }
+
+ List<X509Certificate> certs = new ArrayList<>(n);
+ /* decode certs and check if they satisfy selector */
+ for (int i = 0; i < n; i++) {
+ ByteArrayInputStream bais = new ByteArrayInputStream(encodedCert[i]);
+ try {
+ Certificate cert = cf.generateCertificate(bais);
+ if (sel.match(cert)) {
+ certs.add((X509Certificate)cert);
+ }
+ } catch (CertificateException e) {
+ if (debug != null) {
+ debug.println("LDAPCertStore.getCertificates() encountered "
+ + "exception while parsing cert, skipping the bad data: ");
+ HexDumpEncoder encoder = new HexDumpEncoder();
+ debug.println(
+ "[ " + encoder.encodeBuffer(encodedCert[i]) + " ]");
+ }
+ }
+ }
+
+ return certs;
+ }
+
+ /*
+ * Gets certificate pairs from an attribute id and location in the LDAP
+ * directory.
+ *
+ * @param name the location holding the attribute
+ * @param id the attribute identifier
+ * @return a Collection of X509CertificatePairs found
+ * @throws CertStoreException if an exception occurs
+ */
+ private Collection<X509CertificatePair> getCertPairs(
+ LDAPRequest request, String id) throws CertStoreException {
+
+ /* fetch the encoded cert pairs from storage */
+ byte[][] encodedCertPair;
+ try {
+ encodedCertPair = request.getValues(id);
+ } catch (NamingException namingEx) {
+ throw new CertStoreException(namingEx);
+ }
+
+ int n = encodedCertPair.length;
+ if (n == 0) {
+ return Collections.emptySet();
+ }
+
+ List<X509CertificatePair> certPairs = new ArrayList<>(n);
+ /* decode each cert pair and add it to the Collection */
+ for (int i = 0; i < n; i++) {
+ try {
+ X509CertificatePair certPair =
+ X509CertificatePair.generateCertificatePair(encodedCertPair[i]);
+ certPairs.add(certPair);
+ } catch (CertificateException e) {
+ if (debug != null) {
+ debug.println(
+ "LDAPCertStore.getCertPairs() encountered exception "
+ + "while parsing cert, skipping the bad data: ");
+ HexDumpEncoder encoder = new HexDumpEncoder();
+ debug.println(
+ "[ " + encoder.encodeBuffer(encodedCertPair[i]) + " ]");
+ }
+ }
+ }
+
+ return certPairs;
+ }
+
+ /*
+ * Looks at certificate pairs stored in the crossCertificatePair attribute
+ * at the specified location in the LDAP directory. Returns a Collection
+ * containing all X509Certificates stored in the forward component that match
+ * the forward X509CertSelector and all Certificates stored in the reverse
+ * component that match the reverse X509CertSelector.
+ * <p>
+ * If either forward or reverse is null, all certificates from the
+ * corresponding component will be rejected.
+ *
+ * @param name the location to look in
+ * @param forward the forward X509CertSelector (or null)
+ * @param reverse the reverse X509CertSelector (or null)
+ * @return a Collection of X509Certificates found
+ * @throws CertStoreException if an exception occurs
+ */
+ private Collection<X509Certificate> getMatchingCrossCerts(
+ LDAPRequest request, X509CertSelector forward,
+ X509CertSelector reverse)
+ throws CertStoreException {
+ // Get the cert pairs
+ Collection<X509CertificatePair> certPairs =
+ getCertPairs(request, CROSS_CERT);
+
+ // Find Certificates that match and put them in a list
+ ArrayList<X509Certificate> matchingCerts = new ArrayList<>();
+ for (X509CertificatePair certPair : certPairs) {
+ X509Certificate cert;
+ if (forward != null) {
+ cert = certPair.getForward();
+ if ((cert != null) && forward.match(cert)) {
+ matchingCerts.add(cert);
+ }
+ }
+ if (reverse != null) {
+ cert = certPair.getReverse();
+ if ((cert != null) && reverse.match(cert)) {
+ matchingCerts.add(cert);
+ }
+ }
+ }
+ return matchingCerts;
+ }
+
+ /**
+ * Returns a <code>Collection</code> of <code>X509Certificate</code>s that
+ * match the specified selector. If no <code>X509Certificate</code>s
+ * match the selector, an empty <code>Collection</code> will be returned.
+ * <p>
+ * It is not practical to search every entry in the LDAP database for
+ * matching <code>X509Certificate</code>s. Instead, the
+ * <code>X509CertSelector</code> is examined in order to determine where
+ * matching <code>Certificate</code>s are likely to be found (according
+ * to the PKIX LDAPv2 schema, RFC 2587).
+ * If the subject is specified, its directory entry is searched. If the
+ * issuer is specified, its directory entry is searched. If neither the
+ * subject nor the issuer are specified (or the selector is not an
+ * <code>X509CertSelector</code>), a <code>CertStoreException</code> is
+ * thrown.
+ *
+ * @param selector a <code>X509CertSelector</code> used to select which
+ * <code>Certificate</code>s should be returned.
+ * @return a <code>Collection</code> of <code>X509Certificate</code>s that
+ * match the specified selector
+ * @throws CertStoreException if an exception occurs
+ */
+ synchronized Collection<X509Certificate> getCertificates
+ (X509CertSelector xsel, String ldapDN) throws CertStoreException {
+
+ if (ldapDN == null) {
+ ldapDN = xsel.getSubjectAsString();
+ }
+ int basicConstraints = xsel.getBasicConstraints();
+ String issuer = xsel.getIssuerAsString();
+ HashSet<X509Certificate> certs = new HashSet<>();
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() basicConstraints: "
+ + basicConstraints);
+ }
+
+ // basicConstraints:
+ // -2: only EE certs accepted
+ // -1: no check is done
+ // 0: any CA certificate accepted
+ // >1: certificate's basicConstraints extension pathlen must match
+ if (ldapDN != null) {
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() "
+ + " subject is not null");
+ }
+ LDAPRequest request = new LDAPRequest(ldapDN);
+ if (basicConstraints > -2) {
+ request.addRequestedAttribute(CROSS_CERT);
+ request.addRequestedAttribute(CA_CERT);
+ request.addRequestedAttribute(ARL);
+ if (prefetchCRLs) {
+ request.addRequestedAttribute(CRL);
+ }
+ }
+ if (basicConstraints < 0) {
+ request.addRequestedAttribute(USER_CERT);
+ }
+
+ if (basicConstraints > -2) {
+ certs.addAll(getMatchingCrossCerts(request, xsel, null));
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() after "
+ + "getMatchingCrossCerts(subject,xsel,null),certs.size(): "
+ + certs.size());
+ }
+ certs.addAll(getCertificates(request, CA_CERT, xsel));
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() after "
+ + "getCertificates(subject,CA_CERT,xsel),certs.size(): "
+ + certs.size());
+ }
+ }
+ if (basicConstraints < 0) {
+ certs.addAll(getCertificates(request, USER_CERT, xsel));
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() after "
+ + "getCertificates(subject,USER_CERT, xsel),certs.size(): "
+ + certs.size());
+ }
+ }
+ } else {
+ if (debug != null) {
+ debug.println
+ ("LDAPCertStore.engineGetCertificates() subject is null");
+ }
+ if (basicConstraints == -2) {
+ throw new CertStoreException("need subject to find EE certs");
+ }
+ if (issuer == null) {
+ throw new CertStoreException("need subject or issuer to find certs");
+ }
+ }
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() about to "
+ + "getMatchingCrossCerts...");
+ }
+ if ((issuer != null) && (basicConstraints > -2)) {
+ LDAPRequest request = new LDAPRequest(issuer);
+ request.addRequestedAttribute(CROSS_CERT);
+ request.addRequestedAttribute(CA_CERT);
+ request.addRequestedAttribute(ARL);
+ if (prefetchCRLs) {
+ request.addRequestedAttribute(CRL);
+ }
+
+ certs.addAll(getMatchingCrossCerts(request, null, xsel));
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() after "
+ + "getMatchingCrossCerts(issuer,null,xsel),certs.size(): "
+ + certs.size());
+ }
+ certs.addAll(getCertificates(request, CA_CERT, xsel));
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() after "
+ + "getCertificates(issuer,CA_CERT,xsel),certs.size(): "
+ + certs.size());
+ }
+ }
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCertificates() returning certs");
+ }
+ return certs;
+ }
+
+ /*
+ * Gets CRLs from an attribute id and location in the LDAP directory.
+ * Returns a Collection containing only the CRLs that match the
+ * specified X509CRLSelector.
+ *
+ * @param name the location holding the attribute
+ * @param id the attribute identifier
+ * @param sel a X509CRLSelector that the CRLs must match
+ * @return a Collection of CRLs found
+ * @throws CertStoreException if an exception occurs
+ */
+ private Collection<X509CRL> getCRLs(LDAPRequest request, String id,
+ X509CRLSelector sel) throws CertStoreException {
+
+ /* fetch the encoded crls from storage */
+ byte[][] encodedCRL;
+ try {
+ encodedCRL = request.getValues(id);
+ } catch (NamingException namingEx) {
+ throw new CertStoreException(namingEx);
+ }
+
+ int n = encodedCRL.length;
+ if (n == 0) {
+ return Collections.emptySet();
+ }
+
+ List<X509CRL> crls = new ArrayList<>(n);
+ /* decode each crl and check if it matches selector */
+ for (int i = 0; i < n; i++) {
+ try {
+ CRL crl = cf.generateCRL(new ByteArrayInputStream(encodedCRL[i]));
+ if (sel.match(crl)) {
+ crls.add((X509CRL)crl);
+ }
+ } catch (CRLException e) {
+ if (debug != null) {
+ debug.println("LDAPCertStore.getCRLs() encountered exception"
+ + " while parsing CRL, skipping the bad data: ");
+ HexDumpEncoder encoder = new HexDumpEncoder();
+ debug.println("[ " + encoder.encodeBuffer(encodedCRL[i]) + " ]");
+ }
+ }
+ }
+
+ return crls;
+ }
+
+ /**
+ * Returns a <code>Collection</code> of <code>X509CRL</code>s that
+ * match the specified selector. If no <code>X509CRL</code>s
+ * match the selector, an empty <code>Collection</code> will be returned.
+ * <p>
+ * It is not practical to search every entry in the LDAP database for
+ * matching <code>X509CRL</code>s. Instead, the <code>X509CRLSelector</code>
+ * is examined in order to determine where matching <code>X509CRL</code>s
+ * are likely to be found (according to the PKIX LDAPv2 schema, RFC 2587).
+ * If issuerNames or certChecking are specified, the issuer's directory
+ * entry is searched. If neither issuerNames or certChecking are specified
+ * (or the selector is not an <code>X509CRLSelector</code>), a
+ * <code>CertStoreException</code> is thrown.
+ *
+ * @param selector A <code>X509CRLSelector</code> used to select which
+ * <code>CRL</code>s should be returned. Specify <code>null</code>
+ * to return all <code>CRL</code>s.
+ * @return A <code>Collection</code> of <code>X509CRL</code>s that
+ * match the specified selector
+ * @throws CertStoreException if an exception occurs
+ */
+ synchronized Collection<X509CRL> getCRLs(X509CRLSelector xsel,
+ String ldapDN) throws CertStoreException {
+
+ HashSet<X509CRL> crls = new HashSet<>();
+
+ // Look in directory entry for issuer of cert we're checking.
+ Collection<Object> issuerNames;
+ X509Certificate certChecking = xsel.getCertificateChecking();
+ if (certChecking != null) {
+ issuerNames = new HashSet<>();
+ X500Principal issuer = certChecking.getIssuerX500Principal();
+ issuerNames.add(issuer.getName(X500Principal.RFC2253));
+ } else {
+ // But if we don't know which cert we're checking, try the directory
+ // entries of all acceptable CRL issuers
+ if (ldapDN != null) {
+ issuerNames = new HashSet<>();
+ issuerNames.add(ldapDN);
+ } else {
+ issuerNames = xsel.getIssuerNames();
+ if (issuerNames == null) {
+ throw new CertStoreException("need issuerNames or"
+ + " certChecking to find CRLs");
+ }
+ }
+ }
+ for (Object nameObject : issuerNames) {
+ String issuerName;
+ if (nameObject instanceof byte[]) {
+ try {
+ X500Principal issuer = new X500Principal((byte[])nameObject);
+ issuerName = issuer.getName(X500Principal.RFC2253);
+ } catch (IllegalArgumentException e) {
+ continue;
+ }
+ } else {
+ issuerName = (String)nameObject;
+ }
+ // If all we want is CA certs, try to get the (probably shorter) ARL
+ Collection<X509CRL> entryCRLs = Collections.emptySet();
+ if (certChecking == null || certChecking.getBasicConstraints() != -1) {
+ LDAPRequest request = new LDAPRequest(issuerName);
+ request.addRequestedAttribute(CROSS_CERT);
+ request.addRequestedAttribute(CA_CERT);
+ request.addRequestedAttribute(ARL);
+ if (prefetchCRLs) {
+ request.addRequestedAttribute(CRL);
+ }
+ try {
+ entryCRLs = getCRLs(request, ARL, xsel);
+ if (entryCRLs.isEmpty()) {
+ // no ARLs found. We assume that means that there are
+ // no ARLs on this server at all and prefetch the CRLs.
+ prefetchCRLs = true;
+ } else {
+ crls.addAll(entryCRLs);
+ }
+ } catch (CertStoreException e) {
+ if (debug != null) {
+ debug.println("LDAPCertStore.engineGetCRLs non-fatal error "
+ + "retrieving ARLs:" + e);
+ e.printStackTrace();
+ }
+ }
+ }
+ // Otherwise, get the CRL
+ // if certChecking is null, we don't know if we should look in ARL or CRL
+ // attribute, so check both for matching CRLs.
+ if (entryCRLs.isEmpty() || certChecking == null) {
+ LDAPRequest request = new LDAPRequest(issuerName);
+ request.addRequestedAttribute(CRL);
+ entryCRLs = getCRLs(request, CRL, xsel);
+ crls.addAll(entryCRLs);
+ }
+ }
+ return crls;
+ }
+}
--- a/jdk/src/java.prefs/windows/classes/java/util/prefs/WindowsPreferences.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.prefs/windows/classes/java/util/prefs/WindowsPreferences.java Fri May 22 09:50:33 2015 +0200
@@ -62,8 +62,8 @@
/**
* Windows registry path to <tt>Preferences</tt>'s root nodes.
*/
- private static final byte[] WINDOWS_ROOT_PATH
- = stringToByteArray("Software\\JavaSoft\\Prefs");
+ private static final byte[] WINDOWS_ROOT_PATH =
+ stringToByteArray("Software\\JavaSoft\\Prefs");
/**
* Windows handles to <tt>HKEY_CURRENT_USER</tt> and
@@ -147,12 +147,12 @@
* Java wrapper for Windows registry API RegOpenKey()
*/
private static native int[] WindowsRegOpenKey(int hKey, byte[] subKey,
- int securityMask);
+ int securityMask);
/**
* Retries RegOpenKey() MAX_ATTEMPTS times before giving up.
*/
private static int[] WindowsRegOpenKey1(int hKey, byte[] subKey,
- int securityMask) {
+ int securityMask) {
int[] result = WindowsRegOpenKey(hKey, subKey, securityMask);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
return result;
@@ -167,16 +167,16 @@
} else if (result[ERROR_CODE] != ERROR_ACCESS_DENIED) {
long sleepTime = INIT_SLEEP_TIME;
for (int i = 0; i < MAX_ATTEMPTS; i++) {
- try {
- Thread.sleep(sleepTime);
- } catch(InterruptedException e) {
- return result;
- }
- sleepTime *= 2;
- result = WindowsRegOpenKey(hKey, subKey, securityMask);
- if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- }
+ try {
+ Thread.sleep(sleepTime);
+ } catch(InterruptedException e) {
+ return result;
+ }
+ sleepTime *= 2;
+ result = WindowsRegOpenKey(hKey, subKey, securityMask);
+ if (result[ERROR_CODE] == ERROR_SUCCESS) {
+ return result;
+ }
}
}
return result;
@@ -198,10 +198,10 @@
private static int[] WindowsRegCreateKeyEx1(int hKey, byte[] subKey) {
int[] result = WindowsRegCreateKeyEx(hKey, subKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -210,7 +210,7 @@
sleepTime *= 2;
result = WindowsRegCreateKeyEx(hKey, subKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -232,10 +232,10 @@
private static int WindowsRegFlushKey1(int hKey) {
int result = WindowsRegFlushKey(hKey);
if (result == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -244,7 +244,7 @@
sleepTime *= 2;
result = WindowsRegFlushKey(hKey);
if (result == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -255,23 +255,23 @@
* Java wrapper for Windows registry API RegQueryValueEx()
*/
private static native byte[] WindowsRegQueryValueEx(int hKey,
- byte[] valueName);
+ byte[] valueName);
/**
* Java wrapper for Windows registry API RegSetValueEx()
*/
private static native int WindowsRegSetValueEx(int hKey, byte[] valueName,
- byte[] value);
+ byte[] value);
/**
* Retries RegSetValueEx() MAX_ATTEMPTS times before giving up.
*/
private static int WindowsRegSetValueEx1(int hKey, byte[] valueName,
- byte[] value) {
+ byte[] value) {
int result = WindowsRegSetValueEx(hKey, valueName, value);
if (result == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -280,7 +280,7 @@
sleepTime *= 2;
result = WindowsRegSetValueEx(hKey, valueName, value);
if (result == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -303,10 +303,10 @@
private static int[] WindowsRegQueryInfoKey1(int hKey) {
int[] result = WindowsRegQueryInfoKey(hKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -315,7 +315,7 @@
sleepTime *= 2;
result = WindowsRegQueryInfoKey(hKey);
if (result[ERROR_CODE] == ERROR_SUCCESS) {
- return result;
+ return result;
}
}
}
@@ -326,19 +326,19 @@
* Java wrapper for Windows registry API RegEnumKeyEx()
*/
private static native byte[] WindowsRegEnumKeyEx(int hKey, int subKeyIndex,
- int maxKeyLength);
+ int maxKeyLength);
/**
* Retries RegEnumKeyEx() MAX_ATTEMPTS times before giving up.
*/
private static byte[] WindowsRegEnumKeyEx1(int hKey, int subKeyIndex,
- int maxKeyLength) {
+ int maxKeyLength) {
byte[] result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
if (result != null) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -347,7 +347,7 @@
sleepTime *= 2;
result = WindowsRegEnumKeyEx(hKey, subKeyIndex, maxKeyLength);
if (result != null) {
- return result;
+ return result;
}
}
}
@@ -358,19 +358,19 @@
* Java wrapper for Windows registry API RegEnumValue()
*/
private static native byte[] WindowsRegEnumValue(int hKey, int valueIndex,
- int maxValueNameLength);
+ int maxValueNameLength);
/**
* Retries RegEnumValueEx() MAX_ATTEMPTS times before giving up.
*/
private static byte[] WindowsRegEnumValue1(int hKey, int valueIndex,
- int maxValueNameLength) {
+ int maxValueNameLength) {
byte[] result = WindowsRegEnumValue(hKey, valueIndex,
- maxValueNameLength);
+ maxValueNameLength);
if (result != null) {
- return result;
- } else {
- long sleepTime = INIT_SLEEP_TIME;
- for (int i = 0; i < MAX_ATTEMPTS; i++) {
+ return result;
+ } else {
+ long sleepTime = INIT_SLEEP_TIME;
+ for (int i = 0; i < MAX_ATTEMPTS; i++) {
try {
Thread.sleep(sleepTime);
} catch(InterruptedException e) {
@@ -378,9 +378,9 @@
}
sleepTime *= 2;
result = WindowsRegEnumValue(hKey, valueIndex,
- maxValueNameLength);
+ maxValueNameLength);
if (result != null) {
- return result;
+ return result;
}
}
}
@@ -404,11 +404,11 @@
int[] result =
WindowsRegCreateKeyEx1(parentNativeHandle, toWindowsName(name));
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not create windows registry "
- + "node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCreateKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".");
+ logger().warning("Could not create windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCreateKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".");
isBackingStoreAvailable = false;
return;
}
@@ -426,15 +426,15 @@
* @param rootDirectory Path to root directory, as a byte-encoded string.
*/
private WindowsPreferences(int rootNativeHandle, byte[] rootDirectory) {
- super(null,"");
+ super(null, "");
int[] result =
WindowsRegCreateKeyEx1(rootNativeHandle, rootDirectory);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
logger().warning("Could not open/create prefs root node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCreateKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".");
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCreateKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".");
isBackingStoreAvailable = false;
return;
}
@@ -451,7 +451,7 @@
private byte[] windowsAbsolutePath() {
ByteArrayOutputStream bstream = new ByteArrayOutputStream();
bstream.write(WINDOWS_ROOT_PATH, 0, WINDOWS_ROOT_PATH.length-1);
- StringTokenizer tokenizer = new StringTokenizer(absolutePath(),"/");
+ StringTokenizer tokenizer = new StringTokenizer(absolutePath(), "/");
while (tokenizer.hasMoreTokens()) {
bstream.write((byte)'\\');
String nextName = tokenizer.nextToken();
@@ -505,27 +505,30 @@
/* Check if key's path is short enough be opened at once
otherwise use a path-splitting procedure */
if (windowsAbsolutePath.length <= MAX_WINDOWS_PATH_LENGTH + 1) {
- int[] result = WindowsRegOpenKey1(rootNativeHandle(),
- windowsAbsolutePath, mask1);
- if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
- result = WindowsRegOpenKey1(rootNativeHandle(),
- windowsAbsolutePath, mask2);
+ int[] result = WindowsRegOpenKey1(rootNativeHandle(),
+ windowsAbsolutePath, mask1);
+ if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+ result = WindowsRegOpenKey1(rootNativeHandle(),
+ windowsAbsolutePath, mask2);
- if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegOpenKey(...) returned error code " +
- result[ERROR_CODE] + ".");
+ if (result[ERROR_CODE] != ERROR_SUCCESS) {
+ logger().warning("Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegOpenKey(...) returned error code " +
+ result[ERROR_CODE] + ".");
result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
if (result[ERROR_CODE] == ERROR_ACCESS_DENIED) {
- throw new SecurityException("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ": Access denied");
+ throw new SecurityException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ": Access denied");
}
- }
- return result[NATIVE_HANDLE];
+ }
+ return result[NATIVE_HANDLE];
} else {
return openKey(rootNativeHandle(), windowsAbsolutePath, mask1, mask2);
}
@@ -548,21 +551,21 @@
int mask1, int mask2) {
/* If the path is short enough open at once. Otherwise split the path */
if (windowsRelativePath.length <= MAX_WINDOWS_PATH_LENGTH + 1 ) {
- int[] result = WindowsRegOpenKey1(nativeHandle,
- windowsRelativePath, mask1);
- if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
- result = WindowsRegOpenKey1(nativeHandle,
- windowsRelativePath, mask2);
+ int[] result = WindowsRegOpenKey1(nativeHandle,
+ windowsRelativePath, mask1);
+ if (result[ERROR_CODE] == ERROR_ACCESS_DENIED && mask2 != mask1)
+ result = WindowsRegOpenKey1(nativeHandle,
+ windowsRelativePath, mask2);
- if (result[ERROR_CODE] != ERROR_SUCCESS) {
- logger().warning("Could not open windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(nativeHandle) +
- ". Windows RegOpenKey(...) returned error code " +
- result[ERROR_CODE] + ".");
+ if (result[ERROR_CODE] != ERROR_SUCCESS) {
+ logger().warning("Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(nativeHandle) +
+ ". Windows RegOpenKey(...) returned error code " +
+ result[ERROR_CODE] + ".");
result[NATIVE_HANDLE] = NULL_NATIVE_HANDLE;
- }
- return result[NATIVE_HANDLE];
+ }
+ return result[NATIVE_HANDLE];
} else {
int separatorPosition = -1;
// Be greedy - open the longest possible path
@@ -604,10 +607,12 @@
private void closeKey(int nativeHandle) {
int result = WindowsRegCloseKey(nativeHandle);
if (result != ERROR_SUCCESS) {
- logger().warning("Could not close windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegCloseKey(...) returned error code " + result + ".");
+ logger().warning("Could not close windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegCloseKey(...) returned error code " +
+ result + ".");
}
}
@@ -627,10 +632,13 @@
toWindowsName(javaName), toWindowsValueString(value));
if (result != ERROR_SUCCESS) {
logger().warning("Could not assign value to key " +
- byteArrayToString(toWindowsName(javaName))+ " at Windows registry node "
- + byteArrayToString(windowsAbsolutePath()) + " at root 0x"
- + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegSetValueEx(...) returned error code " + result + ".");
+ byteArrayToString(toWindowsName(javaName)) +
+ " at Windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegSetValueEx(...) returned error code " +
+ result + ".");
isBackingStoreAvailable = false;
}
closeKey(nativeHandle);
@@ -672,12 +680,12 @@
int result =
WindowsRegDeleteValue(nativeHandle, toWindowsName(key));
if (result != ERROR_SUCCESS && result != ERROR_FILE_NOT_FOUND) {
- logger().warning("Could not delete windows registry "
- + "value " + byteArrayToString(windowsAbsolutePath())+ "\\" +
- toWindowsName(key) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) +
- ". Windows RegDeleteValue(...) returned error code " +
- result + ".");
+ logger().warning("Could not delete windows registry value " +
+ byteArrayToString(windowsAbsolutePath()) + "\\" +
+ toWindowsName(key) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegDeleteValue(...) returned error code " +
+ result + ".");
isBackingStoreAvailable = false;
}
closeKey(nativeHandle);
@@ -693,17 +701,20 @@
// Find out the number of values
int nativeHandle = openKey(KEY_QUERY_VALUE);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int[] result = WindowsRegQueryInfoKey1(nativeHandle);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- String info = "Could not query windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegQueryInfoKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".";
+ String info = "Could not query windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegQueryInfoKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -712,17 +723,17 @@
if (valuesNumber == 0) {
closeKey(nativeHandle);
return new String[0];
- }
- // Get the values
- String[] valueNames = new String[valuesNumber];
- for (int i = 0; i < valuesNumber; i++) {
+ }
+ // Get the values
+ String[] valueNames = new String[valuesNumber];
+ for (int i = 0; i < valuesNumber; i++) {
byte[] windowsName = WindowsRegEnumValue1(nativeHandle, i,
- maxValueNameLength+1);
+ maxValueNameLength+1);
if (windowsName == null) {
String info =
- "Could not enumerate value #" + i + " of windows node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) + ".";
+ "Could not enumerate value #" + i + " of windows node " +
+ byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -740,20 +751,22 @@
*/
protected String[] childrenNamesSpi() throws BackingStoreException {
// Open key
- int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS| KEY_QUERY_VALUE);
+ int nativeHandle = openKey(KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
// Get number of children
int[] result = WindowsRegQueryInfoKey1(nativeHandle);
if (result[ERROR_CODE] != ERROR_SUCCESS) {
- String info = "Could not query windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegQueryInfoKeyEx(...) returned error code " +
- result[ERROR_CODE] + ".";
+ String info = "Could not query windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegQueryInfoKeyEx(...) returned error code " +
+ result[ERROR_CODE] + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -768,12 +781,12 @@
// Get children
for (int i = 0; i < subKeysNumber; i++) {
byte[] windowsName = WindowsRegEnumKeyEx1(nativeHandle, i,
- maxKeyLength+1);
+ maxKeyLength+1);
if (windowsName == null) {
String info =
- "Could not enumerate key #" + i + " of windows node " +
- byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
- Integer.toHexString(rootNativeHandle()) + ". ";
+ "Could not enumerate key #" + i + " of windows node " +
+ byteArrayToString(windowsAbsolutePath()) + " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ". ";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -798,20 +811,24 @@
}
if (!isBackingStoreAvailable) {
throw new BackingStoreException(
- "flush(): Backing store not available.");
+ "flush(): Backing store not available.");
}
int nativeHandle = openKey(KEY_READ);
if (nativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open windows"
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int result = WindowsRegFlushKey1(nativeHandle);
if (result != ERROR_SUCCESS) {
- String info = "Could not flush windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath())
- + " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegFlushKey(...) returned error code " + result + ".";
+ String info = "Could not flush windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegFlushKey(...) returned error code " +
+ result + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -838,7 +855,7 @@
* Logs a warning message, if Windows Registry is unavailable.
*/
protected AbstractPreferences childSpi(String name) {
- return new WindowsPreferences(this, name);
+ return new WindowsPreferences(this, name);
}
/**
@@ -849,20 +866,22 @@
*/
public void removeNodeSpi() throws BackingStoreException {
int parentNativeHandle =
- ((WindowsPreferences)parent()).openKey(DELETE);
+ ((WindowsPreferences)parent()).openKey(DELETE);
if (parentNativeHandle == NULL_NATIVE_HANDLE) {
- throw new BackingStoreException("Could not open parent windows"
- + "registry node of " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) + ".");
+ throw new BackingStoreException(
+ "Could not open parent windows registry node of " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" +
+ Integer.toHexString(rootNativeHandle()) + ".");
}
int result =
WindowsRegDeleteKey(parentNativeHandle, toWindowsName(name()));
if (result != ERROR_SUCCESS) {
- String info = "Could not delete windows "
- + "registry node " + byteArrayToString(windowsAbsolutePath()) +
- " at root 0x" + Integer.toHexString(rootNativeHandle()) +
- ". Windows RegDeleteKeyEx(...) returned error code " +
- result + ".";
+ String info = "Could not delete windows registry node " +
+ byteArrayToString(windowsAbsolutePath()) +
+ " at root 0x" + Integer.toHexString(rootNativeHandle()) +
+ ". Windows RegDeleteKeyEx(...) returned error code " +
+ result + ".";
logger().warning(info);
throw new BackingStoreException(info);
}
@@ -879,23 +898,25 @@
private static String toJavaName(byte[] windowsNameArray) {
String windowsName = byteArrayToString(windowsNameArray);
// check if Alt64
- if ((windowsName.length()>1) &&
- (windowsName.substring(0,2).equals("/!"))) {
+ if ((windowsName.length() > 1) &&
+ (windowsName.substring(0, 2).equals("/!"))) {
return toJavaAlt64Name(windowsName);
}
- StringBuffer javaName = new StringBuffer();
+ StringBuilder javaName = new StringBuilder();
char ch;
// Decode from simple encoding
- for (int i = 0; i < windowsName.length(); i++){
+ for (int i = 0; i < windowsName.length(); i++) {
if ((ch = windowsName.charAt(i)) == '/') {
char next = ' ';
if ((windowsName.length() > i + 1) &&
- ((next = windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
- ch = next;
- i++;
- } else if ((windowsName.length() > i + 1) && (next == '/')) {
- ch = '\\';
- i++;
+ ((next = windowsName.charAt(i+1)) >= 'A') &&
+ (next <= 'Z')) {
+ ch = next;
+ i++;
+ } else if ((windowsName.length() > i + 1) &&
+ (next == '/')) {
+ ch = '\\';
+ i++;
}
} else if (ch == '\\') {
ch = '/';
@@ -914,8 +935,8 @@
private static String toJavaAlt64Name(String windowsName) {
byte[] byteBuffer =
- Base64.altBase64ToByteArray(windowsName.substring(2));
- StringBuffer result = new StringBuffer();
+ Base64.altBase64ToByteArray(windowsName.substring(2));
+ StringBuilder result = new StringBuilder();
for (int i = 0; i < byteBuffer.length; i++) {
int firstbyte = (byteBuffer[i++] & 0xff);
int secondbyte = (byteBuffer[i] & 0xff);
@@ -945,10 +966,10 @@
* Base64 class.
*/
private static byte[] toWindowsName(String javaName) {
- StringBuffer windowsName = new StringBuffer();
+ StringBuilder windowsName = new StringBuilder();
for (int i = 0; i < javaName.length(); i++) {
- char ch =javaName.charAt(i);
- if ((ch < 0x0020)||(ch > 0x007f)) {
+ char ch = javaName.charAt(i);
+ if ((ch < 0x0020) || (ch > 0x007f)) {
// If a non-trivial character encountered, use altBase64
return toWindowsAlt64Name(javaName);
}
@@ -957,7 +978,7 @@
} else if (ch == '/') {
windowsName.append('\\');
} else if ((ch >= 'A') && (ch <='Z')) {
- windowsName.append("/" + ch);
+ windowsName.append('/').append(ch);
} else {
windowsName.append(ch);
}
@@ -976,13 +997,13 @@
// Convert to byte pairs
int counter = 0;
for (int i = 0; i < javaName.length();i++) {
- int ch = javaName.charAt(i);
- javaNameArray[counter++] = (byte)(ch >>> 8);
- javaNameArray[counter++] = (byte)ch;
+ int ch = javaName.charAt(i);
+ javaNameArray[counter++] = (byte)(ch >>> 8);
+ javaNameArray[counter++] = (byte)ch;
}
- return stringToByteArray(
- "/!" + Base64.byteArrayToAltBase64(javaNameArray));
+ return stringToByteArray("/!" +
+ Base64.byteArrayToAltBase64(javaNameArray));
}
/**
@@ -994,30 +1015,31 @@
private static String toJavaValueString(byte[] windowsNameArray) {
// Use modified native2ascii algorithm
String windowsName = byteArrayToString(windowsNameArray);
- StringBuffer javaName = new StringBuffer();
+ StringBuilder javaName = new StringBuilder();
char ch;
for (int i = 0; i < windowsName.length(); i++){
if ((ch = windowsName.charAt(i)) == '/') {
char next = ' ';
if (windowsName.length() > i + 1 &&
- (next = windowsName.charAt(i + 1)) == 'u') {
- if (windowsName.length() < i + 6){
+ (next = windowsName.charAt(i + 1)) == 'u') {
+ if (windowsName.length() < i + 6) {
break;
} else {
- ch = (char)Integer.parseInt
- (windowsName.substring(i + 2, i + 6), 16);
+ ch = (char)Integer.parseInt(
+ windowsName.substring(i + 2, i + 6), 16);
i += 5;
}
} else
if ((windowsName.length() > i + 1) &&
- ((windowsName.charAt(i+1)) >= 'A') && (next <= 'Z')) {
- ch = next;
- i++;
- } else if ((windowsName.length() > i + 1) &&
- (next == '/')) {
- ch = '\\';
- i++;
+ ((windowsName.charAt(i+1)) >= 'A') &&
+ (next <= 'Z')) {
+ ch = next;
+ i++;
+ } else if ((windowsName.length() > i + 1) &&
+ (next == '/')) {
+ ch = '\\';
+ i++;
}
} else if (ch == '\\') {
ch = '/';
@@ -1037,14 +1059,14 @@
* to convert java string to a byte array of ASCII characters.
*/
private static byte[] toWindowsValueString(String javaName) {
- StringBuffer windowsName = new StringBuffer();
+ StringBuilder windowsName = new StringBuilder();
for (int i = 0; i < javaName.length(); i++) {
- char ch =javaName.charAt(i);
- if ((ch < 0x0020)||(ch > 0x007f)){
+ char ch = javaName.charAt(i);
+ if ((ch < 0x0020) || (ch > 0x007f)){
// write \udddd
windowsName.append("/u");
String hex = Integer.toHexString(javaName.charAt(i));
- StringBuffer hex4 = new StringBuffer(hex);
+ StringBuilder hex4 = new StringBuilder(hex);
hex4.reverse();
int len = 4 - hex4.length();
for (int j = 0; j < len; j++){
@@ -1058,7 +1080,7 @@
} else if (ch == '/') {
windowsName.append('\\');
} else if ((ch >= 'A') && (ch <='Z')) {
- windowsName.append("/" + ch);
+ windowsName.append('/').append(ch);
} else {
windowsName.append(ch);
}
@@ -1070,8 +1092,9 @@
* Returns native handle for the top Windows node for this node.
*/
private int rootNativeHandle() {
- return (isUserNode()? USER_ROOT_NATIVE_HANDLE :
- SYSTEM_ROOT_NATIVE_HANDLE);
+ return (isUserNode()
+ ? USER_ROOT_NATIVE_HANDLE
+ : SYSTEM_ROOT_NATIVE_HANDLE);
}
/**
@@ -1090,7 +1113,7 @@
* Converts a null-terminated byte array to java string
*/
private static String byteArrayToString(byte[] array) {
- StringBuffer result = new StringBuffer();
+ StringBuilder result = new StringBuilder();
for (int i = 0; i < array.length - 1; i++) {
result.append((char)array[i]);
}
--- a/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecOptionPermission.java Fri May 22 09:50:33 2015 +0200
@@ -32,7 +32,6 @@
/**
* The ExecOptionPermission class represents permission for rmid to use
* a specific command-line option when launching an activation group.
- * <P>
*
* @author Ann Wollrath
*
@@ -68,9 +67,9 @@
* Checks if the specified permission is "implied" by
* this object.
* <P>
- * More specifically, this method returns true if:<p>
+ * More specifically, this method returns true if:
* <ul>
- * <li> <i>p</i>'s class is the same as this object's class, and<p>
+ * <li> <i>p</i>'s class is the same as this object's class, and
* <li> <i>p</i>'s name equals or (in the case of wildcards)
* is implied by this object's
* name. For example, "a.b.*" implies "a.b.c", and
@@ -111,7 +110,7 @@
* Checks two ExecOptionPermission objects for equality.
* Checks that <i>obj</i>'s class is the same as this object's class
* and has the same name as this object.
- * <P>
+ *
* @param obj the object we are testing for equality with this object.
* @return true if <i>obj</i> is an ExecOptionPermission, and has the same
* name as this ExecOptionPermission object, false otherwise.
@@ -154,7 +153,7 @@
* Returns a new PermissionCollection object for storing
* ExecOptionPermission objects.
* <p>
- * A ExecOptionPermissionCollection stores a collection of
+ * An ExecOptionPermissionCollection stores a collection of
* ExecOptionPermission permissions.
*
* <p>ExecOptionPermission objects must be stored in a manner that allows
--- a/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecPermission.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/com/sun/rmi/rmid/ExecPermission.java Fri May 22 09:50:33 2015 +0200
@@ -40,14 +40,13 @@
* all the files and directories contained in that directory. A pathname
* that ends with "/-" indicates (recursively) all files
* and subdirectories contained in that directory. A pathname consisting of
- * the special token "<<ALL FILES>>" matches <bold>any</bold> file.
+ * the special token "{@code <<ALL FILES>>}" matches <b>any</b> file.
* <P>
* Note: A pathname consisting of a single "*" indicates all the files
* in the current directory, while a pathname consisting of a single "-"
* indicates all the files in the current directory and
* (recursively) all files and subdirectories contained in the current
* directory.
- * <P>
*
*
* @author Ann Wollrath
@@ -72,7 +71,7 @@
* a directory and all the files contained in that directory. A pathname
* that ends with "/-" indicates a directory and (recursively) all files
* and subdirectories contained in that directory. The special pathname
- * "<<ALL FILES>>" matches all files.
+ * "{@code <<ALL FILES>>}" matches all files.
*
* <p>A pathname consisting of a single "*" indicates all the files
* in the current directory, while a pathname consisting of a single "-"
@@ -96,7 +95,7 @@
* a directory and all the files contained in that directory. A pathname
* that ends with "/-" indicates a directory and (recursively) all files
* and subdirectories contained in that directory. The special pathname
- * "<<ALL FILES>>" matches all files.
+ * "{@code <<ALL FILES>>}" matches all files.
*
* <p>A pathname consisting of a single "*" indicates all the files
* in the current directory, while a pathname consisting of a single "-"
@@ -114,9 +113,9 @@
/**
* Checks if this ExecPermission object "implies" the specified permission.
* <P>
- * More specifically, this method returns true if:<p>
+ * More specifically, this method returns true if:
* <ul>
- * <li> <i>p</i> is an instanceof ExecPermission,<p> and
+ * <li> <i>p</i> is an instanceof ExecPermission, and
* <li> <i>p</i>'s pathname is implied by this object's
* pathname. For example, "/tmp/*" implies "/tmp/foo", since
* "/tmp/*" encompasses the "/tmp" directory and all files in that
@@ -140,7 +139,7 @@
* Checks two ExecPermission objects for equality.
* Checks that <i>obj</i>'s class is the same as this object's class
* and has the same name as this object.
- * <P>
+ *
* @param obj the object we are testing for equality with this object.
* @return true if <i>obj</i> is an ExecPermission, and has the same
* pathname as this ExecPermission object, false otherwise.
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/LogInputStream.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/LogInputStream.java Fri May 22 09:50:33 2015 +0200
@@ -35,7 +35,7 @@
/**
* Creates a log input file with the specified system dependent
* file descriptor.
- * @param fd the system dependent file descriptor
+ * @param in the system dependent file descriptor
* @param length the total number of bytes allowed to be read
* @exception IOException If an I/O error has occurred.
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/LogOutputStream.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/LogOutputStream.java Fri May 22 09:50:33 2015 +0200
@@ -35,7 +35,7 @@
/**
* Creates an output file with the specified system dependent
* file descriptor.
- * @param fd the system dependent file descriptor
+ * @param raf the system dependent file descriptor.
* @exception IOException If an I/O error has occurred.
*/
public LogOutputStream(RandomAccessFile raf) throws IOException {
--- a/jdk/src/java.rmi/share/classes/sun/rmi/log/ReliableLog.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/log/ReliableLog.java Fri May 22 09:50:33 2015 +0200
@@ -124,7 +124,7 @@
* stable storage directory.
*
* @param dirPath path to the stable storage directory
- * @param logCl the closure object containing callbacks for logging and
+ * @param handler the closure object containing callbacks for logging and
* recovery
* @param pad ignored
* @exception IOException If a directory creation error has
@@ -170,8 +170,8 @@
* stable storage directory.
*
* @param dirPath path to the stable storage directory
- * @param logCl the closure object containing callbacks for logging and
- * recovery
+ * @param handler the closure object containing callbacks for logging and
+ * recovery
* @exception IOException If a directory creation error has
* occurred or if initialSnapshot callback raises an exception
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/registry/RegistryImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/registry/RegistryImpl.java Fri May 22 09:50:33 2015 +0200
@@ -155,7 +155,7 @@
/**
* Returns the remote object for specified name in the registry.
* @exception RemoteException If remote operation failed.
- * @exception NotBound If name is not currently bound.
+ * @exception NotBoundException If name is not currently bound.
*/
public Remote lookup(String name)
throws RemoteException, NotBoundException
@@ -188,7 +188,7 @@
/**
* Unbind the name.
* @exception RemoteException If remote operation failed.
- * @exception NotBound If name is not currently bound.
+ * @exception NotBoundException If name is not currently bound.
*/
public void unbind(String name)
throws RemoteException, NotBoundException, AccessException
--- a/jdk/src/java.rmi/share/classes/sun/rmi/runtime/Log.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/runtime/Log.java Fri May 22 09:50:33 2015 +0200
@@ -96,7 +96,7 @@
* care to interpret a range of values between BRIEF, VERBOSE and
* SILENT.
*
- * An override < 0 is interpreted to mean that the logging
+ * An override {@literal <} 0 is interpreted to mean that the logging
* configuration should not be overridden. The level passed to the
* factories createLog method will be null in this case.
*
--- a/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupImpl.java Fri May 22 09:50:33 2015 +0200
@@ -345,7 +345,7 @@
* request.
*
* @param id the object's activation identifier
- * @returns true if the operation succeeds (the operation will
+ * @return true if the operation succeeds (the operation will
* succeed if the object in currently known to be active and is
* either already unexported or is currently exported and has no
* pending/executing calls); false is returned if the object has
@@ -430,7 +430,7 @@
* hasn't already done so.
*
* @param id the object's identifier
- * @param obj the remote object implementation
+ * @param impl the remote object implementation
* @exception UnknownObjectException if object is not registered
* @exception RemoteException if call informing monitor fails
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupInit.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/server/ActivationGroupInit.java Fri May 22 09:50:33 2015 +0200
@@ -36,7 +36,7 @@
* The activator spawns (as a child process) an activation group as needed
* and directs activation requests to the appropriate activation
* group. After spawning the VM, the activator passes some
- * information to the bootstrap code via its stdin: <p>
+ * information to the bootstrap code via its stdin:
* <ul>
* <li> the activation group's id,
* <li> the activation group's descriptor (an instance of the class
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/Channel.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/Channel.java Fri May 22 09:50:33 2015 +0200
@@ -42,7 +42,7 @@
/**
* Free the connection generated by this channel.
- * @param c The connection
+ * @param conn The connection.
* @param reuse If true, the connection is in a state in which it
* can be reused for another method call.
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/LiveRef.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/LiveRef.java Fri May 22 09:50:33 2015 +0200
@@ -56,7 +56,7 @@
/**
* Construct a "well-known" live reference to a remote object
- * @param isLocalServer If true, indicates this ref specifies a local
+ * @param isLocal If true, indicates this ref specifies a local
* server in this address space; if false, the ref is for a remote
* object (hence a surrogate or proxy) in another address space.
*/
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java Fri May 22 09:50:33 2015 +0200
@@ -81,7 +81,7 @@
/**
* The CGIHandler class contains methods for executing as a CGI program.
* The main function interprets the query string as a command of the form
- * "<command>=<parameters>".
+ * "{@code <command>=<parameters>}".
*
* This class depends on the CGI 1.0 environment variables being set as
* properties of the same name in this Java VM.
--- a/jdk/src/java.scripting/share/classes/javax/script/Compilable.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.scripting/share/classes/javax/script/Compilable.java Fri May 22 09:50:33 2015 +0200
@@ -42,7 +42,7 @@
*
* @param script The source of the script, represented as a <code>String</code>.
*
- * @return An subclass of <code>CompiledScript</code> to be executed later using one
+ * @return An instance of a subclass of <code>CompiledScript</code> to be executed later using one
* of the <code>eval</code> methods of <code>CompiledScript</code>.
*
* @throws ScriptException if compilation fails.
@@ -61,7 +61,7 @@
*
* @param script The reader from which the script source is obtained.
*
- * @return An implementation of <code>CompiledScript</code> to be executed
+ * @return An instance of a subclass of <code>CompiledScript</code> to be executed
* later using one of its <code>eval</code> methods of <code>CompiledScript</code>.
*
* @throws ScriptException if compilation fails.
--- a/jdk/src/java.scripting/share/classes/javax/script/SimpleScriptContext.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.scripting/share/classes/javax/script/SimpleScriptContext.java Fri May 22 09:50:33 2015 +0200
@@ -140,6 +140,7 @@
* @throws IllegalArgumentException if the name is empty.
*/
public Object getAttribute(String name) {
+ checkName(name);
if (engineScope.containsKey(name)) {
return getAttribute(name, ENGINE_SCOPE);
} else if (globalScope != null && globalScope.containsKey(name)) {
@@ -162,7 +163,7 @@
* @throws NullPointerException if the name is null.
*/
public Object getAttribute(String name, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -191,7 +192,7 @@
* @throws NullPointerException if the name is null.
*/
public Object removeAttribute(String name, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -223,7 +224,7 @@
* @throws NullPointerException if the name is null.
*/
public void setAttribute(String name, Object value, int scope) {
-
+ checkName(name);
switch (scope) {
case ENGINE_SCOPE:
@@ -281,6 +282,7 @@
* @throws IllegalArgumentException if name is empty.
*/
public int getAttributesScope(String name) {
+ checkName(name);
if (engineScope.containsKey(name)) {
return ENGINE_SCOPE;
} else if (globalScope != null && globalScope.containsKey(name)) {
@@ -314,6 +316,13 @@
return scopes;
}
+ private void checkName(String name) {
+ Objects.requireNonNull(name);
+ if (name.isEmpty()) {
+ throw new IllegalArgumentException("name cannot be empty");
+ }
+ }
+
private static List<Integer> scopes;
static {
scopes = new ArrayList<Integer>(2);
--- a/jdk/src/java.scripting/share/classes/javax/script/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.scripting/share/classes/javax/script/package.html Fri May 22 09:50:33 2015 +0200
@@ -29,7 +29,7 @@
</head>
<body bgcolor="white">
<p>The scripting API consists of interfaces and classes that define
-Java <font size=1><sup>TM</sup></font> Scripting Engines and provides
+Java™ Scripting Engines and provides
a framework for their use in Java applications. This API is intended
for use by application programmers who wish to execute programs
written in scripting languages in their Java applications. The
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java Fri May 22 09:50:33 2015 +0200
@@ -1085,27 +1085,30 @@
* Check if need to use DNS to locate Kerberos services for name. If not
* defined, check dns_fallback, whose default value is true.
*/
- private boolean useDNS(String name) {
+ private boolean useDNS(String name, boolean defaultValue) {
Boolean value = getBooleanObject("libdefaults", name);
if (value != null) {
return value.booleanValue();
- } else {
- return getBooleanObject("libdefaults", "dns_fallback") != Boolean.FALSE;
}
+ value = getBooleanObject("libdefaults", "dns_fallback");
+ if (value != null) {
+ return value.booleanValue();
+ }
+ return defaultValue;
}
/**
* Check if need to use DNS to locate the KDC
*/
private boolean useDNS_KDC() {
- return useDNS("dns_lookup_kdc");
+ return useDNS("dns_lookup_kdc", true);
}
/*
* Check if need to use DNS to locate the Realm
*/
private boolean useDNS_Realm() {
- return useDNS("dns_lookup_realm");
+ return useDNS("dns_lookup_realm", false);
}
/**
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/FilteredRowSetImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/FilteredRowSetImpl.java Fri May 22 09:50:33 2015 +0200
@@ -466,7 +466,7 @@
* passed to the evaluate function.
* 2. updateXXXstream() - here it would suffice to pass the stream handle
* to the evaluate function and the implementation
- * of the evaluate function can do the comparision
+ * of the evaluate function can do the comparison
* based on the stream and also type of data.
*/
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JoinRowSetImpl.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/JoinRowSetImpl.java Fri May 22 09:50:33 2015 +0200
@@ -4063,14 +4063,16 @@
}
/**
- * Provide interface coverage for getURL(int) in ResultSet->RowSet
+ * Provide interface coverage for getURL(int) in
+ * ResultSet{@literal ->}RowSet
*/
public java.net.URL getURL(int columnIndex) throws SQLException {
return crsInternal.getURL(columnIndex);
}
/**
- * Provide interface coverage for getURL(String) in ResultSet->RowSet
+ * Provide interface coverage for getURL(String) in
+ * ResultSet{@literal ->}RowSet
*/
public java.net.URL getURL(String columnName) throws SQLException {
return crsInternal.getURL(columnName);
--- a/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/providers/RIOptimisticProvider.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.sql.rowset/share/classes/com/sun/rowset/providers/RIOptimisticProvider.java Fri May 22 09:50:33 2015 +0200
@@ -36,7 +36,7 @@
* The reference implementation of a JDBC Rowset synchronization provider
* providing optimistic synchronization with a relational datastore
* using any JDBC technology-enabled driver.
- * <p>
+ *
* <h3>1.0 Backgroud</h3>
* This synchronization provider is registered with the
* <code>SyncFactory</code> by default as the
--- a/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.sql.rowset/share/classes/javax/sql/rowset/serial/SerialBlob.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -67,7 +67,7 @@
* value of this <code>SerialBlob</code> object.
* @serial
*/
- private byte buf[];
+ private byte[] buf;
/**
* The internal representation of the <code>Blob</code> object on which this
@@ -103,12 +103,13 @@
* @throws SerialException if an error occurs during serialization
* @throws SQLException if a SQL errors occurs
*/
- public SerialBlob(byte[] b) throws SerialException, SQLException {
+ public SerialBlob(byte[] b)
+ throws SerialException, SQLException {
len = b.length;
buf = new byte[(int)len];
for(int i = 0; i < len; i++) {
- buf[i] = b[i];
+ buf[i] = b[i];
}
origLen = len;
}
@@ -133,19 +134,17 @@
* to this constructor is a <code>null</code>.
* @see java.sql.Blob
*/
- public SerialBlob (Blob blob) throws SerialException, SQLException {
+ public SerialBlob (Blob blob)
+ throws SerialException, SQLException {
if (blob == null) {
- throw new SQLException("Cannot instantiate a SerialBlob " +
- "object with a null Blob object");
+ throw new SQLException(
+ "Cannot instantiate a SerialBlob object with a null Blob object");
}
len = blob.length();
buf = blob.getBytes(1, (int)len );
this.blob = blob;
-
- //if ( len < 10240000)
- // len = 10240000;
origLen = len;
}
@@ -246,7 +245,8 @@
* value from the database
*/
public long position(byte[] pattern, long start)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
+
isValid();
if (start < 1 || start > len) {
return -1;
@@ -291,7 +291,7 @@
* value from the database
*/
public long position(Blob pattern, long start)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
isValid();
return position(pattern.getBytes(1, (int)(pattern.length())), start);
}
@@ -317,8 +317,8 @@
* @see #getBytes
*/
public int setBytes(long pos, byte[] bytes)
- throws SerialException, SQLException {
- return (setBytes(pos, bytes, 0, bytes.length));
+ throws SerialException, SQLException {
+ return setBytes(pos, bytes, 0, bytes.length);
}
/**
@@ -353,7 +353,7 @@
* @see #getBytes
*/
public int setBytes(long pos, byte[] bytes, int offset, int length)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
isValid();
if (offset < 0 || offset > bytes.length) {
@@ -370,7 +370,7 @@
if ((length + offset) > bytes.length) {
throw new SerialException("Invalid OffSet. Cannot have combined offset " +
- "and length that is greater that the Blob buffer");
+ "and length that is greater that the Blob buffer");
}
int i = 0;
@@ -403,7 +403,8 @@
* @see #getBinaryStream
*/
public java.io.OutputStream setBinaryStream(long pos)
- throws SerialException, SQLException {
+ throws SerialException, SQLException {
+
isValid();
if (this.blob != null) {
return this.blob.setBinaryStream(pos);
@@ -426,17 +427,16 @@
* if {@code free} had previously been called on this object
*/
public void truncate(long length) throws SerialException {
-
isValid();
if (length > len) {
- throw new SerialException
- ("Length more than what can be truncated");
+ throw new SerialException(
+ "Length more than what can be truncated");
} else if((int)length == 0) {
- buf = new byte[0];
- len = length;
+ buf = new byte[0];
+ len = length;
} else {
- len = length;
- buf = this.getBytes(1, (int)len);
+ len = length;
+ buf = this.getBytes(1, (int)len);
}
}
@@ -467,8 +467,8 @@
throw new SerialException("Invalid position in BLOB object set");
}
if (length < 1 || length > len - pos + 1) {
- throw new SerialException("length is < 1 or pos + length >"
- + "total number of bytes");
+ throw new SerialException(
+ "length is < 1 or pos + length > total number of bytes");
}
return new ByteArrayInputStream(buf, (int) pos - 1, (int) length);
}
@@ -537,14 +537,13 @@
public Object clone() {
try {
SerialBlob sb = (SerialBlob) super.clone();
- sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
+ sb.buf = (buf != null) ? Arrays.copyOf(buf, (int)len) : null;
sb.blob = null;
return sb;
} catch (CloneNotSupportedException ex) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
-
}
/**
@@ -555,15 +554,15 @@
throws IOException, ClassNotFoundException {
ObjectInputStream.GetField fields = s.readFields();
- byte[] tmp = (byte[])fields.get("buf", null);
- if (tmp == null)
- throw new InvalidObjectException("buf is null and should not be!");
- buf = tmp.clone();
- len = fields.get("len", 0L);
- if (buf.length != len)
- throw new InvalidObjectException("buf is not the expected size");
- origLen = fields.get("origLen", 0L);
- blob = (Blob) fields.get("blob", null);
+ byte[] tmp = (byte[])fields.get("buf", null);
+ if (tmp == null)
+ throw new InvalidObjectException("buf is null and should not be!");
+ buf = tmp.clone();
+ len = fields.get("len", 0L);
+ if (buf.length != len)
+ throw new InvalidObjectException("buf is not the expected size");
+ origLen = fields.get("origLen", 0L);
+ blob = (Blob) fields.get("blob", null);
}
/**
@@ -591,8 +590,8 @@
*/
private void isValid() throws SerialException {
if (buf == null) {
- throw new SerialException("Error: You cannot call a method on a "
- + "SerialBlob instance once free() has been called.");
+ throw new SerialException("Error: You cannot call a method on a " +
+ "SerialBlob instance once free() has been called.");
}
}
--- a/jdk/src/java.sql/share/classes/java/sql/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.sql/share/classes/java/sql/package.html Fri May 22 09:50:33 2015 +0200
@@ -34,10 +34,10 @@
Provides the API for accessing and processing data stored in a
data source (usually a relational database) using the
-Java<sup><font size=-2>TM</font></sup> programming language.
+Java™ programming language.
This API includes a framework whereby different
drivers can be installed dynamically to access different data sources.
-Although the JDBC<sup><font size=-2>TM</font></sup> API is mainly geared
+Although the JDBC™ API is mainly geared
to passing SQL statements to a database, it provides for reading and
writing data from any data source with a tabular format.
The reader/writer facility, available through the
@@ -45,17 +45,16 @@
use and update data from a spread sheet, flat file, or any other tabular
data source.
-<h2>What the JDBC<sup><font size=-2>TM</font></sup> 4.2 API Includes</h2>
-The JDBC<sup><font size=-2>TM</font></sup> 4.2 API includes both
+<h2>What the JDBC™ 4.2 API Includes</h2>
+The JDBC™ 4.2 API includes both
the <code>java.sql</code> package, referred to as the JDBC core API,
and the <code>javax.sql</code> package, referred to as the JDBC Optional
Package API. This complete JDBC API
-is included in the Java<sup><font size=-2>TM</font></sup>
-Standard Edition (Java SE<sup><font size=-2>TM</font></sup>), version 7.
+is included in the Java™ Standard Edition (Java SE™), version 7.
The <code>javax.sql</code> package extends the functionality of the JDBC API
from a client-side API to a server-side API, and it is an essential part
-of the Java<sup><font size=-2>TM</font></sup> Enterprise Edition
-(Java EE<sup><font size=-2>TM</font></sup>) technology.
+of the Java™ Enterprise Edition
+(Java EE™) technology.
<h2>Versions</h2>
The JDBC 4.2 API incorporates all of the previous JDBC API versions:
@@ -74,7 +73,7 @@
Classes, interfaces, methods, fields, constructors, and exceptions
have the following "since" tags that indicate when they were introduced
into the Java platform. When these "since" tags are used in
-Javadoc<sup><font size=-2>TM</font></sup> comments for the JDBC API,
+Javadoc™ comments for the JDBC API,
they indicate the following:
<UL>
<LI>Since 1.8 -- new in the JDBC 4.2 API and part of the Java SE platform,
@@ -88,7 +87,7 @@
<LI>Since 1.2 -- new in the JDBC 2.0 API and part of the J2SE platform,
version 1.2</li>
<LI>Since 1.1 or no "since" tag -- in the original JDBC 1.0 API and part of
- the JDK<sup><font size=-2>TM</font></sup>, version 1.1</li>
+ the JDK™, version 1.1</li>
</UL>
<P>
<b>NOTE:</b> Many of the new features are optional; consequently, there is
@@ -97,7 +96,7 @@
you try to use it.
<P>
<b>NOTE:</b> The class <code>SQLPermission</code> was added in the
-Java<sup><font size=-2>TM</font></sup> 2 SDK, Standard Edition,
+Java™ 2 SDK, Standard Edition,
version 1.3 release. This class is used to prevent unauthorized
access to the logging stream associated with the <code>DriverManager</code>,
which may contain information such as table names, column data, and so on.
@@ -277,7 +276,7 @@
Package API</h3>
<UL>
<LI>The <code>DataSource</code> interface as a means of making a connection. The
- Java Naming and Directory Interface<sup><font size=-2>TM</font></sup>
+ Java Naming and Directory Interface™
(JNDI) is used for registering a <code>DataSource</code> object with a
naming service and also for retrieving it.
<LI>Pooled connections -- allowing connections to be used and reused
--- a/jdk/src/java.sql/share/classes/javax/sql/package.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.sql/share/classes/javax/sql/package.html Fri May 22 09:50:33 2015 +0200
@@ -33,7 +33,7 @@
<body bgcolor="white">
Provides the API for server side data source access and processing from
-the Java<sup><font size=-2>TM</font></sup> programming language.
+the Java™ programming language.
This package supplements the <code>java.sql</code>
package and, as of the version 1.4 release, is included in the
Java Platform, Standard Edition (Java SE™).
@@ -84,7 +84,7 @@
creates is a connection to that physical data source.
<P>
A logical name for the data source is registered with a naming service that
-uses the Java Naming and Directory Interface<sup><font size=-2>TM</font></sup>
+uses the Java Naming and Directory Interface™
(JNDI) API, usually by a system administrator or someone performing the
duties of a system administrator. An application can retrieve the
<code>DataSource</code> object it wants by doing a lookup on the logical
@@ -189,7 +189,7 @@
<LI>Event Notification
<UL>
<LI><code>RowSetListener</code><br>
-A <code>RowSet</code> object is a JavaBeans<sup><font size=-2>TM</font></sup>
+A <code>RowSet</code> object is a JavaBeans™
component because it has properties and participates in the JavaBeans
event notification mechanism. The <code>RowSetListener</code> interface
is implemented by a component that wants to be notified about events that
--- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/IgnoreAllErrorHandler.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/IgnoreAllErrorHandler.java Fri May 22 09:50:33 2015 +0200
@@ -35,19 +35,30 @@
public class IgnoreAllErrorHandler implements ErrorHandler {
/** {@link org.apache.commons.logging} logging facility */
- private static java.util.logging.Logger log =
+ private static final java.util.logging.Logger log =
java.util.logging.Logger.getLogger(IgnoreAllErrorHandler.class.getName());
/** Field throwExceptions */
- private static final boolean warnOnExceptions =
- System.getProperty("com.sun.org.apache.xml.internal.security.test.warn.on.exceptions", "false").equals("true");
+ private static final boolean warnOnExceptions = getProperty(
+ "com.sun.org.apache.xml.internal.security.test.warn.on.exceptions");
/** Field throwExceptions */
- private static final boolean throwExceptions =
- System.getProperty("com.sun.org.apache.xml.internal.security.test.throw.exceptions", "false").equals("true");
+ private static final boolean throwExceptions = getProperty(
+ "com.sun.org.apache.xml.internal.security.test.throw.exceptions");
+
+ private static boolean getProperty(String name) {
+ return java.security.AccessController.doPrivileged(
+ new java.security.PrivilegedAction<Boolean>() {
+ @Override
+ public Boolean run() {
+ return Boolean.getBoolean(name);
+ }
+ });
+ }
/** @inheritDoc */
+ @Override
public void warning(SAXParseException ex) throws SAXException {
if (IgnoreAllErrorHandler.warnOnExceptions) {
log.log(java.util.logging.Level.WARNING, "", ex);
@@ -59,6 +70,7 @@
/** @inheritDoc */
+ @Override
public void error(SAXParseException ex) throws SAXException {
if (IgnoreAllErrorHandler.warnOnExceptions) {
log.log(java.util.logging.Level.SEVERE, "", ex);
@@ -70,6 +82,7 @@
/** @inheritDoc */
+ @Override
public void fatalError(SAXParseException ex) throws SAXException {
if (IgnoreAllErrorHandler.warnOnExceptions) {
log.log(java.util.logging.Level.WARNING, "", ex);
--- a/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/java.xml.crypto/share/classes/org/jcp/xml/dsig/internal/dom/DOMKeyValue.java Fri May 22 09:50:33 2015 +0200
@@ -326,32 +326,54 @@
private KeyFactory eckf;
private ECParameterSpec ecParams;
- // The supported curve, secp256r1
- private static final Curve SECP256R1;
- static {
- final String name, oid, sfield, a, b, x, y, n;
- name = "secp256r1 [NIST P-256, X9.62 prime256v1]";
- oid = "1.2.840.10045.3.1.7";
- sfield =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF";
- a =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC";
- b =
- "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B";
- x =
- "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296";
- y =
- "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5";
- n =
- "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551";
- final int h = 1;
+ /* Supported curve, secp256r1 */
+ private static final Curve SECP256R1 = initializeCurve(
+ "secp256r1 [NIST P-256, X9.62 prime256v1]",
+ "1.2.840.10045.3.1.7",
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
+ "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
+ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
+ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
+ "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
+ 1
+ );
+ /* Supported curve secp384r1 */
+ private static final Curve SECP384R1 = initializeCurve(
+ "secp384r1 [NIST P-384]",
+ "1.3.132.0.34",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
+ "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
+ "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
+ "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
+ 1
+ );
+
+ /* Supported curve secp521r1 */
+ private static final Curve SECP521R1 = initializeCurve(
+ "secp521r1 [NIST P-521]",
+ "1.3.132.0.35",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
+ "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
+ "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
+ "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
+ 1
+ );
+
+ private static Curve initializeCurve(String name, String oid,
+ String sfield, String a, String b,
+ String x, String y, String n, int h) {
BigInteger p = bigInt(sfield);
ECField field = new ECFieldFp(p);
EllipticCurve curve = new EllipticCurve(field, bigInt(a),
bigInt(b));
ECPoint g = new ECPoint(bigInt(x), bigInt(y));
- SECP256R1 = new Curve(name, oid, curve, g, bigInt(n), h);
+ return new Curve(name, oid, curve, g, bigInt(n), h);
}
EC(PublicKey key) throws KeyException {
@@ -413,24 +435,45 @@
}
private static String getCurveOid(ECParameterSpec params) {
- // Check that the params represent the secp256r1 curve
- // If so, return the object identifier of the curve
+ // Check that the params represent one of the supported
+ // curves. If there is a match, return the object identifier
+ // of the curve.
+ Curve match;
+ if (matchCurve(params, SECP256R1)) {
+ match = SECP256R1;
+ } else if (matchCurve(params, SECP384R1)) {
+ match = SECP384R1;
+ } else if (matchCurve(params, SECP521R1)) {
+ match = SECP521R1;
+ } else {
+ return null;
+ }
+ return match.getObjectId();
+ }
+
+ private static boolean matchCurve(ECParameterSpec params, Curve curve) {
int fieldSize = params.getCurve().getField().getFieldSize();
- if (SECP256R1.getCurve().getField().getFieldSize() == fieldSize
- && SECP256R1.getCurve().equals(params.getCurve())
- && SECP256R1.getGenerator().equals(params.getGenerator())
- && SECP256R1.getOrder().equals(params.getOrder())
- && SECP256R1.getCofactor() == params.getCofactor()) {
- return SECP256R1.getObjectId();
+ if (curve.getCurve().getField().getFieldSize() == fieldSize
+ && curve.getCurve().equals(params.getCurve())
+ && curve.getGenerator().equals(params.getGenerator())
+ && curve.getOrder().equals(params.getOrder())
+ && curve.getCofactor() == params.getCofactor()) {
+ return true;
+ } else {
+ return false;
}
- return null;
}
private static ECParameterSpec getECParameterSpec(String oid) {
if (oid.equals(SECP256R1.getObjectId())) {
return SECP256R1;
+ } else if (oid.equals(SECP384R1.getObjectId())) {
+ return SECP384R1;
+ } else if (oid.equals(SECP521R1.getObjectId())) {
+ return SECP521R1;
+ } else {
+ return null;
}
- return null;
}
void marshalPublicKey(Node parent, Document doc, String dsPrefix,
--- a/jdk/src/jdk.attach/share/classes/com/sun/tools/attach/package-info.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.attach/share/classes/com/sun/tools/attach/package-info.java Fri May 22 09:50:33 2015 +0200
@@ -24,8 +24,7 @@
*/
/**
- * Provides the API to attach to a Java<sup><font size=-2>TM</font></sup>
- * virtual machine.
+ * Provides the API to attach to a Java™ virtual machine.
* <p>
* A tool, written in the Java Language, uses this API to attach to a target
* virtual machine (VM) and load its tool agent into the target VM. For
--- a/jdk/src/jdk.hprof.agent/unix/native/libhprof/hprof_md.c Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.hprof.agent/unix/native/libhprof/hprof_md.c Fri May 22 09:50:33 2015 +0200
@@ -290,19 +290,7 @@
Dl_info dlinfo;
libdir[0] = 0;
-#if defined(LINUX) || defined(_ALLBSD_SOURCE) || defined(AIX)
- addr = (void*)&Agent_OnLoad;
-#else
- /* Just using &Agent_OnLoad will get the first external symbol with
- * this name in the first .so, which may not be libhprof.so.
- * On Solaris we can actually ask for the address of our Agent_OnLoad.
- */
- addr = dlsym(RTLD_SELF, "Agent_OnLoad");
- /* Just in case the above didn't work (missing linker patch?). */
- if ( addr == NULL ) {
- addr = (void*)&Agent_OnLoad;
- }
-#endif
+ addr = (void*)&md_get_prelude_path;
/* Use dladdr() to get the full path to libhprof.so, which we use to find
* the prelude file.
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Accessible.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Accessible.java Fri May 22 09:50:33 2015 +0200
@@ -40,8 +40,8 @@
public interface Accessible {
/**
- * Returns the Java<sup><font size=-2>TM</font></sup>
- * programming language modifiers, encoded in an integer.
+ * Returns the Java™ programming language modifiers, encoded
+ * in an integer.
* <p>
* The modifier encodings are defined in
* <cite>The Java™ Virtual Machine Specification</cite>
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassNotLoadedException.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/ClassNotLoadedException.java Fri May 22 09:50:33 2015 +0200
@@ -45,7 +45,7 @@
* <li>There can be no guarantee that running the appropriate class
* loader won't cause a deadlock in loading the
* class. Class loaders can consist of arbitrary
- * Java<sup><font size=-2>TM</font></sup> programming language code and the
+ * Java™ programming language code and the
* class loading methods are usually synchronized. Most of the work
* done by a debugger happens when threads are suspended. If another
* application thread is suspended within the same class loader,
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Locatable.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/Locatable.java Fri May 22 09:50:33 2015 +0200
@@ -36,10 +36,10 @@
@jdk.Exported
public interface Locatable {
/**
- * Returns the {@link Location} of this mirror, if there
- * is executable code associated with it. Note that both
- * Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
- * language methods and native methods have executable code.
+ * Returns the {@link Location} of this mirror, if there is
+ * executable code associated with it. Note that both Java™
+ * programming language methods and native methods have executable
+ * code.
* Returns null for abstract methods, since abstract methods
* have no executable code.
*
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java Fri May 22 09:50:33 2015 +0200
@@ -31,8 +31,7 @@
* Request for notification when the contents of a field are accessed
* in the target VM.
* This event will be triggered when the specified field is accessed
- * by Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
- * language code or by a
+ * by Java™ programming language code or by a
* Java Native Interface (JNI) get function (<code>Get<Type>Field,
* GetStatic<Type>Field</code>).
* Access by JDI does not trigger this event.
--- a/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.jdi/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java Fri May 22 09:50:33 2015 +0200
@@ -30,7 +30,7 @@
/**
* Request for notification when a field is set.
* This event will be triggered when a value is assigned to the specified
- * field with a Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
+ * field with a Java™ programming
* language statement (assignment, increment, etc) or by a
* Java Native Interface (JNI) set function (<code>Set<Type>Field,
* SetStatic<Type>Field</code>).
--- a/jdk/src/jdk.jdi/share/classes/jdi-overview.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.jdi/share/classes/jdi-overview.html Fri May 22 09:50:33 2015 +0200
@@ -1,11 +1,10 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
- <title>Java(tm) Debug Interface</title>
+ <title>Java™ Debug Interface</title>
</head>
<body>
- The Java<sup><font size="-2">TM</font></sup>
- Debug Interface (JDI) is a high level Java
+ The Java™ Debug Interface (JDI) is a high level Java
API providing information useful for debuggers and similar
systems needing access to the running state of a (usually remote)
virtual machine.
--- a/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RMIGenerator.java Fri May 22 09:50:33 2015 +0200
@@ -79,7 +79,7 @@
* Examine and consume command line arguments.
* @param argv The command line arguments. Ignore null
* and unknown arguments. Set each consumed argument to null.
- * @param error Report any errors using the main.error() methods.
+ * @param main Report any errors using the main.error() methods.
* @return true if no errors, false otherwise.
*/
public boolean parseArgs(String argv[], Main main) {
--- a/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/jdk.rmic/share/classes/sun/rmi/rmic/RemoteClass.java Fri May 22 09:50:33 2015 +0200
@@ -111,7 +111,7 @@
* the remote methods implemented by this class, i.e. all of the
* methods in the class's remote interfaces.
*
- * The methods in the array are ordered according to the comparision
+ * The methods in the array are ordered according to the comparison
* of the strings consisting of their method name followed by their
* type signature, so each method's index in the array corresponds
* to its "operation number" in the JDK 1.1 version of the
--- a/jdk/src/sample/share/jmx/jmx-scandir/index.html Thu May 21 18:23:01 2015 +0300
+++ b/jdk/src/sample/share/jmx/jmx-scandir/index.html Fri May 22 09:50:33 2015 +0200
@@ -33,11 +33,11 @@
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
- <title>JMX(TM) "scandir" Example</title>
+ <title>JMX™ "scandir" Example</title>
</head>
<body>
- <h1><center>Java<font size="-1"><sup>TM</sup></font> Management Extensions (JMX<font size="-1"><sup>TM</sup></font>) <i>scandir</i> Example</center></h1>
+ <h1><center>Java™ Management Extensions (JMX™) <i>scandir</i> Example</center></h1>
<h2><a name="h2-Introduction">Introduction</a></h2>
<ul>
@@ -1197,7 +1197,7 @@
<p>Another common best practice when you want
to improve interoperability is to use directly
the Notification base classes provided in the
- JMX<sup>TM</sup> API. Do not create your own
+ JMX™ API. Do not create your own
subclasses of these standard classes.
</p>
<p>Indeed, if you code your own subclass, a generic
@@ -1974,7 +1974,7 @@
More information on SSL authentication can be obtained from the <a
href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
title="How SSL Works"
- >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>.
+ >Java™ Secure Socket Extension (JSSE) Reference Guide</a>.
</p>
<p>To start jconsole with our provided keystore and
truststore, go to the scandir example root directory and
@@ -2202,13 +2202,13 @@
<li><a
href="http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#HowSSLWorks"
title="The JSSE Reference Guide"
- >Java<sup>TM</sup> Secure Socket Extension (JSSE) Reference Guide</a>:
- comprehensive documentation about the Java<sup>TM</sup> Secure Socket
+ >Java™ Secure Socket Extension (JSSE) Reference Guide</a>:
+ comprehensive documentation about the Java™ Secure Socket
Extension (JSSE)
</li>
<li><a href="http://java.sun.com/javase/6/docs/"
>Java SE 6 Documentation Index</a>: This document covers the
- Java<sup>TM</sup> Platform, Standard Edition 6 JDK.</li>
+ Java™ Platform, Standard Edition 6 JDK.</li>
</ol>
<p>
<hr>
--- a/jdk/test/TEST.groups Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/TEST.groups Fri May 22 09:50:33 2015 +0200
@@ -534,7 +534,6 @@
sun/nio/cs/OLD/TestIBMDB.java \
sun/nio/cs/SJISCanEncode.java \
sun/nio/cs/Test6254467.java \
- sun/nio/cs/TestCompoundTest.java \
sun/nio/cs/TestCp834_SBCS.java \
sun/nio/cs/TestEUC_TW.java \
sun/nio/cs/TestISO2022CNDecoder.java \
@@ -599,6 +598,10 @@
sun/security/jgss \
sun/security/krb5 \
java/lang/annotation/AnnotationType/AnnotationTypeDeadlockTest.java \
+ java/lang/invoke/lambda/LambdaStackTrace.java \
+ java/lang/invoke/LFCaching/LFGarbageCollectedTest.java \
+ java/lang/invoke/LFCaching/LFMultiThreadCachingTest.java \
+ java/lang/invoke/LFCaching/LFSingleThreadCachingTest.java \
java/lang/System/MacEncoding/TestFileEncoding.java \
java/nio/channels/AsynchronousSocketChannel/Leaky.java \
java/security/PermissionCollection/Concurrent.java \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Cipher/KeyWrap/TestCipherKeyWrapperTest.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,316 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 static java.lang.System.out;
+
+import java.lang.Integer;
+import java.lang.String;
+import java.lang.System;
+import java.security.AlgorithmParameters;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.KeyPair;
+import java.security.NoSuchAlgorithmException;
+import java.security.KeyPairGenerator;
+import java.security.Provider;
+import java.security.Security;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+
+/*
+ * @test
+ * @bug 8048599
+ * @summary Tests for key wrap and unwrap operations
+ */
+
+public class TestCipherKeyWrapperTest {
+ private static final String SUN_JCE = "SunJCE";
+ // Blowfish Variable key length: 32 bits to 448 bits
+ private static final int BLOWFISH_MIN_KEYSIZE = 32;
+ private static final int BLOWFISH_MAX_KEYSIZE = 448;
+ private static final int LINIMITED_KEYSIZE = 128;
+ private static final String NOPADDING = "NoPaDDing";
+ private static final String[] PBE_ALGORITHM_AR = { "pbeWithMD5ANDdes",
+ "PBEWithMD5AndDES/CBC/PKCS5Padding", "PBEWithMD5AndTripleDES",
+ "PBEWithMD5AndTripleDES/CBC/PKCS5Padding", "PBEwithSHA1AndDESede",
+ "PBEwithSHA1AndDESede/CBC/PKCS5Padding", "PBEwithSHA1AndRC2_40",
+ "PBEwithSHA1Andrc2_40/CBC/PKCS5Padding", "PBEWithSHA1AndRC2_128",
+ "PBEWithSHA1andRC2_128/CBC/PKCS5Padding", "PBEWithSHA1AndRC4_40",
+ "PBEWithsha1AndRC4_40/ECB/NoPadding", "PBEWithSHA1AndRC4_128",
+ "pbeWithSHA1AndRC4_128/ECB/NoPadding", "PBEWithHmacSHA1AndAES_128",
+ "PBEWithHmacSHA224AndAES_128", "PBEWithHmacSHA256AndAES_128",
+ "PBEWithHmacSHA384AndAES_128", "PBEWithHmacSHA512AndAES_128",
+ "PBEWithHmacSHA1AndAES_256", "PBEWithHmacSHA224AndAES_256",
+ "PBEWithHmacSHA256AndAES_256", "PBEWithHmacSHA384AndAES_256",
+ "PBEWithHmacSHA512AndAES_256" };
+ private static final String[] MODEL_AR = { "ECb", "pCbC", "cbC", "cFB",
+ "cFB24", "cFB40", "OfB48", "OFB64" };
+ private static final String[] PADDING_AR = { NOPADDING, "PKCS5Padding" };
+
+ private enum AlgorithmWrapper {
+ AESWrap("AES", "AESWrap", -1),
+ AESWrap_128("AES", "AESWrap_128", 128),
+ AESWrap_192("AES", "AESWrap_192", 192),
+ AESWrap_256("AES", "AESWrap_256", 256),
+ DESedeWrap("desede", "DESedeWrap", -1),
+ NegtiveWrap("AES", "DESedeWrap", -1);
+
+ private final String algorithm;
+ private final String wrapper;
+ private final int keySize;
+
+ private AlgorithmWrapper(String algorithm, String wrapper, int kSize) {
+ this.algorithm = algorithm;
+ this.wrapper = wrapper;
+ this.keySize = kSize;
+ }
+
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ public String getWrapper() {
+ return wrapper;
+ }
+
+ public int getKeySize() {
+ return keySize;
+ }
+
+ };
+
+ public static void main(String[] args) throws Exception {
+
+ TestCipherKeyWrapperTest test = new TestCipherKeyWrapperTest();
+ // AESWrap and DESedeWrap test
+ for (AlgorithmWrapper algoWrapper : AlgorithmWrapper.values()) {
+ String algo = algoWrapper.getAlgorithm();
+ String wrapper = algoWrapper.getWrapper();
+ try {
+ int keySize = algoWrapper.getKeySize();
+ // only run the tests on longer key lengths if unlimited
+ // version of JCE jurisdiction policy files are installed
+ if (!(Cipher.getMaxAllowedKeyLength(algo) == Integer.MAX_VALUE)
+ && keySize > LINIMITED_KEYSIZE) {
+ out.println(algo + " will not run if unlimited version of"
+ + " JCE jurisdiction policy files are installed");
+ continue;
+ }
+ test.wrapperAesDESedeKeyTest(algo, wrapper, keySize);
+ if (algoWrapper == AlgorithmWrapper.NegtiveWrap) {
+ throw new RuntimeException("Expected not throw when algo"
+ + " and wrapAlgo are not match:" + algo);
+ }
+ } catch (InvalidKeyException e) {
+ if (algoWrapper == AlgorithmWrapper.NegtiveWrap) {
+ out.println("Expepted exception when algo"
+ + " and wrapAlgo are not match:" + algo);
+ } else {
+ throw e;
+ }
+ }
+ }
+ test.wrapperBlowfishKeyTest();
+ // PBE and public wrapper test.
+ String[] publicPrivateAlgos = new String[] { "DiffieHellman", "DSA",
+ "RSA" };
+ Provider provider = Security.getProvider(SUN_JCE);
+ if (provider == null) {
+ throw new RuntimeException("SUN_JCE provider not exist");
+ }
+
+ test.wrapperPBEKeyTest(provider);
+ // Public and private key wrap test
+ test.wrapperPublicPriviteKeyTest(provider, publicPrivateAlgos);
+ }
+
+ private void wrapperAesDESedeKeyTest(String algo, String wrapAlgo,
+ int keySize) throws InvalidKeyException, NoSuchAlgorithmException,
+ NoSuchPaddingException, IllegalBlockSizeException,
+ InvalidAlgorithmParameterException {
+ // Initialization
+ KeyGenerator kg = KeyGenerator.getInstance(algo);
+ if (keySize != -1) {
+ kg.init(keySize);
+ }
+ SecretKey key = kg.generateKey();
+ wrapTest(algo, wrapAlgo, key, key, Cipher.SECRET_KEY, false);
+ }
+
+ private void wrapperBlowfishKeyTest() throws InvalidKeyException,
+ NoSuchAlgorithmException, NoSuchPaddingException,
+ IllegalBlockSizeException, InvalidAlgorithmParameterException {
+ // how many kinds of padding mode
+ int padKinds;
+ // Keysize should be multiple of 8 bytes.
+ int KeyCutter = 8;
+ int kSize = BLOWFISH_MIN_KEYSIZE;
+ String algorithm = "Blowfish";
+ int maxAllowKeyLength = Cipher.getMaxAllowedKeyLength(algorithm);
+ boolean unLimitPolicy = maxAllowKeyLength == Integer.MAX_VALUE;
+ SecretKey key = null;
+ while (kSize <= BLOWFISH_MAX_KEYSIZE) {
+ for (String mode : MODEL_AR) {
+ // PKCS5padding is meaningful only for ECB, CBC, PCBC
+ if (mode.equalsIgnoreCase(MODEL_AR[0])
+ || mode.equalsIgnoreCase(MODEL_AR[1])
+ || mode.equalsIgnoreCase(MODEL_AR[2])) {
+ padKinds = PADDING_AR.length;
+ } else {
+ padKinds = 1;
+ }
+ // Initialization
+ KeyGenerator kg = KeyGenerator.getInstance(algorithm);
+ for (int k = 0; k < padKinds; k++) {
+ String transformation = algorithm + "/" + mode + "/"
+ + PADDING_AR[k];
+ if (NOPADDING.equals(PADDING_AR[k]) && kSize % 64 != 0) {
+ out.println(transformation
+ + " will not run if input length not multiple"
+ + " of 8 bytes when padding is " + NOPADDING);
+ continue;
+ }
+ kg.init(kSize);
+ key = kg.generateKey();
+ // only run the tests on longer key lengths if unlimited
+ // version of JCE jurisdiction policy files are installed
+ if (!unLimitPolicy && kSize > LINIMITED_KEYSIZE) {
+ out.println("keyStrength > 128 within " + algorithm
+ + " will not run under global policy");
+ } else {
+ wrapTest(transformation, transformation, key, key,
+ Cipher.SECRET_KEY, false);
+ }
+ }
+ }
+ if (kSize <= LINIMITED_KEYSIZE) {
+ KeyCutter = 8;
+ } else {
+ KeyCutter = 48;
+ }
+ kSize += KeyCutter;
+ }
+ }
+
+ private void wrapperPBEKeyTest(Provider p) throws InvalidKeySpecException,
+ InvalidKeyException, NoSuchPaddingException,
+ IllegalBlockSizeException, InvalidAlgorithmParameterException,
+ NoSuchAlgorithmException {
+ for (String alg : PBE_ALGORITHM_AR) {
+ String baseAlgo = alg.split("/")[0].toUpperCase();
+ // only run the tests on longer key lengths if unlimited version
+ // of JCE jurisdiction policy files are installed
+
+ if (Cipher.getMaxAllowedKeyLength(alg) < Integer.MAX_VALUE
+ && (baseAlgo.endsWith("TRIPLEDES") || alg
+ .endsWith("AES_256"))) {
+ out.println("keyStrength > 128 within " + alg
+ + " will not run under global policy");
+ continue;
+ }
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(baseAlgo, p);
+ SecretKey key = skf.generateSecret(new PBEKeySpec("Secret Lover"
+ .toCharArray()));
+ wrapTest(alg, alg, key, key, Cipher.SECRET_KEY, true);
+ }
+ }
+
+ private void wrapperPublicPriviteKeyTest(Provider p, String[] algorithms)
+ throws NoSuchAlgorithmException, InvalidKeyException,
+ NoSuchPaddingException, IllegalBlockSizeException,
+ InvalidAlgorithmParameterException {
+ for (String algo : algorithms) {
+ // Key pair generated
+ System.out.println("Generate key pair (algorithm: " + algo
+ + ", provider: " + p.getName() + ")");
+ KeyPairGenerator kpg = KeyPairGenerator.getInstance(algo);
+ kpg.initialize(512);
+ KeyPair kp = kpg.genKeyPair();
+ // key generated
+ String algoWrap = "DES";
+ KeyGenerator kg = KeyGenerator.getInstance(algoWrap, p);
+ Key key = kg.generateKey();
+ wrapTest(algo, algoWrap, key, kp.getPrivate(), Cipher.PRIVATE_KEY,
+ false);
+ wrapTest(algo, algoWrap, key, kp.getPublic(), Cipher.PUBLIC_KEY,
+ false);
+ }
+ }
+
+ private void wrapTest(String transformation, String wrapAlgo, Key initKey,
+ Key wrapKey, int keyType, boolean isPBE)
+ throws NoSuchAlgorithmException, NoSuchPaddingException,
+ InvalidKeyException, IllegalBlockSizeException,
+ InvalidAlgorithmParameterException {
+ String algo = transformation.split("/")[0];
+ boolean isAESBlowfish = algo.indexOf("AES") != -1
+ || algo.indexOf("Blowfish") != -1;
+ AlgorithmParameters aps = null;
+ AlgorithmParameterSpec pbeParams = null;
+ if (isPBE) {
+ byte[] salt = new byte[8];
+ int iterCnt = 1000;
+ new Random().nextBytes(salt);
+ pbeParams = new PBEParameterSpec(salt, iterCnt);
+ }
+ // Wrap & UnWrap operation
+ Cipher wrapCI = Cipher.getInstance(wrapAlgo);
+ if (isPBE && !isAESBlowfish) {
+ wrapCI.init(Cipher.WRAP_MODE, initKey, pbeParams);
+ } else if (isAESBlowfish) {
+ wrapCI.init(Cipher.WRAP_MODE, initKey);
+ aps = wrapCI.getParameters();
+ } else {
+ wrapCI.init(Cipher.WRAP_MODE, initKey);
+ }
+ out.println("keysize : " + wrapKey.getEncoded().length);
+ byte[] keyWrapper = wrapCI.wrap(wrapKey);
+ if (isPBE && !isAESBlowfish) {
+ wrapCI.init(Cipher.UNWRAP_MODE, initKey, pbeParams);
+ } else if (isAESBlowfish) {
+ wrapCI.init(Cipher.UNWRAP_MODE, initKey, aps);
+ } else {
+ wrapCI.init(Cipher.UNWRAP_MODE, initKey);
+ }
+ Key unwrappedKey = wrapCI.unwrap(keyWrapper, algo, keyType);
+ // Comparison
+ if (!Arrays.equals(wrapKey.getEncoded(), unwrappedKey.getEncoded())) {
+ throw new RuntimeException("Comparation failed testing "
+ + transformation + ":" + wrapAlgo + ":" + keyType);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/Character/UnicodeBlock/NonOptimalMapSize.java Fri May 22 09:50:33 2015 +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
+ * @bug 8080535
+ * @summary Expected size of Character.UnicodeBlock.map is not optimal
+ */
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+public class NonOptimalMapSize {
+ public static void main(String[] args) throws Throwable {
+ Class<?> ubCls = Character.UnicodeBlock.class;
+ Field mapField = ubCls.getDeclaredField("map");
+ mapField.setAccessible(true);
+ Map<?,?> map = (Map<?,?>)mapField.get(null);
+ if (!map.getClass().equals(HashMap.class)) {
+ throw new RuntimeException(
+ "Character.UnicodeBlock.map is expected to be HashMap");
+ }
+ int mapSize = map.size();
+
+ Field sizeField = ubCls.getDeclaredField("INITIAL_CAPACITY");
+ sizeField.setAccessible(true);
+ int INITIAL_CAPACITY = sizeField.getInt(null);
+
+ // Construct a HashMap with specified initial capacity
+ HashMap<Object,Object> map1 = new HashMap<>(INITIAL_CAPACITY);
+ Class<?> hmCls = HashMap.class;
+ Field tableField = hmCls.getDeclaredField("table");
+ tableField.setAccessible(true);
+ // ... and fill it up
+ map1.put(new Object(), new Object());
+ final Object initialTable = tableField.get(map1);
+ while (map1.size() < map.size() &&
+ initialTable == tableField.get(map1)) {
+ map1.put(new Object(), new Object());
+ }
+
+ // Now check that internal storage didn't change
+ if (initialTable != tableField.get(map1)) {
+ throw new RuntimeException(
+ "Initial capacity " + INITIAL_CAPACITY +
+ " was only enough to hold " + (map1.size()-1) +
+ " entries, but needed " + map.size());
+ }
+ }
+}
--- a/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/lang/Runtime/exec/LotsOfOutput.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,12 +23,22 @@
/**
* @test
- * @bug 4369826
+ * @bug 4369826 8078582
* @summary Process with lots of output should not crash VM
+ * @key intermittent
* @author kladko
*/
public class LotsOfOutput {
+ static final Runtime runtime = Runtime.getRuntime();
+
+ // Allow memory to grow by up to 1Mb total
+ static final int THRESHOLD = 1048576;
+
+ // Compute used memory
+ static long usedMemory() {
+ return runtime.totalMemory() - runtime.freeMemory();
+ }
public static void main(String[] args) throws Exception {
if (! UnixCommands.isUnix) {
@@ -37,18 +47,21 @@
}
UnixCommands.ensureCommandsAvailable("cat");
- Process p = Runtime.getRuntime().exec(UnixCommands.cat() + " /dev/zero");
- long initMemory = Runtime.getRuntime().totalMemory();
- for (int i=1; i< 10; i++) {
+ Process p = runtime.exec(UnixCommands.cat() + " /dev/zero");
+ long initMemory = usedMemory();
+ boolean growing = false;
+ for (int i = 1; i < 10; i++) {
Thread.sleep(100);
- long totalMemory = Runtime.getRuntime().totalMemory();
- if (totalMemory != initMemory) {
- System.out.printf("consuming memory: i: %d, initial: %d, total: %d, delta: %d%n",
- i, initMemory, totalMemory, totalMemory - initMemory);
+ 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 (totalMemory > initMemory + 1000000)
- throw new Exception("Process consumes memory.");
+ if (used > initMemory + THRESHOLD)
+ growing = true;
}
+ if (growing)
+ throw new Exception("Process consumes memory.");
}
}
--- a/jdk/test/java/lang/SecurityManager/CheckSecurityProvider.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/lang/SecurityManager/CheckSecurityProvider.java Fri May 22 09:50:33 2015 +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
@@ -67,6 +67,7 @@
expected.add("com.sun.security.sasl.Provider");
expected.add("org.jcp.xml.dsig.internal.dom.XMLDSigRI");
expected.add("sun.security.smartcardio.SunPCSC");
+ expected.add("sun.security.provider.certpath.ldap.JdkLDAP");
if (os.startsWith("Windows")) {
expected.add("sun.security.mscapi.SunMSCAPI");
}
--- a/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/lang/instrument/PremainClass/NoPremainAgentTest.java Fri May 22 09:50:33 2015 +0200
@@ -33,7 +33,7 @@
* @modules java.management
* @run build jdk.testlibrary.* DummyMain
* @run shell ../MakeJAR3.sh NoPremainAgent
- * @run main NoPremainAgentTest
+ * @run main/othervm -XX:-CreateCoredumpOnCrash NoPremainAgentTest
*/
public class NoPremainAgentTest {
// Use a javaagent without the premain() function.
--- a/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/lang/instrument/PremainClass/ZeroArgPremainAgentTest.java Fri May 22 09:50:33 2015 +0200
@@ -33,7 +33,7 @@
* @modules java.management
* @run build jdk.testlibrary.* DummyMain
* @run shell ../MakeJAR3.sh ZeroArgPremainAgent
- * @run main ZeroArgPremainAgentTest
+ * @run main/othervm -XX:-CreateCoredumpOnCrash ZeroArgPremainAgentTest
*/
public class ZeroArgPremainAgentTest {
// Use a javaagent with a zero argument premain() function.
--- a/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/lang/invoke/MethodHandles/CatchExceptionTest.java Fri May 22 09:50:33 2015 +0200
@@ -72,12 +72,6 @@
final int catchDrops) {
this.testCase = testCase;
this.dropped = catchDrops;
- if (Helper.IS_VERBOSE) {
- System.out.printf("CatchException::CatchException(%s, isVararg=%b " +
- "argsCount=%d catchDrops=%d)%n",
- testCase, isVararg, argsCount, catchDrops
- );
- }
MethodHandle thrower = testCase.thrower;
int throwerLen = thrower.type().parameterCount();
List<Class<?>> classes;
@@ -97,9 +91,11 @@
}
public static void main(String[] args) throws Throwable {
+ System.out.println("classes = " + ARGS_CLASSES);
+
TestFactory factory = new TestFactory();
long timeout = Helper.IS_THOROUGH ? 0L : Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT);
- // substract vm init time and reserve time for vm exit
+ // subtract vm init time and reserve time for vm exit
timeout *= 0.9;
TimeLimitedRunner runner = new TimeLimitedRunner(timeout, 2.0d,
() -> {
@@ -131,6 +127,12 @@
}
private void runTest() {
+ if (Helper.IS_VERBOSE) {
+ System.out.printf("CatchException(%s, isVararg=%b argsCount=%d " +
+ "dropped=%d)%n",
+ testCase, thrower.isVarargsCollector(), argsCount, dropped);
+ }
+
Helper.clear();
Object[] args = Helper.randomArgs(
@@ -212,10 +214,7 @@
args = 1;
}
- if (Helper.IS_VERBOSE) {
- System.out.printf("maxArgs = %d%nmaxDrops = %d%n",
- maxArgs, maxDrops);
- }
+ System.out.printf("maxArgs = %d%nmaxDrops = %d%n", maxArgs, maxDrops);
constructorSize = TestCase.CONSTRUCTORS.size();
}
@@ -243,7 +242,7 @@
/**
* @return next test from test matrix:
- * {varArgs, noVarArgs} x TestCase.rtypes x TestCase.THROWABLES x {1, .., maxArgs } x {1, .., maxDrops}
+ * {varArgs, noVarArgs} x TestCase.rtypes x TestCase.THROWABLES x {1, .., maxArgs } x {0, .., maxDrops}
*/
public CatchExceptionTest nextTest() {
if (constructor < constructorSize) {
@@ -256,7 +255,7 @@
return null;
}
if (dropArgs <= currentMaxDrops) {
- if (dropArgs == 1) {
+ if (dropArgs == 0) {
if (Helper.IS_THOROUGH || Helper.RNG.nextBoolean()) {
++dropArgs;
return createTest();
@@ -271,8 +270,8 @@
}
}
- if (args <= maxArgs) {
- dropArgs = 1;
+ if (args < maxArgs) {
+ dropArgs = 0;
currentMaxDrops = Math.min(args, maxDrops);
++args;
return createTest();
--- a/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/lang/management/ThreadMXBean/AllThreadIds.java Fri May 22 09:50:33 2015 +0200
@@ -32,9 +32,30 @@
*/
import java.lang.management.*;
+import java.time.Instant;
import java.util.concurrent.Phaser;
+import java.util.function.Supplier;
public class AllThreadIds {
+ /**
+ * A supplier wrapper for the delayed format printing.
+ * The supplied value will have to be formatted as <em>$s</em>
+ * @param <T> The wrapped type
+ */
+ private static final class ArgWrapper<T> {
+ private final Supplier<T> val;
+
+ public ArgWrapper(Supplier<T> val) {
+ this.val = val;
+ }
+
+ @Override
+ public String toString() {
+ T resolved = val.get();
+ return resolved != null ? resolved.toString() : null;
+ }
+ }
+
final static int DAEMON_THREADS = 20;
final static int USER_THREADS = 5;
final static int ALL_THREADS = DAEMON_THREADS + USER_THREADS;
@@ -47,15 +68,10 @@
private static long prevTotalThreadCount = 0;
private static int prevLiveThreadCount = 0;
private static int prevPeakThreadCount = 0;
- private static long curTotalThreadCount = 0;
- private static int curLiveThreadCount = 0;
- private static int curPeakThreadCount = 0;
private static final Phaser startupCheck = new Phaser(ALL_THREADS + 1);
private static void printThreadList() {
- if (!trace) return;
-
long[] list = mbean.getAllThreadIds();
for (int i = 1; i <= list.length; i++) {
System.out.println(i + ": Thread id = " + list[i-1]);
@@ -68,59 +84,13 @@
}
}
- private static void fail(String msg) {
- trace = true;
- printThreadList();
- throw new RuntimeException(msg);
+ private static void checkInitialState() throws Exception {
+ updateCounters();
+ checkThreadCount(0, 0);
}
- private static void checkThreadCount(int numNewThreads,
- int numTerminatedThreads)
- throws Exception {
- prevTotalThreadCount = curTotalThreadCount;
- prevLiveThreadCount = curLiveThreadCount;
- prevPeakThreadCount = curPeakThreadCount;
- curTotalThreadCount = mbean.getTotalStartedThreadCount();
- curLiveThreadCount = mbean.getThreadCount();
- curPeakThreadCount = mbean.getPeakThreadCount();
-
- if ((curLiveThreadCount - prevLiveThreadCount) !=
- (numNewThreads - numTerminatedThreads)) {
- fail("Unexpected number of live threads: " +
- " Prev live = " + prevLiveThreadCount +
- " Current live = " + curLiveThreadCount +
- " Threads added = " + numNewThreads +
- " Threads terminated = " + numTerminatedThreads);
- }
- if (curPeakThreadCount - prevPeakThreadCount != numNewThreads) {
- fail("Unexpected number of peak threads: " +
- " Prev peak = " + prevPeakThreadCount +
- " Current peak = " + curPeakThreadCount +
- " Threads added = " + numNewThreads);
- }
- if (curTotalThreadCount - prevTotalThreadCount != numNewThreads) {
- fail("Unexpected number of total threads: " +
- " Prev Total = " + prevTotalThreadCount +
- " Current Total = " + curTotalThreadCount +
- " Threads added = " + numNewThreads);
- }
- long[] list = mbean.getAllThreadIds();
- if (list.length != curLiveThreadCount) {
- fail("Array length returned by " +
- "getAllThreadIds() = " + list.length +
- " not matched count = " + curLiveThreadCount);
- }
- }
-
- public static void main(String args[]) throws Exception {
- if (args.length > 0 && args[0].equals("trace")) {
- trace = true;
- }
-
- curTotalThreadCount = mbean.getTotalStartedThreadCount();
- curLiveThreadCount = mbean.getThreadCount();
- curPeakThreadCount = mbean.getPeakThreadCount();
- checkThreadCount(0, 0);
+ private static void checkAllThreadsAlive() throws Exception {
+ updateCounters();
// Start all threads and wait to be sure they all are alive
for (int i = 0; i < ALL_THREADS; i++) {
@@ -133,8 +103,9 @@
startupCheck.arriveAndAwaitAdvance();
checkThreadCount(ALL_THREADS, 0);
- printThreadList();
-
+ if (trace) {
+ printThreadList();
+ }
// Check mbean now. All threads must appear in getAllThreadIds() list
long[] list = mbean.getAllThreadIds();
@@ -165,6 +136,10 @@
if (trace) {
System.out.println();
}
+ }
+
+ private static void checkDaemonThreadsDead() throws Exception {
+ updateCounters();
// Stop daemon threads, wait to be sure they all are dead, and check
// that they disappeared from getAllThreadIds() list
@@ -179,7 +154,7 @@
checkThreadCount(0, DAEMON_THREADS);
// Check mbean now
- list = mbean.getAllThreadIds();
+ long[] list = mbean.getAllThreadIds();
for (int i = 0; i < ALL_THREADS; i++) {
long expectedId = allThreads[i].getId();
@@ -208,6 +183,10 @@
}
}
}
+ }
+
+ private static void checkAllThreadsDead() throws Exception {
+ updateCounters();
// Stop all threads and wait to be sure they all are dead
for (int i = DAEMON_THREADS; i < ALL_THREADS; i++) {
@@ -219,6 +198,127 @@
// and check the thread count
checkThreadCount(0, ALL_THREADS - DAEMON_THREADS);
+ }
+
+ private static void checkThreadCount(int numNewThreads,
+ int numTerminatedThreads)
+ throws Exception {
+
+ checkLiveThreads(numNewThreads, numTerminatedThreads);
+ checkPeakThreads(numNewThreads);
+ checkTotalThreads(numNewThreads);
+ checkThreadIds();
+ }
+
+ private static void checkLiveThreads(int numNewThreads,
+ int numTerminatedThreads)
+ throws InterruptedException {
+ int diff = numNewThreads - numTerminatedThreads;
+
+ waitTillEquals(
+ diff + prevLiveThreadCount,
+ ()->(long)mbean.getThreadCount(),
+ "Unexpected number of live threads: " +
+ " Prev live = %1$d Current live = ${provided} Threads added = %2$d" +
+ " Threads terminated = %3$d",
+ ()->prevLiveThreadCount,
+ ()->numNewThreads,
+ ()->numTerminatedThreads
+ );
+ }
+
+ private static void checkPeakThreads(int numNewThreads)
+ throws InterruptedException {
+
+ waitTillEquals(numNewThreads + prevPeakThreadCount,
+ ()->(long)mbean.getPeakThreadCount(),
+ "Unexpected number of peak threads: " +
+ " Prev peak = %1$d Current peak = ${provided} Threads added = %2$d",
+ ()->prevPeakThreadCount,
+ ()->numNewThreads
+ );
+ }
+
+ private static void checkTotalThreads(int numNewThreads)
+ throws InterruptedException {
+
+ waitTillEquals(numNewThreads + prevTotalThreadCount,
+ ()->mbean.getTotalStartedThreadCount(),
+ "Unexpected number of total threads: " +
+ " Prev Total = %1$d Current Total = ${provided} Threads added = %2$d",
+ ()->prevTotalThreadCount,
+ ()->numNewThreads
+ );
+ }
+
+ private static void checkThreadIds() throws InterruptedException {
+ long[] list = mbean.getAllThreadIds();
+
+ waitTillEquals(
+ list.length,
+ ()->(long)mbean.getThreadCount(),
+ "Array length returned by " +
+ "getAllThreadIds() = %1$d not matched count = ${provided}",
+ ()->list.length
+ );
+ }
+
+ /**
+ * Waits till the <em>expectedVal</em> equals to the <em>retrievedVal</em>.
+ * It will report a status message on the first occasion of the value mismatch
+ * and then, subsequently, when the <em>retrievedVal</em> value changes.
+ * @param expectedVal The value to wait for
+ * @param retrievedVal The supplier of the value to check against the <em>expectedVal</em>
+ * @param msgFormat The formatted message to be printed in case of mismatch
+ * @param msgArgs The parameters to the formatted message
+ * @throws InterruptedException
+ */
+ private static void waitTillEquals(long expectedVal, Supplier<Long> retrievedVal,
+ String msgFormat, Supplier<Object> ... msgArgs)
+ throws InterruptedException {
+ Object[] args = null;
+
+ long countPrev = -1;
+ while (true) {
+ Long count = retrievedVal.get();
+ if (count == expectedVal) break;
+ if (countPrev == -1 || countPrev != count) {
+ if (args == null) {
+ args = new Object[msgArgs.length];
+ for(int i=0; i < msgArgs.length; i++) {
+ args[i] = new ArgWrapper<>((Supplier<Object>)msgArgs[i]);
+ }
+ }
+ System.err.format("TS: %s\n", Instant.now());
+ System.err.format(
+ msgFormat
+ .replace("${provided}", String.valueOf(count))
+ .replace("$d", "$s"),
+ args
+ ).flush();
+ printThreadList();
+ System.err.println("\nRetrying ...\n");
+ }
+ countPrev = count;
+ Thread.sleep(1);
+ }
+ }
+
+ private static void updateCounters() {
+ prevTotalThreadCount = mbean.getTotalStartedThreadCount();
+ prevLiveThreadCount = mbean.getThreadCount();
+ prevPeakThreadCount = mbean.getPeakThreadCount();
+ }
+
+ public static void main(String args[]) throws Exception {
+ if (args.length > 0 && args[0].equals("trace")) {
+ trace = true;
+ }
+
+ checkInitialState();
+ checkAllThreadsAlive();
+ checkDaemonThreadsDead();
+ checkAllThreadsDead();
if (testFailed)
throw new RuntimeException("TEST FAILED.");
--- a/jdk/test/java/nio/file/Files/SBC.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/nio/file/Files/SBC.java Fri May 22 09:50:33 2015 +0200
@@ -22,7 +22,7 @@
*/
/* @test
- * @bug 4313887 8066915
+ * @bug 4313887
* @summary Unit test for java.nio.file.Files.newByteChannel
* @library ..
*/
@@ -59,7 +59,6 @@
dosSharingOptionTests(dir);
// misc. tests
- directoryOpenTests(dir);
badCombinations(dir);
unsupportedOptions(dir);
nullTests(dir);
@@ -279,21 +278,6 @@
}
}
- // test opening a directory for read or write
- static void directoryOpenTests(Path dir) throws Exception {
- try (SeekableByteChannel sbc = Files.newByteChannel(dir, READ)) {
- throw new RuntimeException("Opened directory for read");
- } catch (IOException expected) { }
-
- try (SeekableByteChannel sbc = Files.newByteChannel(dir, WRITE)) {
- throw new RuntimeException("Opened directory for write");
- } catch (IOException expected) { }
-
- try (SeekableByteChannel sbc = Files.newByteChannel(dir, APPEND)) {
- throw new RuntimeException("Opened directory for append ");
- } catch (IOException expected) { }
- }
-
// Windows specific options for the use by applications that really want
// to use legacy DOS sharing options
static void dosSharingOptionTests(Path dir) throws Exception {
--- a/jdk/test/java/security/KeyStore/ProbeKeystores.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/security/KeyStore/ProbeKeystores.java Fri May 22 09:50:33 2015 +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
@@ -41,15 +41,6 @@
private static final String CERT_FILE = "trusted.pem";
public static final void main(String[] args) throws Exception {
- try {
- test();
- } finally {
- cleanup();
- }
- }
-
- private static final void test() throws Exception {
- cleanup();
// Testing empty keystores
@@ -129,22 +120,11 @@
System.out.println("OK.");
}
- private static void cleanup() {
- new File("empty.jks").delete();
- new File("empty.jceks").delete();
- new File("empty.p12").delete();
- new File("onecert.jks").delete();
- new File("onecert.jceks").delete();
- new File("onecert.p12").delete();
- new File("onekey.jceks").delete();
- new File("onekey.p12").delete();
- }
-
// Instantiate an empty keystore using the supplied keystore type
private static void init(String file, String type) throws Exception {
KeyStore ks = KeyStore.getInstance(type);
ks.load(null, null);
- try (OutputStream stream = new FileOutputStream(DIR + "/" + file)) {
+ try (OutputStream stream = new FileOutputStream(file)) {
ks.store(stream, PASSWORD);
}
System.out.println("Created a " + type + " keystore named '" + file + "'");
@@ -156,7 +136,7 @@
KeyStore ks = KeyStore.getInstance(type);
ks.load(null, null);
ks.setEntry("mycert", new KeyStore.TrustedCertificateEntry(cert), null);
- try (OutputStream stream = new FileOutputStream(DIR + "/" + file)) {
+ try (OutputStream stream = new FileOutputStream(file)) {
ks.store(stream, PASSWORD);
}
System.out.println("Created a " + type + " keystore named '" + file + "'");
@@ -169,7 +149,7 @@
ks.load(null, null);
ks.setEntry("mykey", new KeyStore.SecretKeyEntry(key),
new PasswordProtection(PASSWORD));
- try (OutputStream stream = new FileOutputStream(DIR + "/" + file)) {
+ try (OutputStream stream = new FileOutputStream(file)) {
ks.store(stream, PASSWORD);
}
System.out.println("Created a " + type + " keystore named '" + file + "'");
@@ -178,7 +158,7 @@
// Instantiate a keystore by probing the supplied file for the keystore type
private static void probe(String file, String type) throws Exception {
// First try with the correct password
- KeyStore ks = KeyStore.getInstance(new File(DIR, file), PASSWORD);
+ KeyStore ks = KeyStore.getInstance(new File(file), PASSWORD);
if (!type.equalsIgnoreCase(ks.getType())) {
throw new Exception("ERROR: expected a " + type + " keystore, " +
"got a " + ks.getType() + " keystore instead");
@@ -188,7 +168,7 @@
// Next try with an incorrect password
try {
- ks = KeyStore.getInstance(new File(DIR, file), BAD_PASSWORD);
+ ks = KeyStore.getInstance(new File(file), BAD_PASSWORD);
throw new Exception("ERROR: expected an exception but got success");
} catch (IOException e) {
System.out.println("Failed to load a " + type + " keystore named '" + file + "' (as expected)");
@@ -201,10 +181,10 @@
Builder builder;
if (usePassword) {
- builder = Builder.newInstance(new File(DIR, file),
+ builder = Builder.newInstance(new File(file),
new PasswordProtection(PASSWORD));
} else {
- builder = Builder.newInstance(new File(DIR, file),
+ builder = Builder.newInstance(new File(file),
new CallbackHandlerProtection(new DummyHandler()));
}
KeyStore ks = builder.getKeyStore();
@@ -219,7 +199,7 @@
// Load the keystore entries
private static void load(String file, String type) throws Exception {
KeyStore ks = KeyStore.getInstance(type);
- try (InputStream stream = new FileInputStream(DIR + "/" + file)) {
+ try (InputStream stream = new FileInputStream(file)) {
ks.load(stream, PASSWORD);
}
if (!type.equalsIgnoreCase(ks.getType())) {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/security/cert/URICertStoreParameters/TestBasic.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.cert.CertStore;
+import java.security.cert.URICertStoreParameters;
+import java.net.URI;
+
+/*
+ * @test
+ * @bug 8038084
+ * @summary Basic testing for URICertStoreParameters
+ * @run main TestBasic
+ */
+public class TestBasic {
+
+ public static void main(String[] args) throws Exception {
+ String str1 = "ldap://myownhost:5000/";
+ String str2 = "ldap://myownhost:5000/cn=foo";
+ test(str1, str2);
+ System.out.println("Test passed");
+ }
+
+ private static void test(String str1, String str2) throws Exception {
+ System.out.println("Testing clone");
+ URICertStoreParameters p1 = new URICertStoreParameters(new URI(str1));
+ URICertStoreParameters p1Too = p1.clone();
+ if (!(p1.getURI().equals(p1Too.getURI())) ||
+ !(p1.equals(p1Too))) {
+ throw new Exception("Error: problem with clone");
+ }
+ System.out.println("Testing equal and hashCode");
+ p1Too = new URICertStoreParameters(new URI(str1));
+ URICertStoreParameters p2 = new URICertStoreParameters(new URI(str2));
+
+ if (p1.equals(null)) {
+ throw new Exception("Error: p1 should NOT equal null");
+ }
+ if ((!p1.equals(p1)) || (p1.hashCode() != p1.hashCode())) {
+ throw new Exception("Error: p1 should equal p1");
+ }
+ if ((!p1.equals(p1Too)) || (p1.hashCode() != p1Too.hashCode())) {
+ throw new Exception("Error: p1 should equal p1Too");
+ }
+ if ((!p1Too.equals(p1)) || (p1Too.hashCode() != p1.hashCode())) {
+ throw new Exception("Error: p1Too should equal p1");
+ }
+ if (p1.equals(p2) || p1Too.equals(p2)) {
+ throw new Exception("Error: p1/p1Too should NOT equal p2");
+ }
+ }
+}
--- a/jdk/test/java/util/Map/Collisions.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/java/util/Map/Collisions.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -198,138 +198,125 @@
}
private static <T> void testInsertion(Map<T, T> map, String keys_desc, T[] keys) {
- check("map empty", (map.size() == 0) && map.isEmpty());
+ check(map.size() == 0 && map.isEmpty(), "map empty");
for (int i = 0; i < keys.length; i++) {
- check(String.format("insertion: map expected size m%d != i%d", map.size(), i),
- map.size() == i);
- check(String.format("insertion: put(%s[%d])", keys_desc, i), null == map.put(keys[i], keys[i]));
- check(String.format("insertion: containsKey(%s[%d])", keys_desc, i), map.containsKey(keys[i]));
- check(String.format("insertion: containsValue(%s[%d])", keys_desc, i), map.containsValue(keys[i]));
+ check(map.size() == i, "insertion: map expected size m%d != i%d", map.size(), i);
+ check(null == map.put(keys[i], keys[i]), "insertion: put(%s[%d])", keys_desc, i);
+ check(map.containsKey(keys[i]), "insertion: containsKey(%s[%d])", keys_desc, i);
+ check(map.containsValue(keys[i]), "insertion: containsValue(%s[%d])", keys_desc, i);
}
- check(String.format("map expected size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "map expected size m%d != k%d", map.size(), keys.length);
}
private static void testIntegerIteration(Map<HashableInteger, HashableInteger> map, HashableInteger[] keys) {
- check(String.format("map expected size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "map expected size m%d != k%d", map.size(), keys.length);
BitSet all = new BitSet(keys.length);
for (Map.Entry<HashableInteger, HashableInteger> each : map.entrySet()) {
- check("Iteration: key already seen", !all.get(each.getKey().value));
+ check(!all.get(each.getKey().value), "Iteration: key already seen");
all.set(each.getKey().value);
}
all.flip(0, keys.length);
- check("Iteration: some keys not visited", all.isEmpty());
+ check(all.isEmpty(), "Iteration: some keys not visited");
for (HashableInteger each : map.keySet()) {
- check("Iteration: key already seen", !all.get(each.value));
+ check(!all.get(each.value), "Iteration: key already seen");
all.set(each.value);
}
all.flip(0, keys.length);
- check("Iteration: some keys not visited", all.isEmpty());
+ check(all.isEmpty(), "Iteration: some keys not visited");
int count = 0;
for (HashableInteger each : map.values()) {
count++;
}
- check(String.format("Iteration: value count matches size m%d != c%d", map.size(), count),
- map.size() == count);
+ check(map.size() == count, "Iteration: value count matches size m%d != c%d", map.size(), count);
}
private static void testStringIteration(Map<String, String> map, String[] keys) {
- check(String.format("map expected size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "map expected size m%d != k%d", map.size(), keys.length);
BitSet all = new BitSet(keys.length);
for (Map.Entry<String, String> each : map.entrySet()) {
String key = each.getKey();
boolean longKey = key.length() > 5;
int index = key.hashCode() + (longKey ? keys.length / 2 : 0);
- check("key already seen", !all.get(index));
+ check(!all.get(index), "key already seen");
all.set(index);
}
all.flip(0, keys.length);
- check("some keys not visited", all.isEmpty());
+ check(all.isEmpty(), "some keys not visited");
for (String each : map.keySet()) {
boolean longKey = each.length() > 5;
int index = each.hashCode() + (longKey ? keys.length / 2 : 0);
- check("key already seen", !all.get(index));
+ check(!all.get(index), "key already seen");
all.set(index);
}
all.flip(0, keys.length);
- check("some keys not visited", all.isEmpty());
+ check(all.isEmpty(), "some keys not visited");
int count = 0;
for (String each : map.values()) {
count++;
}
- check(String.format("value count matches size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "value count matches size m%d != k%d", map.size(), keys.length);
}
private static <T> void testContainsKey(Map<T, T> map, String keys_desc, T[] keys) {
for (int i = 0; i < keys.length; i++) {
T each = keys[i];
- check("containsKey: " + keys_desc + "[" + i + "]" + each, map.containsKey(each));
+ check(map.containsKey(each), "containsKey: %s[%d]%s", keys_desc, i, each);
}
}
private static <T> void testRemove(Map<T, T> map, String keys_desc, T[] keys) {
- check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
for (int i = 0; i < keys.length; i++) {
T each = keys[i];
- check("remove: " + keys_desc + "[" + i + "]" + each, null != map.remove(each));
+ check(null != map.remove(each), "remove: %s[%d]%s", keys_desc, i, each);
}
- check(String.format("remove: map empty. size=%d", map.size()),
- (map.size() == 0) && map.isEmpty());
+ check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
}
private static <T> void testKeysIteratorRemove(Map<T, T> map, String keys_desc, T[] keys) {
- check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
Iterator<T> each = map.keySet().iterator();
while (each.hasNext()) {
T t = each.next();
each.remove();
- check("not removed: " + each, !map.containsKey(t) );
+ check(!map.containsKey(t), "not removed: %s", each);
}
- check(String.format("remove: map empty. size=%d", map.size()),
- (map.size() == 0) && map.isEmpty());
+ check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
}
private static <T> void testValuesIteratorRemove(Map<T, T> map, String keys_desc, T[] keys) {
- check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
Iterator<T> each = map.values().iterator();
while (each.hasNext()) {
T t = each.next();
each.remove();
- check("not removed: " + each, !map.containsValue(t) );
+ check(!map.containsValue(t), "not removed: %s", each);
}
- check(String.format("remove: map empty. size=%d", map.size()),
- (map.size() == 0) && map.isEmpty());
+ check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
}
private static <T> void testEntriesIteratorRemove(Map<T, T> map, String keys_desc, T[] keys) {
- check(String.format("remove: map expected size m%d != k%d", map.size(), keys.length),
- map.size() == keys.length);
+ check(map.size() == keys.length, "remove: map expected size m%d != k%d", map.size(), keys.length);
Iterator<Map.Entry<T,T>> each = map.entrySet().iterator();
while (each.hasNext()) {
@@ -337,13 +324,12 @@
T key = t.getKey();
T value = t.getValue();
each.remove();
- check("not removed: " + each, (map instanceof IdentityHashMap) || !map.entrySet().contains(t) );
- check("not removed: " + each, !map.containsKey(key) );
- check("not removed: " + each, !map.containsValue(value));
+ check((map instanceof IdentityHashMap) || !map.entrySet().contains(t), "not removed: %s", each);
+ check(!map.containsKey(key), "not removed: %s", each);
+ check(!map.containsValue(value), "not removed: %s", each);
}
- check(String.format("remove: map empty. size=%d", map.size()),
- (map.size() == 0) && map.isEmpty());
+ check(map.size() == 0 && map.isEmpty(), "remove: map empty. size=%d", map.size());
}
//--------------------- Infrastructure ---------------------------
@@ -391,7 +377,7 @@
}
}
- static void check(String desc, boolean cond) {
+ static void check(boolean cond, String desc) {
if (cond) {
pass();
} else {
@@ -399,6 +385,46 @@
}
}
+ static void check(boolean cond, String fmt, int i) {
+ if (cond) {
+ pass();
+ } else {
+ fail(String.format(fmt, i));
+ }
+ }
+
+ static void check(boolean cond, String fmt, Object o) {
+ if (cond) {
+ pass();
+ } else {
+ fail(String.format(fmt, o));
+ }
+ }
+
+ static void check(boolean cond, String fmt, int i1, int i2) {
+ if (cond) {
+ pass();
+ } else {
+ fail(String.format(fmt, i1, i2));
+ }
+ }
+
+ static void check(boolean cond, String fmt, String s, int i) {
+ if (cond) {
+ pass();
+ } else {
+ fail(String.format(fmt, s, i));
+ }
+ }
+
+ static void check(boolean cond, String fmt, String s, int i, Object o) {
+ if (cond) {
+ pass();
+ } else {
+ fail(String.format(fmt, s, i, o));
+ }
+ }
+
static void equal(Object x, Object y) {
if (Objects.equals(x, y)) {
pass();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/LogManager/Configuration/TestConfigurationLock.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,457 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.LockInfo;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MonitorInfo;
+import java.lang.management.ThreadInfo;
+import java.security.Permission;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Level;
+import java.util.logging.LogManager;
+import java.util.logging.Logger;
+
+
+/**
+ * @test
+ * @bug 8077846
+ * @key randomness
+ * @summary Test that using a reentrant configuration lock does not introduce
+ * new synchronization issues in Logger and LogManager. This test
+ * focuses more particularly on potential deadlock in
+ * drainLoggerRefQueueBounded / readConfiguration / reset
+ * todo: add at randomness
+ * @run main/othervm TestConfigurationLock
+ * @author danielfuchs
+ */
+// This test is a best effort to try & detect issues. The test itself will run
+// for 8secs. This might be unsufficient to detect issues.
+// To get a greater confidence it is recommended to run this test in a loop:
+// e.g. use something like:
+// $ while jtreg -jdk:$JDK -verbose:all \
+// test/java/util/logging/TestConfigurationLock.java ; \
+// do echo Running test again ; done
+// and let it run for a few hours...
+//
+public class TestConfigurationLock {
+
+ static volatile Exception thrown = null;
+ static volatile boolean goOn = true;
+ static volatile boolean deadlock = false;
+
+ static final double CONFSYNCTHRESHOLD = 0.3;
+ static final double LOGSYNCTHRESHOLD = 0.3;
+ static final int RESETERS = 0;
+ static final int READERS = 3;
+ static final int LOGGERS = 4;
+ static final long TIME = 8 * 1000; // 8 sec.
+ static final long STEP = 1 * 1000; // message every 1 sec.
+ static final int LCOUNT = 50; // 50 loggers created in a row...
+ static final AtomicLong nextLogger = new AtomicLong(0);
+ static final AtomicLong resetCount = new AtomicLong(0);
+ static final AtomicLong readCount = new AtomicLong(0);
+ static final AtomicLong checkCount = new AtomicLong(0);
+
+ static final String BLAH = "blah";
+
+ static Object fakeConfExternalLock() {
+ return LogManager.getLogManager();
+ }
+
+ static Object fakeLogExternalLock() {
+ return LogManager.getLogManager();
+ }
+
+
+ /**
+ * This test will run both with and without a security manager.
+ *
+ * The test starts a number of threads that will call
+ * LogManager.reset() concurrently (ResetConf), and a number of threads
+ * that will call readConfiguration() (ReadConf), and then starts a
+ * number of threads that will create new loggers concurrently
+ * (AddLogger), and finally two additional threads:
+ * - one (Stopper) that will stop the test after 4secs (TIME ms),
+ * - and one DeadlockDetector that will attempt to detect deadlocks.
+ * If after 4secs no deadlock was detected and no exception was thrown
+ * then the test is considered a success and passes.
+ *
+ * This procedure is done twice: once without a security manager and once
+ * again with a security manager - which means the test takes ~8secs to
+ * run.
+ *
+ * Note that 8sec may not be enough to detect issues if there are some.
+ * This is a best effort test.
+ *
+ * @param args the command line arguments
+ * @throws java.lang.Exception if the test fails
+ */
+ public static void main(String[] args) throws Exception {
+
+ File conf = new File(System.getProperty("test.src", "./src"),
+ TestConfigurationLock.class.getSimpleName() + ".properties");
+ if (!conf.canRead()) {
+ throw new IOException("Can't read config file: " + conf.getAbsolutePath());
+ }
+ System.setProperty("java.util.logging.config.file", conf.getAbsolutePath());
+ // test without security
+ System.out.println("No security");
+ test();
+
+ // test with security
+ System.out.println("\nWith security");
+ Policy.setPolicy(new Policy() {
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ if (super.implies(domain, permission)) return true;
+ // System.out.println("Granting " + permission);
+ return true; // all permissions
+ }
+ });
+ System.setSecurityManager(new SecurityManager());
+ test();
+ }
+
+
+ /**
+ * Starts all threads, wait 4secs, then stops all threads.
+ * @throws Exception if a deadlock was detected or an error occurred.
+ */
+ public static void test() throws Exception {
+ goOn = true;
+ thrown = null;
+ long sNextLogger = nextLogger.get();
+ long sUpdateCount = resetCount.get();
+ long sReadCount = readCount.get();
+ long sCheckCount = checkCount.get();
+ List<Thread> threads = new ArrayList<>();
+ for (int i = 0; i<RESETERS; i++) {
+ threads.add(new ResetConf());
+ }
+ for (int i = 0; i<READERS; i++) {
+ threads.add(new ReadConf());
+ }
+ for (int i = 0; i<LOGGERS; i++) {
+ threads.add(new AddLogger());
+ }
+ threads.add(0, new Stopper(TIME));
+ threads.stream().forEach(Thread::start);
+
+ Thread deadLockDetector = new DeadlockDetector();
+ deadLockDetector.start();
+ deadLockDetector.join();
+
+ if (!deadlock) {
+ threads.stream().forEach(TestConfigurationLock::join);
+ } else {
+ System.err.println("Deadlock found: exiting forcibly.");
+ Runtime.getRuntime().halt(-1);
+ }
+
+ if (thrown != null) {
+ throw thrown;
+ }
+ System.out.println("Passed: " + (nextLogger.get() - sNextLogger)
+ + " loggers created by " + LOGGERS + " Thread(s),");
+ System.out.println("\t LogManager.reset() called "
+ + (resetCount.get() - sUpdateCount) + " times by " + RESETERS
+ + " Thread(s).");
+ System.out.println("\t LogManager.readConfiguration() called "
+ + (readCount.get() - sReadCount) + " times by " + READERS
+ + " Thread(s).");
+ System.out.println("\t ThreadMXBean.findDeadlockedThreads called "
+ + (checkCount.get() -sCheckCount) + " times by 1 Thread.");
+
+ }
+
+ static void join(Thread t) {
+ try {
+ t.join();
+ } catch (Exception x) {
+ fail(x);
+ }
+ }
+
+ final static class ResetConf extends Thread {
+
+ public ResetConf() {
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ while (goOn) {
+ try {
+ if (Math.random() > CONFSYNCTHRESHOLD) {
+ // calling reset while holding a lock can increase
+ // deadlock probability...
+ synchronized(fakeConfExternalLock()) {
+ LogManager.getLogManager().reset();
+ }
+ } else {
+ LogManager.getLogManager().reset();
+ }
+ Logger blah = Logger.getLogger(BLAH);
+ blah.setLevel(Level.FINEST);
+ blah.fine(BLAH);
+ resetCount.incrementAndGet();
+ pause(1);
+ } catch (Exception x) {
+ fail(x);
+ }
+ }
+ }
+ }
+
+ final static class ReadConf extends Thread {
+
+ public ReadConf() {
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ while (goOn) {
+ try {
+ if (Math.random() > CONFSYNCTHRESHOLD) {
+ // calling readConfiguration while holding a lock can
+ // increase deadlock probability...
+ synchronized(fakeConfExternalLock()) {
+ LogManager.getLogManager().readConfiguration();
+ }
+ } else {
+ LogManager.getLogManager().readConfiguration();
+ }
+ Logger blah = Logger.getLogger(BLAH);
+ blah.setLevel(Level.FINEST);
+ blah.fine(BLAH);
+ readCount.incrementAndGet();
+ pause(1);
+ } catch (Exception x) {
+ fail(x);
+ }
+ }
+ }
+ }
+
+ final static class AddLogger extends Thread {
+
+ public AddLogger() {
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ try {
+ while (goOn) {
+ Logger l;
+ Logger foo = Logger.getLogger("foo");
+ Logger bar = Logger.getLogger("foo.bar");
+ for (int i=0; i < LCOUNT ; i++) {
+ LogManager manager = LogManager.getLogManager();
+ if (Math.random() > LOGSYNCTHRESHOLD) {
+ synchronized(fakeLogExternalLock()) {
+ l = Logger.getLogger("foo.bar.l"+nextLogger.incrementAndGet());
+ }
+ } else {
+ l = Logger.getLogger("foo.bar.l"+nextLogger.incrementAndGet());
+ }
+ l.setLevel(Level.FINEST);
+ l.fine("I'm fine");
+ if (!goOn) break;
+ pause(1);
+ }
+ }
+ } catch (InterruptedException | RuntimeException x ) {
+ fail(x);
+ }
+ }
+ }
+
+ final static class DeadlockDetector extends Thread {
+
+ @Override
+ public void run() {
+ boolean deadlock = false;
+ while(goOn) {
+ try {
+ long[] ids = ManagementFactory.getThreadMXBean().findDeadlockedThreads();
+ checkCount.incrementAndGet();
+ ids = ids == null ? new long[0] : ids;
+ if (ids.length == 1) {
+ throw new RuntimeException("Found 1 deadlocked thread: "+ids[0]);
+ } else if (ids.length > 0) {
+ deadlock = true;
+ ThreadInfo[] infos = ManagementFactory.getThreadMXBean()
+ .getThreadInfo(ids, true, true);
+ System.err.println("Found "+ids.length+" deadlocked threads: ");
+ for (ThreadInfo inf : infos) {
+ System.err.println(asString(inf));
+ }
+ throw new RuntimeException("Found "+ids.length+" deadlocked threads");
+ }
+ pause(100);
+ } catch(InterruptedException | RuntimeException x) {
+ if (deadlock) deadlock(x);
+ else fail(x);
+ }
+ }
+ }
+
+ }
+
+ static final class Stopper extends Thread {
+ long start;
+ long time;
+
+ Stopper(long time) {
+ start = System.currentTimeMillis();
+ this.time = time;
+ setDaemon(true);
+ }
+
+ @Override
+ public void run() {
+ try {
+ long rest, previous;
+ int msgCount = 0;
+ previous = time;
+ Logger logger = Logger.getLogger("remaining");
+ while (goOn && (rest = start - System.currentTimeMillis() + time) > 0) {
+ if (previous == time || previous - rest >= STEP) {
+ logger.log(Level.INFO, "{0}ms remaining...", String.valueOf(rest));
+ msgCount++;
+ previous = rest == time ? rest -1 : rest;
+ System.gc();
+ }
+ if (goOn == false) break;
+ pause(Math.min(rest, 100));
+ }
+ System.err.println(this + ": " + msgCount + " messages.");
+ System.err.flush();
+ System.out.println(System.currentTimeMillis() - start
+ + " ms elapsed ("+time+ " requested)");
+ goOn = false;
+ } catch(InterruptedException | RuntimeException x) {
+ fail(x);
+ }
+ }
+
+ }
+
+ // ThreadInfo.toString() only prints 8 frames...
+ static String asString(ThreadInfo inf) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("\"").append(inf.getThreadName()).append("\"")
+ .append(inf.isDaemon() ? " daemon" : "")
+ .append(" prio=").append(inf.getPriority())
+ .append(" Id=").append(inf.getThreadId())
+ .append(" ").append(inf.getThreadState());
+ if (inf.getLockName() != null) {
+ sb.append(" on ").append(inf.getLockName());
+ }
+ if (inf.getLockOwnerName() != null) {
+ sb.append(" owned by \"").append(inf.getLockOwnerName())
+ .append("\" Id=").append(inf.getLockOwnerId());
+ }
+ if (inf.isSuspended()) {
+ sb.append(" (suspended)");
+ }
+ if (inf.isInNative()) {
+ sb.append(" (in native)");
+ }
+ sb.append('\n');
+ int i = 0;
+ StackTraceElement[] stackTrace = inf.getStackTrace();
+ for (; i < stackTrace.length; i++) {
+ StackTraceElement ste = stackTrace[i];
+ sb.append("\tat ").append(ste.toString());
+ sb.append('\n');
+ if (i == 0 && inf.getLockInfo() != null) {
+ Thread.State ts = inf.getThreadState();
+ switch (ts) {
+ case BLOCKED:
+ sb.append("\t- blocked on ").append(inf.getLockInfo());
+ sb.append('\n');
+ break;
+ case WAITING:
+ sb.append("\t- waiting on ").append(inf.getLockInfo());
+ sb.append('\n');
+ break;
+ case TIMED_WAITING:
+ sb.append("\t- waiting on ").append(inf.getLockInfo());
+ sb.append('\n');
+ break;
+ default:
+ }
+ }
+
+ for (MonitorInfo mi : inf.getLockedMonitors()) {
+ if (mi.getLockedStackDepth() == i) {
+ sb.append("\t- locked ").append(mi);
+ sb.append('\n');
+ }
+ }
+ }
+ if (i < stackTrace.length) {
+ sb.append("\t...");
+ sb.append('\n');
+ }
+
+ LockInfo[] locks = inf.getLockedSynchronizers();
+ if (locks.length > 0) {
+ sb.append("\n\tNumber of locked synchronizers = ").append(locks.length);
+ sb.append('\n');
+ for (LockInfo li : locks) {
+ sb.append("\t- ").append(li);
+ sb.append('\n');
+ }
+ }
+ sb.append('\n');
+ return sb.toString();
+ }
+
+ static void pause(long millis) throws InterruptedException {
+ Thread.sleep(millis);
+ }
+
+ static void fail(Exception x) {
+ x.printStackTrace(System.err);
+ if (thrown == null) {
+ thrown = x;
+ }
+ goOn = false;
+ }
+
+ static void deadlock(Exception x) {
+ deadlock = true;
+ System.out.flush();
+ fail(x);
+ System.err.flush();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/LogManager/Configuration/TestConfigurationLock.properties Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,22 @@
+########################################################################
+# Logging configuration property file for TestConfigurationLock.java #
+########################################################################
+
+handlers= java.util.logging.ConsoleHandler
+
+.level= INFO
+
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+java.util.logging.ConsoleHandler.level = INFO
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+blah.level = FINE
+foo.bar.l10.level = INFO
+foo.bar.l100.level = INFO
+foo.bar.l1000.level = INFO
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/crypto/SecretKeyFactory/PBKDF2TranslateTest.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,270 @@
+/*
+ * 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Random;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.interfaces.PBEKey;
+import javax.crypto.spec.PBEKeySpec;
+import javax.security.auth.DestroyFailedException;
+
+import static java.lang.System.out;
+
+/*
+ * @test
+ * @bug 8048820
+ * @summary The test verifies if the SecretKeyFactory.translateKey() method
+ * works as expected for the PBKDF2 algorithms.
+ */
+
+public class PBKDF2TranslateTest {
+
+ private static final String PASS_PHRASE = "some hidden string";
+ private static final int ITERATION_COUNT = 1000;
+ private static final int KEY_SIZE = 128;
+ private static final String[] TEST_ALGOS = { "PBKDF2WithHmacSHA1",
+ "PBKDF2WithHmacSHA224", "PBKDF2WithHmacSHA256",
+ "PBKDF2WithHmacSHA384", "PBKDF2WithHmacSHA512" };
+ private final String algoForTest;
+
+ public static void main(String[] args) throws Exception {
+ for (String algo : TEST_ALGOS) {
+ PBKDF2TranslateTest theTest = new PBKDF2TranslateTest(algo);
+ byte[] salt = new byte[8];
+ new Random().nextBytes(salt);
+ theTest.testMyOwnSecretKey(salt);
+ theTest.generateAndTranslateKey(salt);
+ theTest.translateSpoiledKey(salt);
+ }
+ }
+
+ public PBKDF2TranslateTest(String algo) {
+ algoForTest = algo;
+ }
+
+ /**
+ * The test case scenario implemented in the method: - derive PBKDF2 key
+ * using the given algorithm; - translate the key - check if the translated
+ * and original keys have the same key value.
+ *
+ */
+ public void generateAndTranslateKey(byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException,
+ InvalidKeyException {
+ // derive PBKDF2 key
+ SecretKey key1 = getSecretKeyForPBKDF2(algoForTest, salt);
+
+ // translate key
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+ SecretKey key2 = skf.translateKey(key1);
+
+ // Check if it still the same after translation
+ if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {
+ System.out.println("Key1=" + new String(key1.getEncoded())
+ + " key2=" + new String(key2.getEncoded()) + " salt="
+ + new String(salt));
+ throw new RuntimeException(
+ "generateAndTranslateKey test case failed: the key1 and"
+ + " key2 values in its primary encoding format are"
+ + " not the same for " + algoForTest
+ + " algorithm.");
+ }
+ }
+
+ /**
+ * The test case scenario implemented in the method: - derive Key1 for the
+ * given PBKDF2 algorithm - create my own secret Key2 as an instance of a
+ * class implements PBEKey - translate Key2 - check if the key value of the
+ * translated key and Key1 are the same.
+ */
+ private void testMyOwnSecretKey(byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException,
+ InvalidKeyException {
+ SecretKey key1 = getSecretKeyForPBKDF2(algoForTest, salt);
+ SecretKey key2 = getMyOwnSecretKey(salt);
+
+ // Is it actually the same?
+ if (!Arrays.equals(key1.getEncoded(), key2.getEncoded())) {
+ throw new RuntimeException(
+ "We shouldn't be here. The key1 and key2 values in its"
+ + " primary encoding format have to be the same!");
+ }
+
+ // translate key
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+ SecretKey key3 = skf.translateKey(key2);
+
+ // Check if it still the same after translation
+ if (!Arrays.equals(key1.getEncoded(), key3.getEncoded())) {
+ System.out.println("Key1=" + new String(key1.getEncoded())
+ + " key3=" + new String(key3.getEncoded()) + " salt="
+ + new String(salt));
+ throw new RuntimeException(
+ "testMyOwnSecretKey test case failed: the key1 and key3"
+ + " values in its primary encoding format are not"
+ + " the same for " + algoForTest + " algorithm.");
+ }
+
+ }
+
+ /**
+ * The test case scenario implemented in the method: - create my own secret
+ * Key2 as an instance of a class implements PBEKey - spoil the key (set
+ * iteration count to 0, for example) - try to translate key -
+ * InvalidKeyException is expected.
+ */
+ public void translateSpoiledKey(byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException {
+ // derive the key
+ SecretKey key1 = getMyOwnSecretKey(salt);
+
+ // spoil the key
+ ((MyPBKDF2SecretKey) key1).spoil();
+
+ // translate key
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoForTest);
+ try {
+ skf.translateKey(key1);
+ throw new RuntimeException(
+ "translateSpoiledKey test case failed, should throw"
+ + " InvalidKeyException when spoil the key");
+ } catch (InvalidKeyException ike) {
+ out.println("Expected exception when spoil the key");
+ }
+
+ }
+
+ /**
+ * Generate a PBKDF2 secret key using given algorithm.
+ */
+ private SecretKey getSecretKeyForPBKDF2(String algoDeriveKey, byte[] salt)
+ throws NoSuchAlgorithmException, InvalidKeySpecException {
+
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algoDeriveKey);
+ PBEKeySpec spec = new PBEKeySpec(PASS_PHRASE.toCharArray(), salt,
+ ITERATION_COUNT, KEY_SIZE);
+
+ return skf.generateSecret(spec);
+ }
+
+ /**
+ * Generate a secrete key as an instance of a class implements PBEKey.
+ */
+ private SecretKey getMyOwnSecretKey(byte[] salt)
+ throws InvalidKeySpecException, NoSuchAlgorithmException {
+ return new MyPBKDF2SecretKey(PASS_PHRASE, algoForTest, salt,
+ ITERATION_COUNT, KEY_SIZE);
+ }
+
+ /**
+ * An utility class to check the SecretKeyFactory.translateKey() method.
+ */
+ class MyPBKDF2SecretKey implements PBEKey {
+ private final byte[] key;
+ private final byte[] salt;
+ private final String algorithm;
+ private final int keyLength;
+ private final String pass;
+ private int itereationCount;
+
+ /**
+ * The key is generating by SecretKeyFactory and its value just copying
+ * in the key field of MySecretKey class. So, this is real key derived
+ * using the given algo.
+ */
+ public MyPBKDF2SecretKey(String passPhrase, String algo, byte[] salt1,
+ int iterationCount, int keySize)
+ throws InvalidKeySpecException, NoSuchAlgorithmException {
+ algorithm = algo;
+ salt = salt1;
+ itereationCount = iterationCount;
+ pass = passPhrase;
+
+ PBEKeySpec spec = new PBEKeySpec(passPhrase.toCharArray(), salt,
+ iterationCount, keySize);
+
+ SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algo);
+
+ SecretKey realKey = keyFactory.generateSecret(spec);
+
+ keyLength = realKey.getEncoded().length;
+
+ key = new byte[keyLength];
+ System.arraycopy(realKey.getEncoded(), 0, key, 0, keyLength);
+ }
+
+ @Override
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ @Override
+ public String getFormat() {
+ return "RAW";
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ byte[] copy = new byte[keyLength];
+ System.arraycopy(key, 0, copy, 0, keyLength);
+ return copy;
+ }
+
+ @Override
+ public int getIterationCount() {
+ return itereationCount;
+ }
+
+ @Override
+ public byte[] getSalt() {
+ return salt;
+ }
+
+ @Override
+ public char[] getPassword() {
+ return pass.toCharArray();
+ }
+
+ /**
+ * Spoil the generated key (before translation) to cause an
+ * InvalidKeyException
+ */
+ public void spoil() {
+ itereationCount = -1;
+ }
+
+ @Override
+ public void destroy() throws DestroyFailedException {
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return false;
+ }
+
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/crypto/SecretKeyFactory/SecKFTranslateTest.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,206 @@
+/*
+ * 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.ShortBufferException;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import javax.security.auth.DestroyFailedException;
+
+/*
+ * @test
+ * @bug 8048820
+ * @summary The test verifies SecretKey values should remain the same after
+ * translation with SecretKeyFactory.translateKey().
+ */
+
+public class SecKFTranslateTest {
+ private static final String SUN_JCE = "SunJCE";
+
+ public static void main(String[] args) throws Exception {
+
+ SecKFTranslateTest test = new SecKFTranslateTest();
+ test.run();
+ }
+
+ private void run() throws Exception {
+
+ for (Algorithm algorithm : Algorithm.values()) {
+ runTest(algorithm);
+ }
+ }
+
+ private void runTest(Algorithm algo) throws NoSuchAlgorithmException,
+ NoSuchProviderException, InvalidKeyException,
+ InvalidKeySpecException, NoSuchPaddingException,
+ InvalidAlgorithmParameterException, ShortBufferException,
+ IllegalBlockSizeException, BadPaddingException {
+ AlgorithmParameterSpec[] aps = new AlgorithmParameterSpec[1];
+ byte[] plainText = new byte[800];
+
+ SecretKey key1 = algo.intSecurityKey(aps);
+ Random random = new Random();
+ // Initialization
+ SecretKeyFactory skf = SecretKeyFactory.getInstance(algo.toString(),
+ SUN_JCE);
+
+ random.nextBytes(plainText);
+ Cipher ci = Cipher.getInstance(algo.toString(), SUN_JCE);
+ // Encryption
+ ci.init(Cipher.ENCRYPT_MODE, key1, aps[0]);
+ byte[] cipherText = new byte[ci.getOutputSize(plainText.length)];
+ int offset = ci.update(plainText, 0, plainText.length, cipherText, 0);
+ ci.doFinal(cipherText, offset);
+ // translate key
+ SecretKey key2 = skf.translateKey(key1);
+
+ // Decryption
+ ci.init(Cipher.DECRYPT_MODE, key2, aps[0]);
+ byte[] recoveredText = new byte[ci.getOutputSize(plainText.length)];
+ ci.doFinal(cipherText, 0, cipherText.length, recoveredText);
+
+ // Comparison
+ if (!Arrays.equals(plainText, recoveredText)) {
+ System.out.println("Key1:" + new String(key1.getEncoded())
+ + " Key2:" + new String(key2.getEncoded()));
+ throw new RuntimeException("Testing translate key failed with "
+ + algo);
+ }
+
+ }
+}
+
+class MyOwnSecKey implements SecretKey {
+
+ private static final String DEFAULT_ALGO = "PBEWithMD5AndDES";
+ private final byte[] key;
+ private final String algorithm;
+ private final int keySize;
+
+ public MyOwnSecKey(byte[] key1, int offset, String algo)
+ throws InvalidKeyException {
+ algorithm = algo;
+ if (algo.equalsIgnoreCase("DES")) {
+ keySize = 8;
+ } else if (algo.equalsIgnoreCase("DESede")) {
+ keySize = 24;
+ } else {
+ throw new InvalidKeyException(
+ "Inappropriate key format and algorithm");
+ }
+
+ if (key1 == null || key1.length - offset < keySize) {
+ throw new InvalidKeyException("Wrong key size");
+ }
+ key = new byte[keySize];
+ System.arraycopy(key, offset, key, 0, keySize);
+ }
+
+ public MyOwnSecKey(PBEKeySpec ks) throws InvalidKeySpecException {
+ algorithm = DEFAULT_ALGO;
+ key = new String(ks.getPassword()).getBytes();
+ keySize = key.length;
+ }
+
+ @Override
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ @Override
+ public String getFormat() {
+ return "RAW";
+ }
+
+ @Override
+ public byte[] getEncoded() {
+ byte[] copy = new byte[keySize];
+ System.arraycopy(key, 0, copy, 0, keySize);
+ return copy;
+ }
+
+ @Override
+ public void destroy() throws DestroyFailedException {
+ }
+
+ @Override
+ public boolean isDestroyed() {
+ return false;
+ }
+}
+
+enum Algorithm {
+ DES {
+ @Override
+ SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeyException {
+ int keyLength = 8;
+ byte[] keyVal = new byte[keyLength];
+ new SecureRandom().nextBytes(keyVal);
+ SecretKey key1 = new MyOwnSecKey(keyVal, 0, this.toString());
+ return key1;
+ }
+ },
+ DESEDE {
+ @Override
+ SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeyException {
+ int keyLength = 24;
+ byte[] keyVal = new byte[keyLength];
+ new SecureRandom().nextBytes(keyVal);
+ SecretKey key1 = new MyOwnSecKey(keyVal, 0, this.toString());
+ return key1;
+ }
+ },
+ PBEWithMD5ANDdes {
+ @Override
+ SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeySpecException {
+ byte[] salt = new byte[8];
+ int iterCnt = 6;
+ new Random().nextBytes(salt);
+ spec[0] = new PBEParameterSpec(salt, iterCnt);
+ PBEKeySpec pbeKS = new PBEKeySpec(
+ new String("So far so good").toCharArray());
+ SecretKey key1 = new MyOwnSecKey(pbeKS);
+ return key1;
+ }
+ };
+ abstract SecretKey intSecurityKey(AlgorithmParameterSpec[] spec)
+ throws InvalidKeyException, InvalidKeySpecException;
+}
--- a/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java Fri May 22 09:50:33 2015 +0200
@@ -21,12 +21,16 @@
* questions.
*/
-/*
+/**
* @test
* @bug 6338874
* @summary Check that notification dispatch is not linear in number of MBeans.
* @author Eamonn McManus
* @modules java.management
+ *
+ * @library /lib/testlibrary
+ * @run build jdk.testlibrary.* ListenerScaleTest
+ * @run main ListenerScaleTest
*/
/*
@@ -67,6 +71,8 @@
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
+import jdk.testlibrary.Platform;
+
public class ListenerScaleTest {
private static final int WARMUP_WITH_ONE_MBEAN = 1000;
private static final int NOTIFS_TO_TIME = 100;
@@ -126,6 +132,10 @@
};
public static void main(String[] args) throws Exception {
+ if (Platform.isDebugBuild()) {
+ System.out.println("Running on a debug build. Performance test not applicable. Skipping.");
+ return;
+ }
MBeanServer mbs = MBeanServerFactory.newMBeanServer();
Sender sender = new Sender();
mbs.registerMBean(sender, testObjectName);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/script/SimpleScriptContextNameChecksTest.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 8072853
+ * @summary SimpleScriptContext used by NashornScriptEngine doesn't completely complies to the spec regarding exception throwing
+ * @run testng SimpleScriptContextNameChecksTest
+ */
+
+import java.util.List;
+import java.util.function.Consumer;
+import javax.script.*;
+import org.testng.annotations.Test;
+
+public class SimpleScriptContextNameChecksTest {
+ private List<ScriptEngineFactory> getFactories() {
+ return new ScriptEngineManager().getEngineFactories();
+ }
+
+ private void testAndExpect(Consumer<ScriptContext> c, Class<? extends RuntimeException> clazz) {
+ for (ScriptEngineFactory fac : getFactories()) {
+ ScriptContext sc = fac.getScriptEngine().getContext();
+ String name = fac.getEngineName();
+ try {
+ c.accept(sc);
+ throw new RuntimeException("no exception for " + name);
+ } catch (NullPointerException | IllegalArgumentException e) {
+ if (e.getClass() == clazz) {
+ System.out.println("got " + e + " as expected for " + name);
+ } else {
+ throw e;
+ }
+ }
+ }
+ }
+
+ private void testAndExpectIAE(Consumer<ScriptContext> c) {
+ testAndExpect(c, IllegalArgumentException.class);
+ }
+
+ private void testAndExpectNPE(Consumer<ScriptContext> c) {
+ testAndExpect(c, NullPointerException.class);
+ }
+
+ @Test
+ public void getAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.getAttribute("", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void getAttributeNullName() {
+ testAndExpectNPE(sc -> sc.getAttribute(null, ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void removeAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.removeAttribute("", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void removeAttributeNullName() {
+ testAndExpectNPE(sc -> sc.removeAttribute(null, ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void setAttributeEmptyName() {
+ testAndExpectIAE(sc -> sc.setAttribute("", "value", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void setAttributeNullName() {
+ testAndExpectNPE(sc -> sc.setAttribute(null, "value", ScriptContext.GLOBAL_SCOPE));
+ }
+
+ @Test
+ public void getAttributesScopeEmptyName() {
+ testAndExpectIAE(sc -> sc.getAttributesScope(""));
+ }
+
+ @Test
+ public void getAttributesScopeNullName() {
+ testAndExpectNPE(sc -> sc.getAttributesScope(null));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/ErrorHandlerPermissions.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute 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.
+ */
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.security.KeyFactory;
+import java.security.PublicKey;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import javax.xml.XMLConstants;
+import javax.xml.crypto.Data;
+import javax.xml.crypto.KeySelector;
+import javax.xml.crypto.OctetStreamData;
+import javax.xml.crypto.URIDereferencer;
+import javax.xml.crypto.URIReference;
+import javax.xml.crypto.URIReferenceException;
+import javax.xml.crypto.XMLCryptoContext;
+import javax.xml.crypto.dsig.XMLSignature;
+import javax.xml.crypto.dsig.XMLSignatureFactory;
+import javax.xml.crypto.dsig.dom.DOMValidateContext;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * @test
+ * @bug 8079140
+ * @summary Check if IgnoreAllErrorHandler doesn't require additional permission
+ * @run main/othervm/java.security.policy=ErrorHandlerPermissions.policy
+ * ErrorHandlerPermissions
+ */
+public class ErrorHandlerPermissions {
+
+ private final static String FS = System.getProperty("file.separator");
+ private final static String DIR = System.getProperty("test.src", ".");
+ private final static String DATA_DIR = DIR + FS + "data";
+ private final static String SIGNATURE = DATA_DIR + FS +
+ "signature-external-rsa.xml";
+
+ private static final String validationKey =
+ "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnx4TdvPSA5vcsPi0OJZi9Ox0Z" +
+ "2FRz2oeUCtuWoyEg0kUCeFd+jJZMstDJUiZNSOeuCO3FWSpdJgAwI4zlveHvuU/o" +
+ "qHSa1eYTObOCvxfVYGGflWsSvGXyiANtRWVUrYODBeyL+2pWxDYh+Fi5EKizPfTG" +
+ "wRjBVRSkRZKTnSjnQwIDAQAB";
+
+ private static final URIDereferencer dereferencer =
+ new DummyURIDereferencer();
+
+ public static void main(String[] args) throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(false);
+ dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
+ Document doc = dbf.newDocumentBuilder().parse(new File(SIGNATURE));
+ NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,
+ "Signature");
+ if (nl.getLength() == 0) {
+ throw new RuntimeException("Couldn't find 'Signature' element");
+ }
+ Element element = (Element) nl.item(0);
+
+ byte[] keyBytes = Base64.getDecoder().decode(validationKey);
+ X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
+ KeyFactory kf = KeyFactory.getInstance("RSA");
+ PublicKey key = kf.generatePublic(spec);
+ KeySelector ks = KeySelector.singletonKeySelector(key);
+
+ DOMValidateContext vc = new DOMValidateContext(ks, element);
+
+ // disable secure validation mode
+ vc.setProperty("org.jcp.xml.dsig.secureValidation", Boolean.FALSE);
+
+ // set a dummy dereferencer to be able to get content by references
+ vc.setURIDereferencer(dereferencer);
+
+ XMLSignatureFactory factory = XMLSignatureFactory.getInstance();
+ XMLSignature signature = factory.unmarshalXMLSignature(vc);
+
+ // run validation
+ signature.validate(vc);
+ }
+
+ /**
+ * This URIDereferencer returns a static XML document.
+ */
+ private static class DummyURIDereferencer implements URIDereferencer {
+
+ @Override
+ public Data dereference(final URIReference ref, XMLCryptoContext ctx)
+ throws URIReferenceException {
+ // return static content
+ return new OctetStreamData(new ByteArrayInputStream(
+ "<test>test</test>".getBytes()), ref.getURI(),
+ ref.getType());
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/ErrorHandlerPermissions.policy Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,5 @@
+grant {
+ permission java.util.PropertyPermission "test.src", "read";
+ permission java.util.PropertyPermission "file.separator", "read";
+ permission java.io.FilePermission "${test.src}/-", "read";
+};
--- a/jdk/test/javax/xml/crypto/dsig/GenerationTests.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/javax/xml/crypto/dsig/GenerationTests.java Fri May 22 09:50:33 2015 +0200
@@ -24,7 +24,7 @@
/**
* @test
* @bug 4635230 6283345 6303830 6824440 6867348 7094155 8038184 8038349 8046949
- * 8046724
+ * 8046724 8079693
* @summary Basic unit tests for generating XML Signatures with JSR 105
* @compile -XDignore.symbol.file KeySelectors.java SignatureValidator.java
* X509KeySelector.java GenerationTests.java
@@ -92,7 +92,8 @@
rsaSha256, rsaSha384, rsaSha512,
ecdsaSha1;
private static DigestMethod sha1, sha256, sha384, sha512;
- private static KeyInfo dsa1024, dsa2048, rsa, rsa1024, p256ki;
+ private static KeyInfo dsa1024, dsa2048, rsa, rsa1024,
+ p256ki, p384ki, p521ki;
private static KeySelector kvks = new KeySelectors.KeyValueKeySelector();
private static KeySelector sks;
private static Key signingKey;
@@ -131,6 +132,8 @@
test_create_signature_enveloping_hmac_sha512();
test_create_signature_enveloping_rsa();
test_create_signature_enveloping_p256_sha1();
+ test_create_signature_enveloping_p384_sha1();
+ test_create_signature_enveloping_p521_sha1();
test_create_signature_external_b64_dsa();
test_create_signature_external_dsa();
test_create_signature_keyname();
@@ -186,7 +189,11 @@
rsa1024 = kifac.newKeyInfo(Collections.singletonList
(kifac.newKeyValue(getPublicKey("RSA", 1024))));
p256ki = kifac.newKeyInfo(Collections.singletonList
- (kifac.newKeyValue(getECPublicKey())));
+ (kifac.newKeyValue(getECPublicKey("P256"))));
+ p384ki = kifac.newKeyInfo(Collections.singletonList
+ (kifac.newKeyValue(getECPublicKey("P384"))));
+ p521ki = kifac.newKeyInfo(Collections.singletonList
+ (kifac.newKeyValue(getECPublicKey("P521"))));
rsaSha1 = fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null);
rsaSha256 = fac.newSignatureMethod
("http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", null);
@@ -359,7 +366,21 @@
static void test_create_signature_enveloping_p256_sha1() throws Exception {
System.out.println("* Generating signature-enveloping-p256-sha1.xml");
test_create_signature_enveloping(sha1, ecdsaSha1, p256ki,
- getECPrivateKey(), kvks, false);
+ getECPrivateKey("P256"), kvks, false);
+ System.out.println();
+ }
+
+ static void test_create_signature_enveloping_p384_sha1() throws Exception {
+ System.out.println("* Generating signature-enveloping-p384-sha1.xml");
+ test_create_signature_enveloping(sha1, ecdsaSha1, p384ki,
+ getECPrivateKey("P384"), kvks, false);
+ System.out.println();
+ }
+
+ static void test_create_signature_enveloping_p521_sha1() throws Exception {
+ System.out.println("* Generating signature-enveloping-p521-sha1.xml");
+ test_create_signature_enveloping(sha1, ecdsaSha1, p521ki,
+ getECPrivateKey("P521"), kvks, false);
System.out.println();
}
@@ -1189,37 +1210,63 @@
"237008997971129772408397621801631622129297063463868593083106979716" +
"204903524890556839550490384015324575598723478554854070823335021842" +
"210112348400928769";
- private static final String EC_X =
+ private static final String EC_P256_X =
"335863644451761614592446380116804721648611739647823420286081723541" +
"6166183710";
- private static final String EC_Y =
+ private static final String EC_P256_Y =
"951559601159729477487064127150143688502130342917782252098602422796" +
"95457910701";
- private static final String EC_S =
+ private static final String EC_P256_S =
"425976209773168452211813225517384419928639977904006759709292218082" +
"7440083936";
- private static final ECParameterSpec EC_PARAMS;
+ private static final ECParameterSpec EC_P256_PARAMS = initECParams(
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
+ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
+ "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
+ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
+ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
+ "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
+ 1
+ );
+ private static final String EC_P384_X =
+ "12144058647679082341340699736608428955270957565259459672517275506071643671835484144490620216582303669654008841724053";
+ private static final String EC_P384_Y =
+ "18287745972107701566600963632634101287058332546756092926848497481238534346489545826483592906634896557151987868614320";
+ private static final String EC_P384_S =
+ "10307785759830534742680442271492590599236624208247590184679565032330507874096079979152605984203102224450595283943382";
+ private static final ECParameterSpec EC_P384_PARAMS = initECParams(
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
+ "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
+ "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
+ "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
+ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
+ 1
+ );
+ private static final String EC_P521_X =
+ "4157918188927862838251799402582135611021257663417126086145819679867926857146776190737187582274664373117054717389603317411991660346043842712448912355335343997";
+ private static final String EC_P521_Y =
+ "4102838062751704796157456866854813794620023146924181568434486703918224542844053923233919899911519054998554969832861957437850996213216829205401947264294066288";
+ private static final String EC_P521_S =
+ "4857798533181496041050215963883119936300918353498701880968530610687256097257307590162398707429640390843595868713096292822034014722985178583665959048714417342";
+ private static final ECParameterSpec EC_P521_PARAMS = initECParams(
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
+ "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
+ "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
+ "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
+ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
+ 1
+ );
- static {
- final String ec_sfield, ec_a, ec_b, ec_gx, ec_gy, ec_n;
- ec_sfield =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF";
- ec_a =
- "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC";
- ec_b =
- "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B";
- ec_gx =
- "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296";
- ec_gy =
- "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5";
- ec_n =
- "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551";
- final int ec_h = 1;
- final ECField ec_field = new ECFieldFp(bigInt(ec_sfield));
- final EllipticCurve ec_curve = new EllipticCurve(ec_field,
- bigInt(ec_a), bigInt(ec_b));
- final ECPoint ec_g = new ECPoint(bigInt(ec_gx), bigInt(ec_gy));
- EC_PARAMS = new ECParameterSpec(ec_curve, ec_g, bigInt(ec_n), ec_h);
+ private static ECParameterSpec initECParams(
+ String sfield, String a, String b, String gx, String gy,
+ String n, int h) {
+ ECField field = new ECFieldFp(bigInt(sfield));
+ EllipticCurve curve = new EllipticCurve(field,
+ bigInt(a), bigInt(b));
+ ECPoint g = new ECPoint(bigInt(gx), bigInt(gy));
+ return new ECParameterSpec(curve, g, bigInt(n), h);
}
private static BigInteger bigInt(String s) {
@@ -1253,11 +1300,32 @@
return kf.generatePublic(kspec);
}
- private static PublicKey getECPublicKey() throws Exception {
+ private static PublicKey getECPublicKey(String curve) throws Exception {
KeyFactory kf = KeyFactory.getInstance("EC");
- KeySpec kspec = new ECPublicKeySpec(new ECPoint(new BigInteger(EC_X),
- new BigInteger(EC_Y)),
- EC_PARAMS);
+ String x, y;
+ ECParameterSpec params;
+ switch (curve) {
+ case "P256":
+ x = EC_P256_X;
+ y = EC_P256_Y;
+ params = EC_P256_PARAMS;
+ break;
+ case "P384":
+ x = EC_P384_X;
+ y = EC_P384_Y;
+ params = EC_P384_PARAMS;
+ break;
+ case "P521":
+ x = EC_P521_X;
+ y = EC_P521_Y;
+ params = EC_P521_PARAMS;
+ break;
+ default:
+ throw new Exception("Unsupported curve: " + curve);
+ }
+ KeySpec kspec = new ECPublicKeySpec(new ECPoint(new BigInteger(x),
+ new BigInteger(y)),
+ params);
return kf.generatePublic(kspec);
}
@@ -1287,9 +1355,27 @@
return kf.generatePrivate(kspec);
}
- private static PrivateKey getECPrivateKey() throws Exception {
+ private static PrivateKey getECPrivateKey(String curve) throws Exception {
+ String s;
+ ECParameterSpec params;
+ switch (curve) {
+ case "P256":
+ s = EC_P256_S;
+ params = EC_P256_PARAMS;
+ break;
+ case "P384":
+ s = EC_P384_S;
+ params = EC_P384_PARAMS;
+ break;
+ case "P521":
+ s = EC_P521_S;
+ params = EC_P521_PARAMS;
+ break;
+ default:
+ throw new Exception("Unsupported curve: " + curve);
+ }
KeyFactory kf = KeyFactory.getInstance("EC");
- KeySpec kspec = new ECPrivateKeySpec(new BigInteger(EC_S), EC_PARAMS);
+ KeySpec kspec = new ECPrivateKeySpec(new BigInteger(s), params);
return kf.generatePrivate(kspec);
}
--- a/jdk/test/javax/xml/crypto/dsig/ValidationTests.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/javax/xml/crypto/dsig/ValidationTests.java Fri May 22 09:50:33 2015 +0200
@@ -23,7 +23,7 @@
/**
* @test
- * @bug 4635230 6365103 6366054 6824440 7131084 8046724
+ * @bug 4635230 6365103 6366054 6824440 7131084 8046724 8079693
* @summary Basic unit tests for validating XML Signatures with JSR 105
* @compile -XDignore.symbol.file KeySelectors.java SignatureValidator.java
* X509KeySelector.java ValidationTests.java
@@ -35,6 +35,7 @@
import java.security.*;
import javax.xml.crypto.Data;
import javax.xml.crypto.KeySelector;
+import javax.xml.crypto.MarshalException;
import javax.xml.crypto.OctetStreamData;
import javax.xml.crypto.URIDereferencer;
import javax.xml.crypto.URIReference;
@@ -60,9 +61,17 @@
static class Test {
String file;
KeySelector ks;
- Test(String file, KeySelector ks) {
+ Class exception;
+
+ Test(String file, KeySelector ks, Class exception) {
this.file = file;
this.ks = ks;
+ this.exception = exception;
+ }
+
+ // XMLSignatureException is expected by default
+ Test(String file, KeySelector ks) {
+ this(file, ks, XMLSignatureException.class);
}
}
@@ -91,6 +100,8 @@
new Test("signature-enveloping-dsa.xml", KVKS),
new Test("signature-enveloping-rsa.xml", KVKS),
new Test("signature-enveloping-p256-sha1.xml", KVKS),
+ new Test("signature-enveloping-p384-sha1.xml", KVKS),
+ new Test("signature-enveloping-p521-sha1.xml", KVKS),
new Test("signature-enveloping-hmac-sha1.xml", SKKS),
new Test("signature-external-dsa.xml", KVKS),
new Test("signature-external-b64-dsa.xml", KVKS),
@@ -110,7 +121,17 @@
private final static Test[] INVALID_TESTS = {
new Test("signature-enveloping-hmac-sha1-40.xml", SKKS),
new Test("signature-enveloping-hmac-sha1-trunclen-0-attack.xml", SKKS),
- new Test("signature-enveloping-hmac-sha1-trunclen-8-attack.xml", SKKS)
+ new Test("signature-enveloping-hmac-sha1-trunclen-8-attack.xml", SKKS),
+ new Test("signature-extra-text-in-signed-info.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-wrong-canonicalization-method-algorithm.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-wrong-transform-algorithm.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-no-reference-uri.xml", SKKS),
+ new Test("signature-wrong-signature-method-algorithm.xml", SKKS,
+ MarshalException.class),
+ new Test("signature-wrong-tag-names.xml", SKKS, MarshalException.class)
};
public static void main(String args[]) throws Exception {
@@ -143,9 +164,14 @@
test_signature(test);
System.out.println("FAILED");
atLeastOneFailed = true;
- } catch (XMLSignatureException xse) {
- System.out.println(xse.getMessage());
- System.out.println("PASSED");
+ } catch (Exception e) {
+ System.out.println("Exception: " + e);
+ if (e.getClass() != test.exception) {
+ System.out.println("FAILED: unexpected exception");
+ atLeastOneFailed = true;
+ } else {
+ System.out.println("PASSED");
+ }
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-enveloping-p384-sha1.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"/><Reference URI="#object"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>7/XTsHaBSOnJ/jXD5v0zL6VKYsk=</DigestValue></Reference></SignedInfo><SignatureValue>s15F4ng4a+TfNHlK+y18igexSe3wRspeyQi8hwhyMUh6I6kyzxO1wcqRulFyBNwh/Dplht+WS9dO
+GwL4xfDfozKss36ZsHACI3EYe0QI6pN7hcKp511muPI+cmoZzIN/</SignatureValue><KeyInfo><KeyValue><ECKeyValue xmlns="http://www.w3.org/2009/xmldsig11#"><NamedCurve URI="urn:oid:1.3.132.0.34"/><PublicKey>BE7my2bSrGpZ3jNFQ1I6baGP9CE4AIMIyN/ugWhbsCQz8ntwXf15NStBt9MBXolglXbRYMqV8vYB
+f7UJ1ixum8hzcEvgShn0L9l1VkWaU4bYr/Ss9ApimDvbF2g6Mw++sA==</PublicKey></ECKeyValue></KeyValue></KeyInfo><Object Id="object">some text</Object></Signature>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-enveloping-p521-sha1.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1"/><Reference URI="#object"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>7/XTsHaBSOnJ/jXD5v0zL6VKYsk=</DigestValue></Reference></SignedInfo><SignatureValue>AaVkRumHXD0vVtkn2ogcAoByVge1KWGVWE6vph+xr/hcZTqNNaiIyXb7Itu0FBHD9M47T/CuM7y4
+m60zEssaaHl0AUNm7xGpZy7Heqaoibb/gMU1ErrfSNs7yuPG/TCqs8YAd3RGnc6ZbloitWpycGCU
+LS4xxKms0KeRnbVpjk5OeVfK</SignatureValue><KeyInfo><KeyValue><ECKeyValue xmlns="http://www.w3.org/2009/xmldsig11#"><NamedCurve URI="urn:oid:1.3.132.0.35"/><PublicKey>BAE2HJjBQRbl0sdGa1+1cJwxtPJXcnrRdmRXs6TEQmU97US+CK0vsoDQtlnXxDx37mawN7Sh4Atp
+CUeYBbzvBmwPfQEyAO600W9xn4s5wSQvXod8v8brh5ISXhxYPFy3SCcGUxbQYqrVUnBrIXH8WEQX
+K0/T+FdF4CzlQswJY0UZGeQYcA==</PublicKey></ECKeyValue></KeyValue></KeyInfo><Object Id="object">some text</Object></Signature>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-external-rsa.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI="http://oracle.com"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>f6trDCcPsLLkIV/V4DGFbRf8b9Jwal8xGBDshNzEXwPmym2ChN85rbKIg/cbunf04F89/SXLo2v9
+AYjLcUr3G/Vz5YUmqNhnBvJukXgsIG0ddWl3mFi9Tk+CLINlbgfsaFqU9pQwFjmDyAqIrvZYqW7p
+rTHLetv218mbUVBBAkc=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-extra-text-in-signed-info.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue><test>extra text</test></Reference></SignedInfo><SignatureValue>iTrgJERmYeD5hFwY8/MwJpkF+nd++AAOgf/Kxt9SwdE6BIYq2Vyxq4CQPhD+t2971BGTgvF6ejZd
++/Ko4Zs5Dqf4Lt65Vck0q43rM0PdP1e8gJov0IPYnZ1zeqFpah+N/OjmqTbshaZWRIjf3eqS6en5
+ZKjn+TkCQ1kOX/YUNDc=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-no-reference-uri.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>BNPSYlNcyXcO/Tc1tr9mQ/KAZ40eFybLTDyB/HH1EHHMpc972A+nOX2EWBaLsVgG8apl0Isp1ZqV
+gmoDHNF6xrcJJQVydVJzU08GVV4GiXHMqRYQbted7STQLhlhssvNNdMEoVApsX5ByL66wxKZQXrT
+z1kZtOHAi88DOrmIJu0=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-canonicalization-method-algorithm.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://oracle.com"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>EBbyEV7e+1CTUsyCTyxiN8p+U3/za1oTjK7q+kF8Q87r8e/7C1z4ndGWbk6zyI3w6leT+I2suW9U
+KkdvkrDXX2OyLw0GfgJfLkNn+1pGK6kyWpL95NoWJZhHkUAKKBZ0ikfZ4j33gYxrYK+IYCLeZYzr
+hlZjdXXXCiSH0Sq+weQ=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-signature-method-algorithm.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="bogus://bogus"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>RjL9nfQg9u6+KEFfAlBBH7E7ilFgB7YEQ5MxOIJN/fOdQmc5iDD+YuhiHzNGXGi/UOyo6t8LxTxl
+X4oFE1RNlPVkSAZK4LcTWhVa757WwgW1/EZo8PQYWp5NScLq6PumYaujoovSYBKW2N6+jQpnD/L6
+4cuEVNnwEFqvOLrjogY=</SignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-tag-names.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,3 @@
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><aSignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><aCanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></aCanonicalizationMethod><aSignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></aSignatureMethod><aReference URI=""><Transforms><aTransform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></aTransform></Transforms><aDigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></aDigestMethod><aDigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</aDigestValue></aReference></aSignedInfo><aSignatureValue>cbNpPGavhM0BGUtrvLxvy2SCIt+I27BPpVEt0Q9mXrdPYurMqWF/67AdY9m5RqS7+ZZlwUtem083
+MczRYbKoOIq7sMbCqKKdzbSE/U6rfmky/ACQ5wgemZl8jtipwu5LhAUzjhzT8hhTjVqOYpHdkVJz
+l9dnd9eWbLmEr3BI0VA=</aSignatureValue></Signature></test>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/xml/crypto/dsig/data/signature-wrong-transform-algorithm.xml Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,4 @@
+<!-- This XML signature contains a Transform with wrong algorithm -->
+<test xmlns="http://example.org/envelope">test<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI=""><Transforms><Transform Algorithm="bogus://bogus"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>1Bq8FsjajUBYPD7stQeJSc66GlM=</DigestValue></Reference></SignedInfo><SignatureValue>Wzyx3jgEKGwY+pBXBmqWLWhASHQYCCGZVii5sKKKeZUBKxNBthjiSVfzKANuLgX6zAt16XRycrSL
+zFKTPuvGeWVPDvd+KTNKCJxN9ccrG7v23EM7RY2eMJGu2r5DLfKwV7H6YuJPsOuWifVkKAhvq7gd
+6akJshxyAj9Ud+mjo48=</SignatureValue></Signature></test>
\ No newline at end of file
--- a/jdk/test/sun/management/jmxremote/bootstrap/JvmstatCountersTest.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/management/jmxremote/bootstrap/JvmstatCountersTest.java Fri May 22 09:50:33 2015 +0200
@@ -116,10 +116,10 @@
throw new IllegalArgumentException("Test case 3 failed");
}
for (String key : remoteData.keySet()) {
- if (!key.startsWith("sun.management.JMXConnectorServer.0.")) {
+ if (!isKeyAcceptable(key)) {
System.out.println("Test FAILED! The OOTB management " +
"agent shouldn't publish anything which isn't " +
- "related to the remote connector.");
+ "related to the remote connector (" + key + ").");
throw new IllegalArgumentException("Test case 3 failed");
}
}
@@ -165,10 +165,10 @@
throw new IllegalArgumentException("Test case 4 failed");
}
for (String key : remoteData2.keySet()) {
- if (!key.startsWith("sun.management.JMXConnectorServer.0.")) {
+ if (!isKeyAcceptable(key)) {
System.out.println("Test FAILED! The OOTB management " +
"agent shouldn't publish anything which isn't " +
- "related to the remote connector.");
+ "related to the remote connector (" + key + ").");
throw new IllegalArgumentException("Test case 4 failed");
}
}
@@ -184,4 +184,9 @@
}
System.out.println("Bye! Bye!");
}
+
+ private static boolean isKeyAcceptable(String key) {
+ return key.startsWith("sun.management.JMXConnectorServer.0.") ||
+ key.startsWith("sun.management.JMXConnectorServer.remote.enabled");
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/management/jmxremote/startstop/JMXStatusPerfCountersTest.java Fri May 22 09:50:33 2015 +0200
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.IOException;
+import java.net.BindException;
+import java.util.Properties;
+import java.util.function.Predicate;
+import static org.testng.Assert.*;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import jdk.testlibrary.ProcessTools;
+
+
+/**
+ * @test
+ * @bug 8075926
+ * @summary Makes sure that the current management agent status is reflected
+ * in the related performance counters.
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.* PortAllocator TestApp ManagementAgentJcmd
+ * @run testng/othervm -XX:+UsePerfData JMXStatusPerfCountersTest
+ */
+public class JMXStatusPerfCountersTest {
+ private final static String TEST_APP_NAME = "TestApp";
+
+ private final static String REMOTE_STATUS_KEY = "sun.management.JMXConnectorServer.remote.enabled";
+
+ private static ProcessBuilder testAppPb;
+ private Process testApp;
+
+ private ManagementAgentJcmd jcmd;
+
+ @BeforeClass
+ public static void setupClass() throws Exception {
+ testAppPb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UsePerfData",
+ "-cp", System.getProperty("test.class.path"),
+ TEST_APP_NAME
+ );
+ }
+
+ @BeforeTest
+ public void setup() {
+ jcmd = new ManagementAgentJcmd(TEST_APP_NAME, false);
+ }
+
+ @BeforeMethod
+ public void startTestApp() throws Exception {
+ testApp = ProcessTools.startProcess(
+ TEST_APP_NAME, testAppPb,
+ (Predicate<String>)l->l.trim().equals("main enter")
+ );
+ }
+
+ @AfterMethod
+ public void stopTestApp() throws Exception {
+ testApp.getOutputStream().write(1);
+ testApp.getOutputStream().flush();
+ testApp.waitFor();
+ testApp = null;
+ }
+
+ /**
+ * The 'sun.management.JMXConnectorServer.remote.enabled' counter must not be
+ * exported if the remote agent is not enabled.
+ * @throws Exception
+ */
+ @Test
+ public void testNotInitializedRemote() throws Exception {
+ assertFalse(
+ getCounters().containsKey(REMOTE_STATUS_KEY),
+ "Unexpected occurrence of " + REMOTE_STATUS_KEY + " in perf counters"
+ );
+ }
+
+ /**
+ * After enabling the remote agent the 'sun.management.JMXConnectorServer.remote.enabled'
+ * counter will be exported with value of '0' - corresponding to the actual
+ * version of the associated remote connector perf counters.
+ * @throws Exception
+ */
+ @Test
+ public void testRemoteEnabled() throws Exception {
+ while (true) {
+ try {
+ int[] ports = PortAllocator.allocatePorts(1);
+ jcmd.start(
+ "jmxremote.port=" + ports[0],
+ "jmxremote.authenticate=false",
+ "jmxremote.ssl=false"
+ );
+ String v = getCounters().getProperty(REMOTE_STATUS_KEY);
+ assertNotNull(v);
+ assertEquals("0", v);
+ return;
+ } catch (BindException e) {
+ System.out.println("Failed to allocate ports. Retrying ...");
+ }
+ }
+ }
+
+ /**
+ * After disabling the remote agent the value of 'sun.management.JMXConnectorServer.remote.enabled'
+ * counter will become '-1'.
+ * @throws Exception
+ */
+ @Test
+ public void testRemoteDisabled() throws Exception {
+ while (true) {
+ try {
+ int[] ports = PortAllocator.allocatePorts(1);
+ jcmd.start(
+ "jmxremote.port=" + ports[0],
+ "jmxremote.authenticate=false",
+ "jmxremote.ssl=false"
+ );
+ jcmd.stop();
+ String v = getCounters().getProperty(REMOTE_STATUS_KEY);
+ assertNotNull(v);
+ assertEquals("-1", v);
+ return;
+ } catch (BindException e) {
+ System.out.println("Failed to allocate ports. Retrying ...");
+ }
+ }
+ }
+
+ /**
+ * Each subsequent re-enablement of the remote agent must keep the value of
+ * 'sun.management.JMXConnectorServer.remote.enabled' counter in sync with
+ * the actual version of the associated remote connector perf counters.
+ * @throws Exception
+ */
+ @Test
+ public void testRemoteReEnabled() throws Exception {
+ while (true) {
+ try {
+ int[] ports = PortAllocator.allocatePorts(1);
+ jcmd.start(
+ "jmxremote.port=" + ports[0],
+ "jmxremote.authenticate=false",
+ "jmxremote.ssl=false"
+ );
+ jcmd.stop();
+ jcmd.start(
+ "jmxremote.port=" + ports[0],
+ "jmxremote.authenticate=false",
+ "jmxremote.ssl=false"
+ );
+
+ String v = getCounters().getProperty(REMOTE_STATUS_KEY);
+ assertNotNull(v);
+ assertEquals("1", v);
+ return;
+ } catch (BindException e) {
+ System.out.println("Failed to allocate ports. Retrying ...");
+ }
+ }
+ }
+
+ private Properties getCounters() throws IOException, InterruptedException {
+ return jcmd.perfCounters("sun\\.management\\.JMXConnectorServer\\..*");
+ }
+}
\ No newline at end of file
--- a/jdk/test/sun/management/jmxremote/startstop/ManagementAgentJcmd.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/management/jmxremote/startstop/ManagementAgentJcmd.java Fri May 22 09:50:33 2015 +0200
@@ -25,8 +25,10 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Properties;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import sun.management.Agent;
import sun.management.AgentConfigurationError;
@@ -43,6 +45,7 @@
private static final String CMD_START = "ManagementAgent.start";
private static final String CMD_START_LOCAL = "ManagementAgent.start_local";
private static final String CMD_STATUS = "ManagementAgent.status";
+ private static final String CMD_PRINTPERF = "PerfCounter.print";
private final String id;
private final boolean verbose;
@@ -63,6 +66,39 @@
}
/**
+ * `jcmd PerfCounter.print`
+ * @return Returns the available performance counters with their values as
+ * {@linkplain Properties} instance
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ public Properties perfCounters() throws IOException, InterruptedException {
+ return perfCounters(".*");
+ }
+
+ /**
+ * `jcmd PerfCounter.print | grep {exp}>`
+ * @param regex Regular expression for including perf counters in the result
+ * @return Returns the matching performance counters with their values
+ * as {@linkplain Properties} instance
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ public Properties perfCounters(String regex) throws IOException, InterruptedException {
+ Pattern pat = Pattern.compile(regex);
+ Properties p = new Properties();
+ for(String l : jcmd(CMD_PRINTPERF).split("\\n")) {
+ String[] kv = l.split("=");
+ if (kv.length > 1) {
+ if (pat.matcher(kv[0]).matches()) {
+ p.setProperty(kv[0], kv[1].replace("\"", ""));
+ }
+ }
+ }
+ return p;
+ }
+
+ /**
* `jcmd <app> ManagementAgent.stop`
* @return The JCMD output
* @throws IOException
--- a/jdk/test/sun/nio/cs/FindDecoderBugs.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/nio/cs/FindDecoderBugs.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
* 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,16 +24,19 @@
/*
* @test
* @bug 6380723
- * @summary Decode many byte sequences in many ways
+ * @summary Decode many byte sequences in many ways (use -Dseed=X to set PRNG seed)
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
* @run main/timeout=1800 FindDecoderBugs
* @author Martin Buchholz
- * @key randomness
+ * @key intermittent randomness
*/
import java.util.*;
import java.util.regex.*;
import java.nio.*;
import java.nio.charset.*;
+import jdk.testlibrary.RandomFactory;
public class FindDecoderBugs {
@@ -322,7 +325,7 @@
}
}
- private final static Random rnd = new Random();
+ private final static Random rnd = RandomFactory.getRandom();
private static byte randomByte() {
return (byte) rnd.nextInt(0x100);
}
--- a/jdk/test/sun/nio/cs/FindEncoderBugs.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/nio/cs/FindEncoderBugs.java Fri May 22 09:50:33 2015 +0200
@@ -25,15 +25,18 @@
* @test
* @bug 6233345 6381699 6381702 6381705 6381706
* @summary Encode many char sequences in many ways
+ * @library /lib/testlibrary/
+ * @build jdk.testlibrary.*
* @run main/timeout=1200 FindEncoderBugs
* @author Martin Buchholz
- * @key randomness
+ * @key randomness intermittent
*/
import java.util.*;
import java.util.regex.*;
import java.nio.*;
import java.nio.charset.*;
+import jdk.testlibrary.RandomFactory;
public class FindEncoderBugs {
@@ -456,7 +459,7 @@
}
}
- private final static Random rnd = new Random();
+ private final static Random rnd = RandomFactory.getRandom();
private static char randomChar() {
return (char) rnd.nextInt(Character.MAX_VALUE);
}
--- a/jdk/test/sun/nio/cs/TestStringCoding.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/nio/cs/TestStringCoding.java Fri May 22 09:50:33 2015 +0200
@@ -22,7 +22,7 @@
*/
/* @test
- @bug 6636323 6636319 7040220 7096080 7183053
+ @bug 6636323 6636319 7040220 7096080 7183053 8080248
@summary Test if StringCoding and NIO result have the same de/encoding result
* @run main/othervm/timeout=2000 TestStringCoding
* @key randomness
@@ -200,6 +200,17 @@
*/
}
+ //encode mappable surrogates for hkscs
+ if (cs.name().equals("Big5-HKSCS") || cs.name().equals("x-MS950-HKSCS")) {
+ String str = "ab\uD840\uDD0Ccd";
+ byte[] expected = new byte[] {(byte)'a', (byte)'b',
+ (byte)0x88, (byte)0x45, (byte)'c', (byte)'d' };
+ if (!Arrays.equals(str.getBytes(cs.name()), expected) ||
+ !Arrays.equals(str.getBytes(cs), expected)) {
+ throw new RuntimeException("encode(surrogates) failed -> "
+ + cs.name());
+ }
+ }
}
static class PermissiveSecurityManger extends SecurityManager {
--- a/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/security/krb5/auto/HttpNegotiateServer.java Fri May 22 09:50:33 2015 +0200
@@ -40,21 +40,34 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
-import java.security.PrivilegedExceptionAction;
+import java.net.URLConnection;
+import java.security.*;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.Subject;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.NameCallback;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.security.auth.login.AppConfigurationEntry;
+import javax.security.auth.login.Configuration;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSCredential;
import org.ietf.jgss.GSSManager;
import sun.security.jgss.GSSUtil;
import sun.security.krb5.Config;
+import java.util.Base64;
import sun.util.logging.PlatformLogger;
import java.util.Base64;
@@ -197,7 +210,7 @@
proxyUrl = new URL("http://nosuchplace/a/b/c");
try {
- Exception e1 = null, e2 = null;
+ Exception e1 = null, e2 = null, e3 = null;
try {
test6578647();
} catch (Exception e) {
@@ -210,7 +223,14 @@
e2 = e;
e.printStackTrace();
}
- if (e1 != null || e2 != null) {
+ try {
+ test8077155();
+ } catch (Exception e) {
+ e3 = e;
+ e.printStackTrace();
+ }
+
+ if (e1 != null || e2 != null || e3 != null) {
throw new RuntimeException("Test error");
}
} finally {
@@ -254,6 +274,121 @@
}
}
+ static void testConnect() {
+ InputStream inputStream = null;
+ try {
+ URL url = webUrl;
+
+ URLConnection conn = url.openConnection();
+ conn.connect();
+ inputStream = conn.getInputStream();
+ byte[] b = new byte[inputStream.available()];
+ for (int j = 0; j < b.length; j++) {
+ b[j] = (byte) inputStream.read();
+ }
+ String s = new String(b);
+ System.out.println("Length: " + s.length());
+ System.out.println(s);
+ } catch (Exception ex) {
+ throw new RuntimeException(ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ static void test8077155() throws Exception {
+ final String username = WEB_USER;
+ final char[] password = WEB_PASS;
+
+ SecurityManager security = new SecurityManager();
+ Policy.setPolicy(new SecurityPolicy());
+ System.setSecurityManager(security);
+
+ CallbackHandler callback = new CallbackHandler() {
+ @Override
+ public void handle(Callback[] pCallbacks) throws IOException, UnsupportedCallbackException {
+ for (Callback cb : pCallbacks) {
+ if (cb instanceof NameCallback) {
+ NameCallback ncb = (NameCallback)cb;
+ ncb.setName(username);
+
+ } else if (cb instanceof PasswordCallback) {
+ PasswordCallback pwdcb = (PasswordCallback) cb;
+ pwdcb.setPassword(password);
+ }
+ }
+ }
+
+ };
+
+ final String jaasConfigName = "oracle.test.kerberos.login";
+ final String krb5LoginModule = "com.sun.security.auth.module.Krb5LoginModule";
+
+ Configuration loginConfig = new Configuration() {
+ @Override
+ public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
+ if (! jaasConfigName.equals(name)) {
+ return new AppConfigurationEntry[0];
+ }
+
+ Map<String, String> options = new HashMap<String, String>();
+ options.put("useTicketCache", Boolean.FALSE.toString());
+ options.put("useKeyTab", Boolean.FALSE.toString());
+
+ return new AppConfigurationEntry[] {
+ new AppConfigurationEntry(krb5LoginModule,
+ LoginModuleControlFlag.REQUIRED,
+ options)
+ };
+ }
+ };
+
+ // oracle context/subject/login
+ LoginContext context = null;
+ try {
+ context = new LoginContext("oracle.test.kerberos.login", null, callback, loginConfig);
+ context.login();
+
+ } catch (LoginException ex) {
+ ex.printStackTrace();
+ throw new RuntimeException(ex);
+ }
+
+
+ Subject subject = context.getSubject();
+
+ final PrivilegedExceptionAction<Object> test_action = new PrivilegedExceptionAction<Object>() {
+ public Object run() throws Exception {
+ testConnect();
+ return null;
+ }
+ };
+
+ System.err.println("\n\nExpecting to succeed when executing with the the logged in subject.");
+
+ try {
+ Subject.doAs(subject, test_action);
+ System.err.println("\n\nConnection succeed when executing with the the logged in subject.");
+ } catch (PrivilegedActionException e) {
+ System.err.println("\n\nFailure unexpected when executing with the the logged in subject.");
+ e.printStackTrace();
+ throw new RuntimeException("Failed to login as subject");
+ }
+
+ try {
+ System.err.println("\n\nExpecting to fail when running with the current user's login.");
+ testConnect();
+ } catch (Exception ex) {
+ System.err.println("\nConnect failed when running with the current user's login:\n" + ex.getMessage());
+ }
+ }
+
/**
* Creates and starts an HTTP or proxy server that requires
* Negotiate authentication.
@@ -366,3 +501,22 @@
}
}
}
+
+class SecurityPolicy extends Policy {
+
+ private static Permissions perms;
+
+ public SecurityPolicy() {
+ super();
+ if (perms == null) {
+ perms = new Permissions();
+ perms.add(new AllPermission());
+ }
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return perms;
+ }
+
+}
--- a/jdk/test/sun/security/krb5/config/ConfPlusProp.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/security/krb5/config/ConfPlusProp.java Fri May 22 09:50:33 2015 +0200
@@ -35,6 +35,12 @@
public class ConfPlusProp {
Config config;
public static void main(String[] args) throws Exception {
+ if (System.getenv("USERDNSDOMAIN") != null ||
+ System.getenv("LOGONSERVER") != null) {
+ System.out.println(
+ "Looks like a Windows machine in a domain. Skip test.");
+ return;
+ }
new ConfPlusProp().run();
}
@@ -90,23 +96,8 @@
check("R2", "old");
check("R3", null);
- int version = System.getProperty("java.version").charAt(2) - '0';
- System.out.println("JDK version is " + version);
-
- // Zero-config is supported since 1.7
- if (version >= 7) {
- // Point to a non-existing file
- System.setProperty("java.security.krb5.conf", "i-am-not-a file");
- refresh();
-
- // Default realm might come from DNS
- //checkDefaultRealm(null);
- check("R1", null);
- check("R2", null);
- check("R3", null);
- if (config.get("libdefaults", "forwardable") != null) {
- throw new Exception("Extra config error");
- }
+ if (config.get("libdefaults", "forwardable") != null) {
+ throw new Exception("Extra config error");
}
// Add prop
@@ -136,14 +127,6 @@
check("R2", "k2");
check("R3", "k2");
- // Point to a non-existing file
- System.setProperty("java.security.krb5.conf", "i-am-not-a file");
- refresh();
-
- checkDefaultRealm("R2");
- check("R1", "k2");
- check("R2", "k2");
- check("R3", "k2");
if (config.get("libdefaults", "forwardable") != null) {
throw new Exception("Extra config error");
}
--- a/jdk/test/sun/security/krb5/config/DNS.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/security/krb5/config/DNS.java Fri May 22 09:50:33 2015 +0200
@@ -23,12 +23,22 @@
// See dns.sh.
import sun.security.krb5.Config;
+import sun.security.krb5.KrbException;
public class DNS {
public static void main(String[] args) throws Exception {
System.setProperty("java.security.krb5.conf",
- System.getProperty("test.src", ".") +"/nothing.conf");
+ System.getProperty("test.src", ".") +"/no-such-file.conf");
Config config = Config.getInstance();
+ try {
+ String r = config.getDefaultRealm();
+ throw new Exception("What? There is a default realm " + r + "?");
+ } catch (KrbException ke) {
+ ke.printStackTrace();
+ if (ke.getCause() != null) {
+ throw new Exception("There should be no cause. Won't try DNS");
+ }
+ }
String kdcs = config.getKDCList("X");
if (!kdcs.equals("a.com.:88 b.com.:99") &&
!kdcs.equals("a.com. b.com.:99")) {
--- a/jdk/test/sun/security/krb5/config/DnsFallback.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/security/krb5/config/DnsFallback.java Fri May 22 09:50:33 2015 +0200
@@ -22,8 +22,7 @@
*/
/*
* @test
- * @bug 6673164
- * @bug 6552334
+ * @bug 6673164 6552334 8077102
* @run main/othervm DnsFallback
* @summary fix dns_fallback parse error, and use dns by default
*/
@@ -35,47 +34,66 @@
public class DnsFallback {
static Method useDNS_Realm;
+ static Method useDNS_KDC;
public static void main(String[] args) throws Exception {
useDNS_Realm = Config.class.getDeclaredMethod("useDNS_Realm");
useDNS_Realm.setAccessible(true);
+ useDNS_KDC = Config.class.getDeclaredMethod("useDNS_KDC");
+ useDNS_KDC.setAccessible(true);
// for 6673164
- check("true", "true", true);
- check("false", "true", false);
- check("true", "false", true);
- check("false", "false", false);
- check("true", null, true);
- check("false", null, false);
- check(null, "true", true);
- check(null, "false", false);
+ check("true", "true", true, true);
+ check("false", "true", false, false);
+ check("true", "false", true, true);
+ check("false", "false", false, false);
+ check("true", null, true, true);
+ check("false", null, false, false);
+ check(null, "true", true, true);
+ check(null, "false", false, false);
- // for 6552334
- check(null, null, true);
+ // for 6552334, no longer true
+ //check(null, null, true, true);
+
+ // 8077102
+ check(null, null, false, true);
}
- static void check(String realm, String fallback, boolean output)
+ /**
+ * Sets and checks.
+ *
+ * @param u dns_lookup_XXX value set, none if null
+ * @param f dns_fallback value set, none if null
+ * @param r expected useDNS_Realm
+ * @param k expected useDNS_KDC
+ */
+ static void check(String u, String f, boolean r, boolean k)
throws Exception {
try (PrintStream ps =
new PrintStream(new FileOutputStream("dnsfallback.conf"))) {
ps.println("[libdefaults]\n");
- if (realm != null) {
- ps.println("dns_lookup_realm=" + realm);
+ if (u != null) {
+ ps.println("dns_lookup_realm=" + u);
+ ps.println("dns_lookup_kdc=" + u);
}
- if (fallback != null) {
- ps.println("dns_fallback=" + fallback);
+ if (f != null) {
+ ps.println("dns_fallback=" + f);
}
}
System.setProperty("java.security.krb5.conf", "dnsfallback.conf");
Config.refresh();
- System.out.println("Testing " + realm + ", " + fallback + ", " + output);
+ System.out.println("Testing " + u + ", " + f + ", " + r + ", " + k);
- if (!useDNS_Realm.invoke(Config.getInstance()).equals(output)) {
- throw new Exception("Fail");
+ if (!useDNS_Realm.invoke(Config.getInstance()).equals(r)) {
+ throw new Exception("useDNS_Realm Fail");
+ }
+
+ if (!useDNS_KDC.invoke(Config.getInstance()).equals(k)) {
+ throw new Exception("useDNS_KDC Fail");
}
}
}
--- a/jdk/test/sun/security/krb5/config/confplusprop.conf Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/security/krb5/config/confplusprop.conf Fri May 22 09:50:33 2015 +0200
@@ -1,7 +1,7 @@
[libdefaults]
default_realm = R1
forwardable = well
-dns_lookup_realm = false
+dns_lookup_kdc = false
[realms]
R1 = {
--- a/jdk/test/sun/security/krb5/config/confplusprop2.conf Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/sun/security/krb5/config/confplusprop2.conf Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
[libdefaults]
-dns_lookup_realm = false
+dns_lookup_kdc = false
[realms]
R1 = {
--- a/jdk/test/tools/launcher/Arrrghs.java Thu May 21 18:23:01 2015 +0300
+++ b/jdk/test/tools/launcher/Arrrghs.java Fri May 22 09:50:33 2015 +0200
@@ -24,7 +24,7 @@
/**
* @test
* @bug 5030233 6214916 6356475 6571029 6684582 6742159 4459600 6758881 6753938
- * 6894719 6968053 7151434 7146424 8007333
+ * 6894719 6968053 7151434 7146424 8007333 8077822
* @summary Argument parsing validation.
* @compile -XDignore.symbol.file Arrrghs.java
* @run main/othervm Arrrghs
@@ -304,6 +304,16 @@
throw new RuntimeException("Error: compiling java wildcards");
}
+ // test if javac (the command) can compile *.java with a vmoption
+ tr = doExec(javacCmd, "-cp", ".",
+ "-J-showversion", "-J-Dsomeproperty=foo",
+ libDir.getName() + File.separator + "*.java");
+ if (!tr.isOK()) {
+ System.out.println(tr);
+ throw new RuntimeException("Error: compiling java wildcards with vmoptions");
+ }
+
+
// use the jar cmd to create jars using the ? wildcard
File jarFoo = new File(libDir, "Foo.jar");
tr = doExec(jarCmd, "cvf", jarFoo.getAbsolutePath(), "lib" + File.separator + "F?o.class");
--- a/langtools/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/langtools/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -306,3 +306,4 @@
0eb91327db5a840779cc5c35b9b858d6ef7959d1 jdk9-b61
40058141a4ec04a3d4cacdb693ad188a5ddf48ed jdk9-b62
a28b7f42dae9bd59513beaa5a2d6eb563dc09e08 jdk9-b63
+809d66512998789b620d08c335d7c31211a0cf29 jdk9-b64
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java Thu May 21 18:23:01 2015 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java Fri May 22 09:50:33 2015 +0200
@@ -119,7 +119,7 @@
Content captionSpan;
Content span;
if (type.isDefaultTab()) {
- captionSpan = HtmlTree.SPAN(new StringContent(type.text()));
+ captionSpan = HtmlTree.SPAN(configuration.getResource(type.resourceKey()));
span = HtmlTree.SPAN(type.tabId(),
HtmlStyle.activeTableTab, captionSpan);
} else {
@@ -142,7 +142,7 @@
*/
public Content getMethodTypeLinks(MethodTypes methodType) {
String jsShow = "javascript:show(" + methodType.value() +");";
- HtmlTree link = HtmlTree.A(jsShow, new StringContent(methodType.text()));
+ HtmlTree link = HtmlTree.A(jsShow, configuration.getResource(methodType.resourceKey()));
return link;
}
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Thu May 21 18:23:01 2015 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java Fri May 22 09:50:33 2015 +0200
@@ -465,10 +465,10 @@
for (Map.Entry<String,Integer> entry : typeMap.entrySet()) {
vars.append(sep);
sep = ",";
- vars.append("\"");
- vars.append(entry.getKey());
- vars.append("\":");
- vars.append(entry.getValue());
+ vars.append("\"")
+ .append(entry.getKey())
+ .append("\":")
+ .append(entry.getValue());
}
vars.append("};").append(DocletConstants.NL);
sep = "";
@@ -476,11 +476,19 @@
for (MethodTypes entry : methodTypes) {
vars.append(sep);
sep = ",";
- vars.append(entry.value()).append(":");
- vars.append("[").append("\"").append(entry.tabId());
- vars.append("\"").append(sep).append("\"").append(entry.text()).append("\"]");
+ vars.append(entry.value())
+ .append(":")
+ .append("[")
+ .append("\"")
+ .append(entry.tabId())
+ .append("\"")
+ .append(sep)
+ .append("\"")
+ .append(configuration.getText(entry.resourceKey()))
+ .append("\"]");
}
- vars.append("};").append(DocletConstants.NL);
+ vars.append("};")
+ .append(DocletConstants.NL);
addStyles(HtmlStyle.altColor, vars);
addStyles(HtmlStyle.rowColor, vars);
addStyles(HtmlStyle.tableTab, vars);
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties Thu May 21 18:23:01 2015 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/resources/doclets.properties Fri May 22 09:50:33 2015 +0200
@@ -150,6 +150,13 @@
doclet.Constructors=Constructors
doclet.methods=methods
doclet.Methods=Methods
+doclet.All_Methods=All Methods
+doclet.Static_Methods=Static Methods
+doclet.Instance_Methods=Instance Methods
+doclet.Abstract_Methods=Abstract Methods
+doclet.Concrete_Methods=Concrete Methods
+doclet.Default_Methods=Default Methods
+doclet.Deprecated_Methods=Deprecated Methods
doclet.annotation_type_optional_members=optional elements
doclet.Annotation_Type_Optional_Members=Optional Elements
doclet.annotation_type_required_members=required elements
--- a/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodTypes.java Thu May 21 18:23:01 2015 +0300
+++ b/langtools/src/jdk.javadoc/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodTypes.java Fri May 22 09:50:33 2015 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,22 +31,22 @@
* @author Bhavesh Patel
*/
public enum MethodTypes {
- ALL(0xffff, "All Methods", "t0", true),
- STATIC(0x1, "Static Methods", "t1", false),
- INSTANCE(0x2, "Instance Methods", "t2", false),
- ABSTRACT(0x4, "Abstract Methods", "t3", false),
- CONCRETE(0x8, "Concrete Methods", "t4", false),
- DEFAULT(0x10, "Default Methods", "t5", false),
- DEPRECATED(0x20, "Deprecated Methods", "t6", false);
+ ALL(0xffff, "doclet.All_Methods", "t0", true),
+ STATIC(0x1, "doclet.Static_Methods", "t1", false),
+ INSTANCE(0x2, "doclet.Instance_Methods", "t2", false),
+ ABSTRACT(0x4, "doclet.Abstract_Methods", "t3", false),
+ CONCRETE(0x8, "doclet.Concrete_Methods", "t4", false),
+ DEFAULT(0x10, "doclet.Default_Methods", "t5", false),
+ DEPRECATED(0x20, "doclet.Deprecated_Methods", "t6", false);
private final int value;
- private final String text;
+ private final String resourceKey;
private final String tabId;
private final boolean isDefaultTab;
- MethodTypes(int v, String t, String id, boolean dt) {
+ MethodTypes(int v, String k, String id, boolean dt) {
this.value = v;
- this.text = t;
+ this.resourceKey = k;
this.tabId = id;
this.isDefaultTab = dt;
}
@@ -55,8 +55,8 @@
return value;
}
- public String text() {
- return text;
+ public String resourceKey() {
+ return resourceKey;
}
public String tabId() {
--- a/make/CompileJavaModules.gmk Thu May 21 18:23:01 2015 +0300
+++ b/make/CompileJavaModules.gmk Fri May 22 09:50:33 2015 +0200
@@ -89,7 +89,7 @@
################################################################################
-java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-missing,-reference '-Xdoclint/package:java.*,javax.*'
+java.desktop_ADD_JAVAC_FLAGS := -Xdoclint:all/protected,-reference '-Xdoclint/package:java.*,javax.*'
java.desktop_COPY := .gif .png .wav .txt .xml .css .pf
java.desktop_CLEAN := iio-plugin.properties cursors.properties
@@ -152,7 +152,6 @@
$(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/java2d/*.java) \
$(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/java2d/opengl/*.java) \
$(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/awt/*.java) \
- $(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/awt/motif/*.java) \
$(wildcard $(JDK_TOPDIR)/src/java.desktop/unix/classes/sun/font/*.java) \
#
else
--- a/make/Init.gmk Thu May 21 18:23:01 2015 +0300
+++ b/make/Init.gmk Fri May 22 09:50:33 2015 +0200
@@ -267,7 +267,9 @@
( cd $(TOPDIR) && \
$(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) $(OUTPUT_SYNC_FLAG) \
-j $(JOBS) -f make/Main.gmk $(USER_MAKE_VARS) \
- $(PARALLEL_TARGETS) )
+ $(PARALLEL_TARGETS) || \
+ ( exitcode=$$? && $(BUILD_LOG_WRAPPER) $(PRINTF) "\nERROR: Build failed for $(TARGET_DESCRIPTION) (exit code $$exitcode) \n" && \
+ $(PRINTF) "Hint: If caused by a warning, try configure --disable-warnings-as-errors \n\n" && exit $$exitcode ) )
$(call CleanupSmartJavac)
$(call StopGlobalTimer)
$(call ReportBuildTimes)
--- a/make/Javadoc.gmk Thu May 21 18:23:01 2015 +0300
+++ b/make/Javadoc.gmk Fri May 22 09:50:33 2015 +0200
@@ -1141,7 +1141,7 @@
NASHORNAPI_HEADER := <strong>Nashorn API</strong>
NASHORNAPI_BOTTOM := $(call CommonBottom,$(NASHORNAPI_FIRST_COPYRIGHT_YEAR))
NASHORNAPI_GROUPNAME := Packages
-NASHORNAPI_REGEXP := jdk.nashorn.api.scripting.*
+NASHORNAPI_REGEXP := jdk.nashorn.api.*
# NASHORNAPI_PKGS is located in NON_CORE_PKGS.gmk
NASHORNAPI_INDEX_HTML = $(NASHORNAPI_DOCDIR)/index.html
--- a/make/common/NON_CORE_PKGS.gmk Thu May 21 18:23:01 2015 +0300
+++ b/make/common/NON_CORE_PKGS.gmk Fri May 22 09:50:33 2015 +0200
@@ -82,7 +82,8 @@
com.sun.source.util \
jdk
-NASHORNAPI_PKGS = jdk.nashorn.api.scripting
+NASHORNAPI_PKGS = jdk.nashorn.api.scripting \
+ jdk.nashorn.api.tree
SMARTCARDIO_PKGS = javax.smartcardio
--- a/make/common/NativeCompilation.gmk Thu May 21 18:23:01 2015 +0300
+++ b/make/common/NativeCompilation.gmk Fri May 22 09:50:33 2015 +0200
@@ -487,6 +487,21 @@
$1_EXTRA_CXXFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE)))
endif
+ # Check if warnings should be considered errors.
+ # Pick first binary and toolchain specific, then binary specific, then general setting.
+ ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)),)
+ ifeq ($$($1_WARNINGS_AS_ERRORS),)
+ $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$(WARNINGS_AS_ERRORS)
+ else
+ $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$($1_WARNINGS_AS_ERRORS)
+ endif
+ endif
+
+ ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)), true)
+ $1_EXTRA_CFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS)
+ $1_EXTRA_CXXFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS)
+ endif
+
ifeq (NONE, $$($1_OPTIMIZATION))
$1_EXTRA_CFLAGS += $(C_O_FLAG_NONE)
$1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE)
--- a/modules.xml Thu May 21 18:23:01 2015 +0300
+++ b/modules.xml Fri May 22 09:50:33 2015 +0200
@@ -616,7 +616,6 @@
<depend>java.prefs</depend>
<depend re-exports="true">java.xml</depend>
<depend re-exports="true">java.datatransfer</depend>
- <depend>jdk.charsets</depend>
<export>
<name>java.applet</name>
</export>
@@ -1502,10 +1501,6 @@
<module>
<name>jdk.charsets</name>
<depend>java.base</depend>
- <export>
- <name>sun.nio.cs.ext</name>
- <to>java.desktop</to>
- </export>
</module>
<module>
<name>jdk.compiler</name>
--- a/nashorn/.hgtags Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/.hgtags Fri May 22 09:50:33 2015 +0200
@@ -297,3 +297,4 @@
89937bee80bd28826de8cf60aa63a21edab63f79 jdk9-b61
1b5604bc81a6161b1c3c9dd654cd1399474ae9ee jdk9-b62
bc8e67bec2f92772c4a67e20e66a4f216207f0af jdk9-b63
+00df6e4fc75a83bdd958f9ef86d80e008c9ba967 jdk9-b64
--- a/nashorn/make/build.xml Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/make/build.xml Fri May 22 09:50:33 2015 +0200
@@ -188,7 +188,7 @@
<mkdir dir="${fxshell.classes.dir}"/>
<javac srcdir="${fxshell.dir}"
destdir="${fxshell.classes.dir}"
- classpath="${dist.jar}:${javac.classpath}"
+ classpath="${dist.jar}${path.separator}${javac.classpath}"
debug="${javac.debug}"
encoding="${javac.encoding}"
includeantruntime="false">
--- a/nashorn/make/project.properties Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/make/project.properties Fri May 22 09:50:33 2015 +0200
@@ -105,8 +105,8 @@
javac.classpath=\
${build.classes.dir}
javac.test.classpath=\
- ${build.classes.dir}:\
- ${build.test.classes.dir}:\
+ ${build.classes.dir}${path.separator}\
+ ${build.test.classes.dir}${path.separator}\
${file.reference.testng.jar}
meta.inf.dir=${src.dir}/META-INF
@@ -259,8 +259,8 @@
testjfx-test-sys-prop.test.fork.jvm.options=${run.test.jvmargs.main} -Xmx${run.test.xmx} -cp ${testjfx.run.test.classpath}
run.test.classpath=\
- ${file.reference.testng.jar}:\
- ${nashorn.internal.tests.jar}:\
+ ${file.reference.testng.jar}${path.separator}\
+ ${nashorn.internal.tests.jar}${path.separator}\
${nashorn.api.tests.jar}
src.dir=src/jdk.scripting.nashorn/share/classes
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java Fri May 22 09:50:33 2015 +0200
@@ -1228,31 +1228,41 @@
final List<Object> list = Arrays.asList(array);
final Object cmpThis = cmp == null || cmp.isStrict() ? ScriptRuntime.UNDEFINED : Global.instance();
- Collections.sort(list, new Comparator<Object>() {
- private final MethodHandle call_cmp = getCALL_CMP();
- @Override
- public int compare(final Object x, final Object y) {
- if (x == ScriptRuntime.UNDEFINED && y == ScriptRuntime.UNDEFINED) {
- return 0;
- } else if (x == ScriptRuntime.UNDEFINED) {
- return 1;
- } else if (y == ScriptRuntime.UNDEFINED) {
- return -1;
- }
+ try {
+ Collections.sort(list, new Comparator<Object>() {
+ private final MethodHandle call_cmp = getCALL_CMP();
+ @Override
+ public int compare(final Object x, final Object y) {
+ if (x == ScriptRuntime.UNDEFINED && y == ScriptRuntime.UNDEFINED) {
+ return 0;
+ } else if (x == ScriptRuntime.UNDEFINED) {
+ return 1;
+ } else if (y == ScriptRuntime.UNDEFINED) {
+ return -1;
+ }
- if (cmp != null) {
- try {
- return (int)Math.signum((double)call_cmp.invokeExact(cmp, cmpThis, x, y));
- } catch (final RuntimeException | Error e) {
- throw e;
- } catch (final Throwable t) {
- throw new RuntimeException(t);
+ if (cmp != null) {
+ try {
+ return (int)Math.signum((double)call_cmp.invokeExact(cmp, cmpThis, x, y));
+ } catch (final RuntimeException | Error e) {
+ throw e;
+ } catch (final Throwable t) {
+ throw new RuntimeException(t);
+ }
}
- }
- return JSType.toString(x).compareTo(JSType.toString(y));
- }
- });
+ return JSType.toString(x).compareTo(JSType.toString(y));
+ }
+ });
+ } catch (final IllegalArgumentException iae) {
+ // Collections.sort throws IllegalArgumentException when
+ // Comparison method violates its general contract
+
+ // See ECMA spec 15.4.4.11 Array.prototype.sort (comparefn).
+ // If "comparefn" is not undefined and is not a consistent
+ // comparison function for the elements of this array, the
+ // behaviour of sort is implementation-defined.
+ }
return list.toArray(new Object[array.length]);
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArrayBuffer.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArrayBuffer.java Fri May 22 09:50:33 2015 +0200
@@ -28,6 +28,7 @@
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
import java.nio.ByteBuffer;
+
import jdk.nashorn.internal.objects.annotations.Attribute;
import jdk.nashorn.internal.objects.annotations.Constructor;
import jdk.nashorn.internal.objects.annotations.Function;
@@ -226,10 +227,10 @@
}
ByteBuffer getBuffer(final int offset) {
- return nb.duplicate().position(offset);
+ return (ByteBuffer)nb.duplicate().position(offset);
}
ByteBuffer getBuffer(final int offset, final int length) {
- return getBuffer(offset).limit(length);
+ return (ByteBuffer)getBuffer(offset).limit(length);
}
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat32Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat32Array.java Fri May 22 09:50:33 2015 +0200
@@ -81,7 +81,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Float32ArrayData.class, "setElem", void.class, int.class, double.class).methodHandle();
private Float32ArrayData(final FloatBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((FloatBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat64Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeFloat64Array.java Fri May 22 09:50:33 2015 +0200
@@ -81,7 +81,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Float64ArrayData.class, "setElem", void.class, int.class, double.class).methodHandle();
private Float64ArrayData(final DoubleBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((DoubleBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt16Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt16Array.java Fri May 22 09:50:33 2015 +0200
@@ -82,7 +82,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Int16ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
private Int16ArrayData(final ShortBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((ShortBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt32Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt32Array.java Fri May 22 09:50:33 2015 +0200
@@ -81,7 +81,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Int32ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
private Int32ArrayData(final IntBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((IntBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt8Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeInt8Array.java Fri May 22 09:50:33 2015 +0200
@@ -80,7 +80,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Int8ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
private Int8ArrayData(final ByteBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((ByteBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint16Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint16Array.java Fri May 22 09:50:33 2015 +0200
@@ -81,7 +81,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Uint16ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
private Uint16ArrayData(final CharBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((CharBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint32Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint32Array.java Fri May 22 09:50:33 2015 +0200
@@ -82,7 +82,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Uint32ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
private Uint32ArrayData(final IntBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((IntBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8Array.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8Array.java Fri May 22 09:50:33 2015 +0200
@@ -81,7 +81,7 @@
private static final MethodHandle SET_ELEM = specialCall(MethodHandles.lookup(), Uint8ArrayData.class, "setElem", void.class, int.class, int.class).methodHandle();
private Uint8ArrayData(final ByteBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((ByteBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeUint8ClampedArray.java Fri May 22 09:50:33 2015 +0200
@@ -85,7 +85,7 @@
private static final MethodHandle CLAMP_LONG = staticCall(MethodHandles.lookup(), Uint8ClampedArrayData.class, "clampLong", long.class, long.class).methodHandle();
private Uint8ClampedArrayData(final ByteBuffer nb, final int start, final int end) {
- super(nb.position(start).limit(end).slice(), end - start);
+ super(((ByteBuffer)nb.position(start).limit(end)).slice(), end - start);
}
@Override
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Fri May 22 09:50:33 2015 +0200
@@ -1239,6 +1239,10 @@
}
if (storedScript == null) {
+ if (env._dest_dir != null) {
+ source.dump(env._dest_dir);
+ }
+
functionNode = new Parser(env, source, errMan, strict, getLogger(Parser.class)).parse();
if (errMan.hasErrors()) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/ScriptEnvironment.java Fri May 22 09:50:33 2015 +0200
@@ -73,7 +73,7 @@
/** Generate line number table in class files */
public final boolean _debug_lines;
- /** Package to which generated class files are added */
+ /** Directory in which source files and generated class files are dumped */
public final String _dest_dir;
/** Display stack trace upon error, default is false */
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java Fri May 22 09:50:33 2015 +0200
@@ -28,9 +28,11 @@
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOError;
import java.io.IOException;
import java.io.InputStream;
+import java.io.PrintWriter;
import java.io.Reader;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
@@ -44,6 +46,7 @@
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Base64;
import java.util.Objects;
@@ -989,4 +992,39 @@
public DebugLogger getLogger() {
return initLogger(Context.getContextTrusted());
}
+
+ private File dumpFile(final String dir) {
+ final URL u = getURL();
+ final StringBuilder buf = new StringBuilder();
+ // make it unique by prefixing current date & time
+ buf.append(LocalDateTime.now().toString());
+ buf.append('_');
+ if (u != null) {
+ // make it a safe file name
+ buf.append(u.toString()
+ .replace('/', '_')
+ .replace('\\', '_'));
+ } else {
+ buf.append(getName());
+ }
+
+ return new File(dir, buf.toString());
+ }
+
+ void dump(final String dir) {
+ final File file = dumpFile(dir);
+ try (final FileOutputStream fos = new FileOutputStream(file)) {
+ final PrintWriter pw = new PrintWriter(fos);
+ pw.print(data.toString());
+ pw.flush();
+ } catch (final IOException ioExp) {
+ debug("Skipping source dump for " +
+ name +
+ ": " +
+ ECMAErrors.getMessage(
+ "io.error.cant.write",
+ dir.toString() +
+ " : " + ioExp.toString()));
+ }
+ }
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Messages.properties Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Messages.properties Fri May 22 09:50:33 2015 +0200
@@ -121,7 +121,7 @@
type.error.cannot.get.default.number=Cannot get default number value
type.error.cant.apply.with.to.null=Cannot apply "with" to null
type.error.cant.apply.with.to.undefined=Cannot apply "with" to undefined
-type.error.cant.apply.with.to.non.scriptobject=Cannot apply "with" to non script object
+type.error.cant.apply.with.to.non.scriptobject=Cannot apply "with" to non script object. Consider using "with(Object.bindProperties('{'}, nonScriptObject))".
type.error.in.with.non.object=Right hand side of "in" cannot be non-Object, found {0}
type.error.prototype.not.an.object="prototype" of {0} is not an Object, it is {1}
type.error.cant.load.script=Cannot load script from {0}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Options.properties Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/Options.properties Fri May 22 09:50:33 2015 +0200
@@ -114,7 +114,7 @@
short_name="-d", \
is_undocumented=true, \
params="<path>", \
- desc="specify a destination directory to dump class files.", \
+ desc="specify a destination directory to dump source and class files.", \
type=String \
}
--- a/nashorn/test/script/basic/8024180/with_java_object.js.EXPECTED Thu May 21 18:23:01 2015 +0300
+++ b/nashorn/test/script/basic/8024180/with_java_object.js.EXPECTED Fri May 22 09:50:33 2015 +0200
@@ -1,1 +1,1 @@
-TypeError: Cannot apply "with" to non script object
+TypeError: Cannot apply "with" to non script object. Consider using "with(Object.bindProperties({}, nonScriptObject))".
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8080182.js Fri May 22 09:50:33 2015 +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.
+ */
+
+/**
+ * JDK-8080182: Array.prototype.sort throws IAE on inconsistent comparison
+ *
+ * @test
+ * @run
+ */
+
+function Random() {
+ this.toString = function() {
+ return (Math.random() * 100).toString();
+ }
+}
+
+for (var i = 0; i < 100; ++i) {
+ var arr = [];
+
+ for (var j = 0; j < 64; ++j) {
+ arr[j] = new Random();
+ }
+
+ // no IllegalArgumentException expected!
+ arr.sort();
+}