提交 67166499 编写于 作者: L lana

Merge

...@@ -75,7 +75,6 @@ import_product -- copy in the product components \n\ ...@@ -75,7 +75,6 @@ import_product -- copy in the product components \n\
import_fastdebug -- copy in the fastdebug components \n\ import_fastdebug -- copy in the fastdebug components \n\
import_debug -- copy in the debug components \n\ import_debug -- copy in the debug components \n\
modules -- build the jdk and jre module images (experimental) \n\ modules -- build the jdk and jre module images (experimental) \n\
sccs_get -- make sure all SCCS files are up-to-date (need SCCS) \n\
create_links -- create softlinks in Solaris 32bit build to 64bit dirs \n\ create_links -- create softlinks in Solaris 32bit build to 64bit dirs \n\
" "
...@@ -278,21 +277,6 @@ include $(BUILDDIR)/common/Sanity.gmk ...@@ -278,21 +277,6 @@ include $(BUILDDIR)/common/Sanity.gmk
$(OUTPUTDIR) $(TEMPDIR): $(OUTPUTDIR) $(TEMPDIR):
$(MKDIR) -p $@ $(MKDIR) -p $@
# cleanup everything. If the workspace is not being built by the control
# workspace, and if it is a Teamware workspace, then see if there are
# any files which are not under SCCS control.
clean clobber::
ifndef EXTERNALSANITYCONTROL
@if [ -d $(TOPDIR)/Codemgr_wsdata ]; then \
$(ECHO) '\nPerforming workspace scan for remnant files.\n' \
' Any files listed below are not under SCCS control in the workspace\n' \
' and you should review them and possibly remove them manually:' ; \
$(FIND) $(TOPDIR)/make $(TOPDIR)/src -type f | \
$(SED) 's+SCCS/[ps]\.++' | $(SORT) | $(UNIQ) -c | $(NAWK) '$$1<2 {print $$2;}' ; \
$(ECHO) 'End of workspace scan.' ; \
fi
endif
# this should be the last rule in this file: # this should be the last rule in this file:
all:: all::
@if [ -r $(WARNING_FILE) ]; then \ @if [ -r $(WARNING_FILE) ]; then \
...@@ -341,16 +325,70 @@ endif ...@@ -341,16 +325,70 @@ endif
include $(BUILDDIR)/common/internal/BinaryPlugs.gmk include $(BUILDDIR)/common/internal/BinaryPlugs.gmk
# #
# Get top level sccs_get rule # Test rule
# #
include $(BUILDDIR)/common/Rules-SCCS.gmk
.NOTPARALLEL: test_run
test:
$(MAKE) test_run
test_run: test_clean test_start test_summary
test_start:
@$(ECHO) "Tests started at `$(DATE)`"
test_clean:
$(RM) $(OUTPUTDIR)/test_failures.txt $(OUTPUTDIR)/test_log.txt
test_summary: $(OUTPUTDIR)/test_failures.txt
@$(ECHO) "#################################################"
@$(ECHO) "Tests completed at `$(DATE)`"
@( $(EGREP) '^TEST STATS:' $(OUTPUTDIR)/test_log.txt \
|| $(ECHO) "No TEST STATS seen in log" )
@$(ECHO) "For complete details see: $(OUTPUTDIR)/test_log.txt"
@$(ECHO) "#################################################"
@if [ -s $< ] ; then \
$(ECHO) "ERROR: Test failure count: `$(CAT) $< | $(WC) -l`"; \
$(CAT) $<; \
exit 1; \
else \
$(ECHO) "Success! No failures detected"; \
fi
# Get failure list from log
$(OUTPUTDIR)/test_failures.txt: $(OUTPUTDIR)/test_log.txt
@$(RM) $@
@( $(EGREP) '^FAILED:' $< || $(ECHO) "" ) | $(NAWK) 'length>0' > $@
# Get log file of all tests run
JDK_TO_TEST := $(shell \
if [ -d "$(ABS_OUTPUTDIR)/j2sdk-image" ] ; then \
$(ECHO) "$(ABS_OUTPUTDIR)/j2sdk-image"; \
elif [ -d "$(ABS_OUTPUTDIR)/bin" ] ; then \
$(ECHO) "$(ABS_OUTPUTDIR)"; \
elif [ "$(PRODUCT_HOME)" != "" -a -d "$(PRODUCT_HOME)/bin" ] ; then \
$(ECHO) "$(PRODUCT_HOME)"; \
fi \
)
TEST_TARGETS=jdk_all
$(OUTPUTDIR)/test_log.txt:
$(RM) $@
( $(CD) ../test && \
$(MAKE) NO_STOPPING=- PRODUCT_HOME=$(JDK_TO_TEST) $(TEST_TARGETS) \
) | tee $@
#
# JPRT rules # JPRT rules
#
include jprt.gmk include jprt.gmk
# #
# Phonies to avoid accidents. # Phonies to avoid accidents.
# #
.PHONY: all build clean clobber optimized debug fastdebug create_links \ .PHONY: all build clean clobber optimized debug fastdebug create_links \
import import_product import_fastdebug import_debug import import_product import_fastdebug import_debug \
test test_run test_start test_clean test_summary
...@@ -76,7 +76,7 @@ cscope.out: cscope.files FRC ...@@ -76,7 +76,7 @@ cscope.out: cscope.files FRC
# What files should we include? A simple rule might be just those files under # What files should we include? A simple rule might be just those files under
# SCM control, however this would miss files we create like the opcodes and # SCM control, however this would miss files we create like the opcodes and
# CClassHeaders. The following attempts to find everything that is *useful*. # CClassHeaders. The following attempts to find everything that is *useful*.
# (.del files are created by sccsrm, demo directories contain many .java files # (demo directories contain many .java files
# that probably aren't useful for development, and the pkgarchive may contain # that probably aren't useful for development, and the pkgarchive may contain
# duplicates of files within the source hierarchy). The ordering of the .raw # duplicates of files within the source hierarchy). The ordering of the .raw
# file is an attempt to make cscope display the most relevant files first. # file is an attempt to make cscope display the most relevant files first.
......
...@@ -334,7 +334,7 @@ DOCSDIR = $(OUTPUTDIR)/docs$(DOCSDIRSUFFIX) ...@@ -334,7 +334,7 @@ DOCSDIR = $(OUTPUTDIR)/docs$(DOCSDIRSUFFIX)
DOCSDIRSUFFIX = DOCSDIRSUFFIX =
# The MESSAGE, WARNING and ERROR files are used to store sanityck and # The MESSAGE, WARNING and ERROR files are used to store sanityck and
# SCCS check messages, warnings and errors. # warnings and errors.
ifndef ERROR_FILE ifndef ERROR_FILE
ERROR_FILE = $(OUTPUTDIR)/sanityCheckErrors.txt ERROR_FILE = $(OUTPUTDIR)/sanityCheckErrors.txt
endif endif
...@@ -634,38 +634,6 @@ LINTFLAGS = $(LINTFLAGS_$(VARIANT)) $(LINTFLAGS_COMMON) \ ...@@ -634,38 +634,6 @@ LINTFLAGS = $(LINTFLAGS_$(VARIANT)) $(LINTFLAGS_COMMON) \
VERSION_DEFINES = -DRELEASE='"$(RELEASE)"' VERSION_DEFINES = -DRELEASE='"$(RELEASE)"'
# Note: As a rule, GNU Make rules should not appear in any of the
# Defs*.gmk files. These were added for Kestrel-Solaris and do address
# a TeamWare bug. They should be moved elsewhere for Merlin.
#
# Override gnumake built-in rules which do sccs get operations badly.
# (They put the checked out code in the current directory, not in the
# directory of the original file.)
# Since this is a symptom of a teamware failure, complain and die on the spot.
# This message immediately goes to stdout and the build terminates.
define SCCS-trouble
$(error \
"ERROR: File $@ referenced while building in $(CURRENT_DIRECTORY) \
is out of date with respect to its SCCS file $<. \
This can happen from an unresolved Teamware conflict, a file movement, or \
a failure in which SCCS files are updated but the 'sccs get' was not done. \
You should double check for other out of date files in your workspace. \
Or run: cd $(TOPDIR) && $(MAKE) sccs_get")
endef
%:: s.%
@$(SCCS-trouble)
%:: SCCS/s.%
@$(SCCS-trouble)
@$(ECHO) " is out of date with respect to its SCCS file." >> $(WARNING_FILE)
@$(ECHO) " This file may be from an unresolved Teamware conflict." >> $(WARNING_FILE)
@$(ECHO) " This is also a symptom of a Teamware bringover/putback failure" >> $(WARNING_FILE)
@$(ECHO) " in which SCCS files are updated but not checked out." >> $(WARNING_FILE)
@$(ECHO) " Check for other out of date files in your workspace." >> $(WARNING_FILE)
@$(ECHO) "" >> $(WARNING_FILE)
@#exit 666
ifdef INSANE ifdef INSANE
export INSANE export INSANE
endif endif
......
#
# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute 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.
#
#
# Only get these rules if SCCS is available
#
ifdef SCCS
# SCCS command to extract out latest source
SCCS_GET=$(SCCS) get -s
#
# Make sure all files in workspace are fresh
#
TEMP_ALL_FILES=$(JDK_TOPDIR)/temp_filelist
$(TEMP_ALL_FILES): $(JDK_TOPDIR)/Codemgr_wsdata/nametable
$(prep-target)
@$(CUT) -d' ' -f1 $< \
| $(GREP) -v '^VERSION' \
| $(GREP) -v '^deleted_files' \
| $(GREP) -v '^Codemgr_wsdata' > $@
sccs_get: $(TEMP_ALL_FILES)
@$(PRINTF) "Workspace has %d files\n" `$(CAT) $< | $(WC) -l`
@count=0; \
for i in `$(CAT) $<` ; do \
f=$(JDK_TOPDIR)/$$i; \
count=`$(EXPR) $$count '+' 1`; \
if [ `$(EXPR) $$count '%' 100` = 0 ] ; then \
$(PRINTF) "\rChecked $$count files"; \
fi; \
if [ ! -f $$f ] ; then \
$(PRINTF) "\r$(SCCS_GET) $$f\n"; \
(cd `$(DIRNAME) $$f` && $(SCCS_GET) `$(BASENAME) $$f`); \
elif /usr/bin/test $$f -ot `$(DIRNAME) $$f`/SCCS/s.`$(BASENAME) $$f` ; then \
$(PRINTF) "\r$(SCCS_GET) $$f\n"; \
(cd `$(DIRNAME) $$f` && $(SCCS_GET) `$(BASENAME) $$f`); \
fi; \
done; \
$(PRINTF) "\rChecked $$count files\n"
#
# Phonies to avoid accidents.
#
.PHONY: sccs_get
endif
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
# UTILS_COMMAND_PATH # UTILS_COMMAND_PATH
# /usr/bin/ # /usr/bin/
# UTILS_USR_BIN_PATH # UTILS_USR_BIN_PATH
# /usr/ccs/bin/ (sccs, m4, lex, yacc, as, ar, strip, mcs) # /usr/ccs/bin/ (m4, lex, yacc, as, ar, strip, mcs)
# UTILS_CCS_BIN_PATH # UTILS_CCS_BIN_PATH
# Dev Tools: zip, unzip, etc that we may have special versions of # Dev Tools: zip, unzip, etc that we may have special versions of
# UTILS_DEVTOOL_PATH # UTILS_DEVTOOL_PATH
...@@ -117,7 +117,6 @@ RC = $(UTILS_COMMAND_PATH)rc ...@@ -117,7 +117,6 @@ RC = $(UTILS_COMMAND_PATH)rc
RMDIR = $(UTILS_COMMAND_PATH)rmdir RMDIR = $(UTILS_COMMAND_PATH)rmdir
RPM = $(UTILS_COMMAND_PATH)rpm RPM = $(UTILS_COMMAND_PATH)rpm
RPMBUILD = $(UTILS_COMMAND_PATH)rpmbuild RPMBUILD = $(UTILS_COMMAND_PATH)rpmbuild
SCCS = $(UTILS_CCS_BIN_PATH)sccs
SED = $(UTILS_COMMAND_PATH)sed SED = $(UTILS_COMMAND_PATH)sed
SH = $(UTILS_COMMAND_PATH)sh SH = $(UTILS_COMMAND_PATH)sh
SHOWREV = $(UTILS_USR_BIN_PATH)showrev SHOWREV = $(UTILS_USR_BIN_PATH)showrev
...@@ -183,7 +182,7 @@ ifeq ($(PLATFORM),linux) ...@@ -183,7 +182,7 @@ ifeq ($(PLATFORM),linux)
NAWK = $(USRBIN_PATH)gawk NAWK = $(USRBIN_PATH)gawk
# Intrinsic unix command, with backslash-escaped character interpretation # Intrinsic unix command, with backslash-escaped character interpretation
ECHO = /bin/echo -e ECHO = /bin/echo -e
# These are really in UTILS_USR_BIN_PATH on Linux (only sccs is not) # These are really in UTILS_USR_BIN_PATH on Linux
AR = $(UTILS_USR_BIN_PATH)ar AR = $(UTILS_USR_BIN_PATH)ar
AS = $(UTILS_USR_BIN_PATH)as AS = $(UTILS_USR_BIN_PATH)as
LD = $(UTILS_USR_BIN_PATH)ld LD = $(UTILS_USR_BIN_PATH)ld
......
...@@ -219,7 +219,7 @@ else ...@@ -219,7 +219,7 @@ else
PRODUCT_NAME = Java(TM) PRODUCT_NAME = Java(TM)
PRODUCT_SUFFIX = SE Runtime Environment PRODUCT_SUFFIX = SE Runtime Environment
JDK_RC_PLATFORM_NAME = Platform SE JDK_RC_PLATFORM_NAME = Platform SE
COMPANY_NAME = Oracle COMPANY_NAME = Oracle Corporation
endif endif
RUNTIME_NAME = $(PRODUCT_NAME) $(PRODUCT_SUFFIX) RUNTIME_NAME = $(PRODUCT_NAME) $(PRODUCT_SUFFIX)
......
...@@ -284,6 +284,7 @@ JAVA_JAVA_java = \ ...@@ -284,6 +284,7 @@ JAVA_JAVA_java = \
java/util/concurrent/CancellationException.java \ java/util/concurrent/CancellationException.java \
java/util/concurrent/CompletionService.java \ java/util/concurrent/CompletionService.java \
java/util/concurrent/ConcurrentHashMap.java \ java/util/concurrent/ConcurrentHashMap.java \
java/util/concurrent/ConcurrentLinkedDeque.java \
java/util/concurrent/ConcurrentLinkedQueue.java \ java/util/concurrent/ConcurrentLinkedQueue.java \
java/util/concurrent/ConcurrentMap.java \ java/util/concurrent/ConcurrentMap.java \
java/util/concurrent/ConcurrentNavigableMap.java \ java/util/concurrent/ConcurrentNavigableMap.java \
......
...@@ -25,43 +25,265 @@ ...@@ -25,43 +25,265 @@
# Properties for jprt # Properties for jprt
# Use whatever release that the submitted job requests # At submit time, the release supplied will be in jprt.submit.release
# and will be one of the official release names defined in jprt.
# jprt supports property value expansion using ${property.name} syntax.
# This tells jprt what default release we want to build
jprt.tools.default.release=${jprt.submit.release} jprt.tools.default.release=${jprt.submit.release}
# The different build flavors we want, we override here so we just get these 2 # The different build flavors we want, we override here so we just get these 2
jprt.build.flavors=product,fastdebug jprt.build.flavors=product,fastdebug
# Standard test target for everybody # Define the Windows we want (temporary)
jprt.test.targets=*-*-*-jvm98 jprt.my.windows.i586.jdk7b107=windows_i586_5.0
jprt.my.windows.i586.jdk7temp=windows_i586_5.0
jprt.my.windows.i586.jdk7=windows_i586_5.1
jprt.my.windows.i586=${jprt.my.windows.i586.${jprt.tools.default.release}}
# Standard list of jprt build targets for this source tree
jprt.build.targets= \
solaris_sparc_5.10-{product|fastdebug}, \
solaris_sparcv9_5.10-{product|fastdebug}, \
solaris_i586_5.10-{product|fastdebug}, \
solaris_x64_5.10-{product|fastdebug}, \
linux_i586_2.6-{product|fastdebug}, \
linux_x64_2.6-{product|fastdebug}, \
${jprt.my.windows.i586}-{product|fastdebug}, \
windows_x64_5.2-{product|fastdebug}
# Standard vm test target
jprt.test.targets= \
solaris_sparc_5.10-product-c1-jvm98, \
solaris_sparcv9_5.10-product-c2-jvm98, \
solaris_i586_5.10-product-c1-jvm98, \
solaris_x64_5.10-product-c2-jvm98, \
linux_i586_2.6-product-{c1|c2}-jvm98, \
linux_x64_2.6-product-c2-jvm98, \
${jprt.my.windows.i586}-product-c1-jvm98, \
windows_x64_5.2-product-c2-jvm98
# User can select the test set with jprt submit "-testset name" option
jprt.my.test.set=${jprt.test.set}
# Default jdk test targets in test/Makefile (no fastdebug & limited c2)
jprt.make.rule.default.test.targets= \
\
solaris_sparc_5.10-product-c1-jdk_beans1, \
solaris_sparcv9_5.10-product-c2-jdk_beans1, \
solaris_i586_5.10-product-c1-jdk_beans1, \
solaris_x64_5.10-product-c2-jdk_beans1, \
linux_i586_2.6-product-{c1|c2}-jdk_beans1, \
linux_x64_2.6-product-c2-jdk_beans1, \
${jprt.my.windows.i586}-product-c1-jdk_beans1, \
windows_x64_5.2-product-c2-jdk_beans1, \
\
solaris_sparc_5.10-product-c1-jdk_io, \
solaris_sparcv9_5.10-product-c2-jdk_io, \
solaris_i586_5.10-product-c1-jdk_io, \
solaris_x64_5.10-product-c2-jdk_io, \
linux_i586_2.6-product-{c1|c2}-jdk_io, \
linux_x64_2.6-product-c2-jdk_io, \
${jprt.my.windows.i586}-product-c1-jdk_io, \
windows_x64_5.2-product-c2-jdk_io, \
\
solaris_sparc_5.10-product-c1-jdk_lang, \
solaris_sparcv9_5.10-product-c2-jdk_lang, \
solaris_i586_5.10-product-c1-jdk_lang, \
solaris_x64_5.10-product-c2-jdk_lang, \
linux_i586_2.6-product-{c1|c2}-jdk_lang, \
linux_x64_2.6-product-c2-jdk_lang, \
${jprt.my.windows.i586}-product-c1-jdk_lang, \
windows_x64_5.2-product-c2-jdk_lang, \
\
solaris_sparc_5.10-product-c1-jdk_math, \
solaris_sparcv9_5.10-product-c2-jdk_math, \
solaris_i586_5.10-product-c1-jdk_math, \
solaris_x64_5.10-product-c2-jdk_math, \
linux_i586_2.6-product-{c1|c2}-jdk_math, \
linux_x64_2.6-product-c2-jdk_math, \
${jprt.my.windows.i586}-product-c1-jdk_math, \
windows_x64_5.2-product-c2-jdk_math, \
\
solaris_sparc_5.10-product-c1-jdk_misc, \
solaris_sparcv9_5.10-product-c2-jdk_misc, \
solaris_i586_5.10-product-c1-jdk_misc, \
solaris_x64_5.10-product-c2-jdk_misc, \
linux_i586_2.6-product-{c1|c2}-jdk_misc, \
linux_x64_2.6-product-c2-jdk_misc, \
${jprt.my.windows.i586}-product-c1-jdk_misc, \
windows_x64_5.2-product-c2-jdk_misc, \
\
solaris_sparc_5.10-product-c1-jdk_net, \
solaris_sparcv9_5.10-product-c2-jdk_net, \
solaris_i586_5.10-product-c1-jdk_net, \
solaris_x64_5.10-product-c2-jdk_net, \
linux_i586_2.6-product-{c1|c2}-jdk_net, \
linux_x64_2.6-product-c2-jdk_net, \
${jprt.my.windows.i586}-product-c1-jdk_net, \
windows_x64_5.2-product-c2-jdk_net, \
\
solaris_sparc_5.10-product-c1-jdk_nio1, \
solaris_sparcv9_5.10-product-c2-jdk_nio1, \
solaris_i586_5.10-product-c1-jdk_nio1, \
solaris_x64_5.10-product-c2-jdk_nio1, \
linux_i586_2.6-product-{c1|c2}-jdk_nio1, \
linux_x64_2.6-product-c2-jdk_nio1, \
${jprt.my.windows.i586}-product-c1-jdk_nio1, \
windows_x64_5.2-product-c2-jdk_nio1, \
\
solaris_sparc_5.10-product-c1-jdk_nio2, \
solaris_sparcv9_5.10-product-c2-jdk_nio2, \
solaris_i586_5.10-product-c1-jdk_nio2, \
solaris_x64_5.10-product-c2-jdk_nio2, \
linux_i586_2.6-product-{c1|c2}-jdk_nio2, \
linux_x64_2.6-product-c2-jdk_nio2, \
${jprt.my.windows.i586}-product-c1-jdk_nio2, \
windows_x64_5.2-product-c2-jdk_nio2, \
\
solaris_sparc_5.10-product-c1-jdk_nio3, \
solaris_sparcv9_5.10-product-c2-jdk_nio3, \
solaris_i586_5.10-product-c1-jdk_nio3, \
solaris_x64_5.10-product-c2-jdk_nio3, \
linux_i586_2.6-product-{c1|c2}-jdk_nio3, \
linux_x64_2.6-product-c2-jdk_nio3, \
${jprt.my.windows.i586}-product-c1-jdk_nio3, \
windows_x64_5.2-product-c2-jdk_nio3, \
\
solaris_sparc_5.10-product-c1-jdk_security1, \
solaris_sparcv9_5.10-product-c2-jdk_security1, \
solaris_i586_5.10-product-c1-jdk_security1, \
solaris_x64_5.10-product-c2-jdk_security1, \
linux_i586_2.6-product-{c1|c2}-jdk_security1, \
linux_x64_2.6-product-c2-jdk_security1, \
${jprt.my.windows.i586}-product-c1-jdk_security1, \
windows_x64_5.2-product-c2-jdk_security1, \
\
solaris_sparc_5.10-product-c1-jdk_text, \
solaris_sparcv9_5.10-product-c2-jdk_text, \
solaris_i586_5.10-product-c1-jdk_text, \
solaris_x64_5.10-product-c2-jdk_text, \
linux_i586_2.6-product-{c1|c2}-jdk_text, \
linux_x64_2.6-product-c2-jdk_text, \
${jprt.my.windows.i586}-product-c1-jdk_text, \
windows_x64_5.2-product-c2-jdk_text, \
\
solaris_sparc_5.10-product-c1-jdk_tools1, \
solaris_sparcv9_5.10-product-c2-jdk_tools1, \
solaris_i586_5.10-product-c1-jdk_tools1, \
solaris_x64_5.10-product-c2-jdk_tools1, \
linux_i586_2.6-product-{c1|c2}-jdk_tools1, \
linux_x64_2.6-product-c2-jdk_tools1, \
${jprt.my.windows.i586}-product-c1-jdk_tools1, \
windows_x64_5.2-product-c2-jdk_tools1, \
\
solaris_sparc_5.10-product-c1-jdk_util, \
solaris_sparcv9_5.10-product-c2-jdk_util, \
solaris_i586_5.10-product-c1-jdk_util, \
solaris_x64_5.10-product-c2-jdk_util, \
linux_i586_2.6-product-{c1|c2}-jdk_util, \
linux_x64_2.6-product-c2-jdk_util, \
${jprt.my.windows.i586}-product-c1-jdk_util, \
windows_x64_5.2-product-c2-jdk_util
# Test targets in test/Makefile (some longer running tests only test c2) # All jdk test targets in test/Makefile (still no fastdebug & limited c2)
jprt.make.rule.test.targets= \ jprt.make.rule.all.test.targets= \
*-product-*-jdk_beans1, \ \
*-product-*-jdk_beans2, \ ${jprt.make.rule.default.test.targets}, \
*-product-*-jdk_beans3, \ \
*-product-*-jdk_io, \ solaris_sparc_5.10-product-c1-jdk_awt, \
*-product-*-jdk_lang, \ solaris_sparcv9_5.10-product-c2-jdk_awt, \
*-product-*-jdk_management1, \ solaris_i586_5.10-product-c1-jdk_awt, \
*-product-*-jdk_management2, \ solaris_x64_5.10-product-c2-jdk_awt, \
*-product-*-jdk_math, \ linux_i586_2.6-product-{c1|c2}-jdk_awt, \
*-product-*-jdk_misc, \ linux_x64_2.6-product-c2-jdk_awt, \
*-product-*-jdk_net, \ ${jprt.my.windows.i586}-product-c1-jdk_awt, \
*-product-*-jdk_nio1, \ windows_x64_5.2-product-c2-jdk_awt, \
*-product-*-jdk_nio2, \ \
*-product-*-jdk_nio3, \ solaris_sparc_5.10-product-c1-jdk_beans2, \
*-product-*-jdk_security1, \ solaris_sparcv9_5.10-product-c2-jdk_beans2, \
*-product-*-jdk_security2, \ solaris_i586_5.10-product-c1-jdk_beans2, \
*-product-*-jdk_security3, \ solaris_x64_5.10-product-c2-jdk_beans2, \
*-product-*-jdk_text, \ linux_i586_2.6-product-{c1|c2}-jdk_beans2, \
*-product-*-jdk_tools1, \ linux_x64_2.6-product-c2-jdk_beans2, \
*-product-*-jdk_tools2, \ ${jprt.my.windows.i586}-product-c1-jdk_beans2, \
*-product-*-jdk_util windows_x64_5.2-product-c2-jdk_beans2, \
\
solaris_sparc_5.10-product-c1-jdk_beans3, \
solaris_sparcv9_5.10-product-c2-jdk_beans3, \
solaris_i586_5.10-product-c1-jdk_beans3, \
solaris_x64_5.10-product-c2-jdk_beans3, \
linux_i586_2.6-product-{c1|c2}-jdk_beans3, \
linux_x64_2.6-product-c2-jdk_beans3, \
${jprt.my.windows.i586}-product-c1-jdk_beans3, \
windows_x64_5.2-product-c2-jdk_beans3, \
\
solaris_sparc_5.10-product-c1-jdk_management1, \
solaris_sparcv9_5.10-product-c2-jdk_management1, \
solaris_i586_5.10-product-c1-jdk_management1, \
solaris_x64_5.10-product-c2-jdk_management1, \
linux_i586_2.6-product-{c1|c2}-jdk_management1, \
linux_x64_2.6-product-c2-jdk_management1, \
${jprt.my.windows.i586}-product-c1-jdk_management1, \
windows_x64_5.2-product-c2-jdk_management1, \
\
solaris_sparc_5.10-product-c1-jdk_management2, \
solaris_sparcv9_5.10-product-c2-jdk_management2, \
solaris_i586_5.10-product-c1-jdk_management2, \
solaris_x64_5.10-product-c2-jdk_management2, \
linux_i586_2.6-product-{c1|c2}-jdk_management2, \
linux_x64_2.6-product-c2-jdk_management2, \
${jprt.my.windows.i586}-product-c1-jdk_management2, \
windows_x64_5.2-product-c2-jdk_management2, \
\
solaris_sparc_5.10-product-c1-jdk_rmi, \
solaris_sparcv9_5.10-product-c2-jdk_rmi, \
solaris_i586_5.10-product-c1-jdk_rmi, \
solaris_x64_5.10-product-c2-jdk_rmi, \
linux_i586_2.6-product-{c1|c2}-jdk_rmi, \
linux_x64_2.6-product-c2-jdk_rmi, \
${jprt.my.windows.i586}-product-c1-jdk_rmi, \
windows_x64_5.2-product-c2-jdk_rmi, \
\
solaris_sparc_5.10-product-c1-jdk_security2, \
solaris_sparcv9_5.10-product-c2-jdk_security2, \
solaris_i586_5.10-product-c1-jdk_security2, \
solaris_x64_5.10-product-c2-jdk_security2, \
linux_i586_2.6-product-{c1|c2}-jdk_security2, \
linux_x64_2.6-product-c2-jdk_security2, \
${jprt.my.windows.i586}-product-c1-jdk_security2, \
windows_x64_5.2-product-c2-jdk_security2, \
\
solaris_sparc_5.10-product-c1-jdk_security3, \
solaris_sparcv9_5.10-product-c2-jdk_security3, \
solaris_i586_5.10-product-c1-jdk_security3, \
solaris_x64_5.10-product-c2-jdk_security3, \
linux_i586_2.6-product-{c1|c2}-jdk_security3, \
linux_x64_2.6-product-c2-jdk_security3, \
${jprt.my.windows.i586}-product-c1-jdk_security3, \
windows_x64_5.2-product-c2-jdk_security3, \
\
solaris_sparc_5.10-product-c1-jdk_swing, \
solaris_sparcv9_5.10-product-c2-jdk_swing, \
solaris_i586_5.10-product-c1-jdk_swing, \
solaris_x64_5.10-product-c2-jdk_swing, \
linux_i586_2.6-product-{c1|c2}-jdk_swing, \
linux_x64_2.6-product-c2-jdk_swing, \
${jprt.my.windows.i586}-product-c1-jdk_swing, \
windows_x64_5.2-product-c2-jdk_swing, \
\
solaris_sparc_5.10-product-c1-jdk_tools2, \
solaris_sparcv9_5.10-product-c2-jdk_tools2, \
solaris_i586_5.10-product-c1-jdk_tools2, \
solaris_x64_5.10-product-c2-jdk_tools2, \
linux_i586_2.6-product-{c1|c2}-jdk_tools2, \
linux_x64_2.6-product-c2-jdk_tools2, \
${jprt.my.windows.i586}-product-c1-jdk_tools2, \
windows_x64_5.2-product-c2-jdk_tools2
# Some of these are crashing Xvfb or windows manager, need dedicated DISPLAY per test batch # Select list to use (allow for testset to be empty too)
jprt2.make.rule.test.targets= \ jprt.make.rule..test.targets=${jprt.make.rule.default.test.targets}
*-product-*-jdk_awt, \ jprt.make.rule.test.targets=${jprt.make.rule.${jprt.my.test.set}.test.targets}
*-product-*-jdk_rmi, \
*-product-*-jdk_swing, \
# Directories to be excluded from the source bundles # Directories to be excluded from the source bundles
jprt.bundle.exclude.src.dirs=build dist webrev jprt.bundle.exclude.src.dirs=build dist webrev
......
...@@ -525,7 +525,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -525,7 +525,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
iMatchColumns = new Vector(10); iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) { for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1)); iMatchColumns.add(i,Integer.valueOf(-1));
} }
strMatchColumns = new Vector(10); strMatchColumns = new Vector(10);
...@@ -889,7 +889,12 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -889,7 +889,12 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
success = false; success = false;
} else { } else {
tWriter = (TransactionalWriter)rowSetWriter; tWriter = (TransactionalWriter)rowSetWriter;
((CachedRowSetWriter)tWriter).commit(this, updateOnInsert); if (tWriter instanceof CachedRowSetWriter) {
((CachedRowSetWriter)tWriter).commit(this, updateOnInsert);
} else {
tWriter.commit();
}
success = true; success = true;
} }
} }
...@@ -1294,7 +1299,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -1294,7 +1299,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
tMap = new TreeMap(); tMap = new TreeMap();
for (int i = 0; i<numRows; i++) { for (int i = 0; i<numRows; i++) {
tMap.put(new Integer(i), rvh.get(i)); tMap.put(Integer.valueOf(i), rvh.get(i));
} }
return (tMap.values()); return (tMap.values());
...@@ -1806,7 +1811,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -1806,7 +1811,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
return (byte)0; return (byte)0;
} }
try { try {
return ((new Byte(value.toString())).byteValue()); return ((Byte.valueOf(value.toString())).byteValue());
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.bytefail").toString(), throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.bytefail").toString(),
new Object[] {value.toString().trim(), columnIndex})); new Object[] {value.toString().trim(), columnIndex}));
...@@ -1850,7 +1855,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -1850,7 +1855,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
} }
try { try {
return ((new Short(value.toString().trim())).shortValue()); return ((Short.valueOf(value.toString().trim())).shortValue());
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.shortfail").toString(), throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.shortfail").toString(),
new Object[] {value.toString().trim(), columnIndex})); new Object[] {value.toString().trim(), columnIndex}));
...@@ -1893,7 +1898,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -1893,7 +1898,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
} }
try { try {
return ((new Integer(value.toString().trim())).intValue()); return ((Integer.valueOf(value.toString().trim())).intValue());
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.intfail").toString(), throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.intfail").toString(),
new Object[] {value.toString().trim(), columnIndex})); new Object[] {value.toString().trim(), columnIndex}));
...@@ -1936,7 +1941,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -1936,7 +1941,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
return (long)0; return (long)0;
} }
try { try {
return ((new Long(value.toString().trim())).longValue()); return ((Long.valueOf(value.toString().trim())).longValue());
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.longfail").toString(), throw new SQLException(MessageFormat.format(resBundle.handleGetObject("cachedrowsetimpl.longfail").toString(),
new Object[] {value.toString().trim(), columnIndex})); new Object[] {value.toString().trim(), columnIndex}));
...@@ -4014,18 +4019,18 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4014,18 +4019,18 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
try { try {
switch (trgType) { switch (trgType) {
case java.sql.Types.BIT: case java.sql.Types.BIT:
Integer i = new Integer(srcObj.toString().trim()); Integer i = Integer.valueOf(srcObj.toString().trim());
return i.equals(new Integer((int)0)) ? return i.equals(Integer.valueOf((int)0)) ?
new Boolean(false) : Boolean.valueOf(false) :
new Boolean(true); Boolean.valueOf(true);
case java.sql.Types.TINYINT: case java.sql.Types.TINYINT:
return new Byte(srcObj.toString().trim()); return Byte.valueOf(srcObj.toString().trim());
case java.sql.Types.SMALLINT: case java.sql.Types.SMALLINT:
return new Short(srcObj.toString().trim()); return Short.valueOf(srcObj.toString().trim());
case java.sql.Types.INTEGER: case java.sql.Types.INTEGER:
return new Integer(srcObj.toString().trim()); return Integer.valueOf(srcObj.toString().trim());
case java.sql.Types.BIGINT: case java.sql.Types.BIGINT:
return new Long(srcObj.toString().trim()); return Long.valueOf(srcObj.toString().trim());
case java.sql.Types.NUMERIC: case java.sql.Types.NUMERIC:
case java.sql.Types.DECIMAL: case java.sql.Types.DECIMAL:
return new BigDecimal(srcObj.toString().trim()); return new BigDecimal(srcObj.toString().trim());
...@@ -4037,7 +4042,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4037,7 +4042,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
case java.sql.Types.CHAR: case java.sql.Types.CHAR:
case java.sql.Types.VARCHAR: case java.sql.Types.VARCHAR:
case java.sql.Types.LONGVARCHAR: case java.sql.Types.LONGVARCHAR:
return new String(srcObj.toString()); return srcObj.toString();
default: default:
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType);
} }
...@@ -4134,7 +4139,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4134,7 +4139,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
case java.sql.Types.CHAR: case java.sql.Types.CHAR:
case java.sql.Types.VARCHAR: case java.sql.Types.VARCHAR:
case java.sql.Types.LONGVARCHAR: case java.sql.Types.LONGVARCHAR:
return new String(srcObj.toString()); return srcObj.toString();
default: default:
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString());
} }
...@@ -4181,12 +4186,12 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4181,12 +4186,12 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
try { try {
switch (trgType) { switch (trgType) {
case java.sql.Types.BIT: case java.sql.Types.BIT:
Integer i = new Integer(srcObj.toString().trim()); Integer i = Integer.valueOf(srcObj.toString().trim());
return i.equals(new Integer((int)0)) ? return i.equals(Integer.valueOf((int)0)) ?
new Boolean(false) : Boolean.valueOf(false) :
new Boolean(true); Boolean.valueOf(true);
case java.sql.Types.BOOLEAN: case java.sql.Types.BOOLEAN:
return new Boolean(srcObj.toString().trim()); return Boolean.valueOf(srcObj.toString().trim());
default: default:
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.dtypemismt").toString()+ trgType);
} }
...@@ -4260,7 +4265,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4260,7 +4265,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
checkIndex(columnIndex); checkIndex(columnIndex);
// make sure the cursor is on a valid row // make sure the cursor is on a valid row
checkCursor(); checkCursor();
Object obj = convertBoolean(new Boolean(x), Object obj = convertBoolean(Boolean.valueOf(x),
java.sql.Types.BIT, java.sql.Types.BIT,
RowSetMD.getColumnType(columnIndex)); RowSetMD.getColumnType(columnIndex));
...@@ -4296,7 +4301,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4296,7 +4301,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
// make sure the cursor is on a valid row // make sure the cursor is on a valid row
checkCursor(); checkCursor();
Object obj = convertNumeric(new Byte(x), Object obj = convertNumeric(Byte.valueOf(x),
java.sql.Types.TINYINT, java.sql.Types.TINYINT,
RowSetMD.getColumnType(columnIndex)); RowSetMD.getColumnType(columnIndex));
...@@ -4332,7 +4337,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4332,7 +4337,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
// make sure the cursor is on a valid row // make sure the cursor is on a valid row
checkCursor(); checkCursor();
Object obj = convertNumeric(new Short(x), Object obj = convertNumeric(Short.valueOf(x),
java.sql.Types.SMALLINT, java.sql.Types.SMALLINT,
RowSetMD.getColumnType(columnIndex)); RowSetMD.getColumnType(columnIndex));
...@@ -4367,7 +4372,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4367,7 +4372,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
checkIndex(columnIndex); checkIndex(columnIndex);
// make sure the cursor is on a valid row // make sure the cursor is on a valid row
checkCursor(); checkCursor();
Object obj = convertNumeric(new Integer(x), Object obj = convertNumeric(Integer.valueOf(x),
java.sql.Types.INTEGER, java.sql.Types.INTEGER,
RowSetMD.getColumnType(columnIndex)); RowSetMD.getColumnType(columnIndex));
...@@ -4403,7 +4408,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -4403,7 +4408,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
// make sure the cursor is on a valid row // make sure the cursor is on a valid row
checkCursor(); checkCursor();
Object obj = convertNumeric(new Long(x), Object obj = convertNumeric(Long.valueOf(x),
java.sql.Types.BIGINT, java.sql.Types.BIGINT,
RowSetMD.getColumnType(columnIndex)); RowSetMD.getColumnType(columnIndex));
...@@ -6429,7 +6434,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -6429,7 +6434,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
if (tabName == null) if (tabName == null)
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.tablename").toString()); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.tablename").toString());
else else
tableName = new String(tabName); tableName = tabName;
} }
/** /**
...@@ -6940,7 +6945,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -6940,7 +6945,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
} }
for( int i = 0;i < columnIdxes.length ;i++) { for( int i = 0;i < columnIdxes.length ;i++) {
iMatchColumns.set(i,new Integer(-1)); iMatchColumns.set(i,Integer.valueOf(-1));
} }
} }
...@@ -7049,7 +7054,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -7049,7 +7054,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
} }
} }
for(int i = 0 ;i < columnIdxes.length; i++) { for(int i = 0 ;i < columnIdxes.length; i++) {
iMatchColumns.add(i,new Integer(columnIdxes[i])); iMatchColumns.add(i,Integer.valueOf(columnIdxes[i]));
} }
} }
...@@ -7104,7 +7109,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -7104,7 +7109,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols1").toString()); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols1").toString());
} else { } else {
// set iMatchColumn // set iMatchColumn
iMatchColumns.set(0, new Integer(columnIdx)); iMatchColumns.set(0, Integer.valueOf(columnIdx));
//strMatchColumn = null; //strMatchColumn = null;
} }
} }
...@@ -7126,7 +7131,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -7126,7 +7131,7 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
*/ */
public void setMatchColumn(String columnName) throws SQLException { public void setMatchColumn(String columnName) throws SQLException {
// validate, if col is ok to be set // validate, if col is ok to be set
if(columnName.equals(null) || ((columnName = columnName.trim()) == "" )) { if(columnName == null || (columnName= columnName.trim()).equals("") ) {
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols2").toString()); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.matchcols2").toString());
} else { } else {
// set strMatchColumn // set strMatchColumn
...@@ -7151,13 +7156,13 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern ...@@ -7151,13 +7156,13 @@ public class CachedRowSetImpl extends BaseRowSet implements RowSet, RowSetIntern
*/ */
public void unsetMatchColumn(int columnIdx) throws SQLException { public void unsetMatchColumn(int columnIdx) throws SQLException {
// check if we are unsetting the SAME column // check if we are unsetting the SAME column
if(! iMatchColumns.get(0).equals(new Integer(columnIdx) ) ) { if(! iMatchColumns.get(0).equals(Integer.valueOf(columnIdx) ) ) {
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch").toString()); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch").toString());
} else if(strMatchColumns.get(0) != null) { } else if(strMatchColumns.get(0) != null) {
throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch1").toString()); throw new SQLException(resBundle.handleGetObject("cachedrowsetimpl.unsetmatch1").toString());
} else { } else {
// that is, we are unsetting it. // that is, we are unsetting it.
iMatchColumns.set(0, new Integer(-1)); iMatchColumns.set(0, Integer.valueOf(-1));
} }
} }
......
...@@ -499,7 +499,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C ...@@ -499,7 +499,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) { if(onInsertRow) {
if(p != null) { if(p != null) {
bool = p.evaluate(new Integer(x),columnIndex); bool = p.evaluate(Integer.valueOf(x),columnIndex);
if(!bool) { if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString()); throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
...@@ -566,7 +566,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C ...@@ -566,7 +566,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) { if(onInsertRow) {
if(p != null) { if(p != null) {
bool = p.evaluate(new Boolean(x) , columnIndex); bool = p.evaluate(Boolean.valueOf(x) , columnIndex);
if(!bool) { if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString()); throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
...@@ -634,7 +634,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C ...@@ -634,7 +634,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) { if(onInsertRow) {
if(p != null) { if(p != null) {
bool = p.evaluate(new Byte(x),columnIndex); bool = p.evaluate(Byte.valueOf(x),columnIndex);
if(!bool) { if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString()); throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
...@@ -703,7 +703,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C ...@@ -703,7 +703,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) { if(onInsertRow) {
if(p != null) { if(p != null) {
bool = p.evaluate(new Short(x), columnIndex); bool = p.evaluate(Short.valueOf(x), columnIndex);
if(!bool) { if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString()); throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
...@@ -771,7 +771,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C ...@@ -771,7 +771,7 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
if(onInsertRow) { if(onInsertRow) {
if(p != null) { if(p != null) {
bool = p.evaluate(new Long(x), columnIndex); bool = p.evaluate(Long.valueOf(x), columnIndex);
if(!bool) { if(!bool) {
throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString()); throw new SQLException(resBundle.handleGetObject("filteredrowsetimpl.notallowed").toString());
...@@ -1106,12 +1106,12 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C ...@@ -1106,12 +1106,12 @@ public class FilteredRowSetImpl extends WebRowSetImpl implements Serializable, C
public void updateBytes(int columnIndex , byte []x) throws SQLException { public void updateBytes(int columnIndex , byte []x) throws SQLException {
boolean bool; boolean bool;
String val = new String(); String val = "";
Byte [] obj_arr = new Byte[x.length]; Byte [] obj_arr = new Byte[x.length];
for(int i = 0; i < x.length; i++) { for(int i = 0; i < x.length; i++) {
obj_arr[i] = new Byte(x[i]); obj_arr[i] = Byte.valueOf(x[i]);
val = val.concat(obj_arr[i].toString()); val = val.concat(obj_arr[i].toString());
} }
......
...@@ -215,7 +215,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -215,7 +215,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10); iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) { for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1)); iMatchColumns.add(i,Integer.valueOf(-1));
} }
strMatchColumns = new Vector(10); strMatchColumns = new Vector(10);
...@@ -288,7 +288,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -288,7 +288,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10); iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) { for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1)); iMatchColumns.add(i,Integer.valueOf(-1));
} }
strMatchColumns = new Vector(10); strMatchColumns = new Vector(10);
...@@ -375,7 +375,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -375,7 +375,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10); iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) { for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1)); iMatchColumns.add(i,Integer.valueOf(-1));
} }
strMatchColumns = new Vector(10); strMatchColumns = new Vector(10);
...@@ -465,7 +465,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -465,7 +465,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
iMatchColumns = new Vector(10); iMatchColumns = new Vector(10);
for(int i = 0; i < 10 ; i++) { for(int i = 0; i < 10 ; i++) {
iMatchColumns.add(i,new Integer(-1)); iMatchColumns.add(i,Integer.valueOf(-1));
} }
strMatchColumns = new Vector(10); strMatchColumns = new Vector(10);
...@@ -3754,7 +3754,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -3754,7 +3754,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
} }
for( int i = 0;i < columnIdxes.length ;i++) { for( int i = 0;i < columnIdxes.length ;i++) {
iMatchColumns.set(i,new Integer(-1)); iMatchColumns.set(i,Integer.valueOf(-1));
} }
} }
...@@ -3863,7 +3863,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -3863,7 +3863,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
} }
} }
for(int i = 0 ;i < columnIdxes.length; i++) { for(int i = 0 ;i < columnIdxes.length; i++) {
iMatchColumns.add(i,new Integer(columnIdxes[i])); iMatchColumns.add(i,Integer.valueOf(columnIdxes[i]));
} }
} }
...@@ -3918,7 +3918,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -3918,7 +3918,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols1").toString()); throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols1").toString());
} else { } else {
// set iMatchColumn // set iMatchColumn
iMatchColumns.set(0, new Integer(columnIdx)); iMatchColumns.set(0, Integer.valueOf(columnIdx));
//strMatchColumn = null; //strMatchColumn = null;
} }
} }
...@@ -3940,7 +3940,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -3940,7 +3940,7 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
*/ */
public void setMatchColumn(String columnName) throws SQLException { public void setMatchColumn(String columnName) throws SQLException {
// validate, if col is ok to be set // validate, if col is ok to be set
if(columnName.equals(null) || ((columnName = columnName.trim()) == "" )) { if(columnName == null || (columnName= columnName.trim()).equals("")) {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols2").toString()); throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.matchcols2").toString());
} else { } else {
// set strMatchColumn // set strMatchColumn
...@@ -3965,13 +3965,13 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable { ...@@ -3965,13 +3965,13 @@ public class JdbcRowSetImpl extends BaseRowSet implements JdbcRowSet, Joinable {
*/ */
public void unsetMatchColumn(int columnIdx) throws SQLException { public void unsetMatchColumn(int columnIdx) throws SQLException {
// check if we are unsetting the SAME column // check if we are unsetting the SAME column
if(! iMatchColumns.get(0).equals(new Integer(columnIdx) ) ) { if(! iMatchColumns.get(0).equals(Integer.valueOf(columnIdx) ) ) {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.unsetmatch").toString()); throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.unsetmatch").toString());
} else if(strMatchColumns.get(0) != null) { } else if(strMatchColumns.get(0) != null) {
throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.usecolname").toString()); throw new SQLException(resBundle.handleGetObject("jdbcrowsetimpl.usecolname").toString());
} else { } else {
// that is, we are unsetting it. // that is, we are unsetting it.
iMatchColumns.set(0, new Integer(-1)); iMatchColumns.set(0, Integer.valueOf(-1));
} }
} }
......
...@@ -33,6 +33,8 @@ import java.math.*; ...@@ -33,6 +33,8 @@ import java.math.*;
import java.util.*; import java.util.*;
import javax.sql.rowset.*; import javax.sql.rowset.*;
import javax.sql.rowset.spi.SyncProvider;
import javax.sql.rowset.spi.SyncProviderException;
/** /**
* The standard implementation of the <code>JoinRowSet</code> * The standard implementation of the <code>JoinRowSet</code>
...@@ -550,7 +552,7 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet { ...@@ -550,7 +552,7 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
// This 'if' will be removed after all joins are implemented. // This 'if' will be removed after all joins are implemented.
throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notsupported").toString()); throw new SQLException(resBundle.handleGetObject("joinrowsetimpl.notsupported").toString());
} else { } else {
Integer Intgr = new Integer(JoinRowSet.INNER_JOIN); Integer Intgr = Integer.valueOf(JoinRowSet.INNER_JOIN);
vecJoinType.add(Intgr); vecJoinType.add(Intgr);
} }
} else { } else {
...@@ -874,8 +876,8 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet { ...@@ -874,8 +876,8 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
String strWhereClause = "Select "; String strWhereClause = "Select ";
String whereClause; String whereClause;
String tabName= null; String tabName= "";
String strTabName = null; String strTabName = "";
int sz,cols; int sz,cols;
int j; int j;
CachedRowSetImpl crs; CachedRowSetImpl crs;
...@@ -889,8 +891,6 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet { ...@@ -889,8 +891,6 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
// tableNameX.(rowsetX.getMatchColumnName()) == // tableNameX.(rowsetX.getMatchColumnName()) ==
// tableNameZ.(rowsetZ.getMatchColumnName())); // tableNameZ.(rowsetZ.getMatchColumnName()));
tabName = new String();
strTabName = new String();
sz = vecRowSetsInJOIN.size(); sz = vecRowSetsInJOIN.size();
for(int i=0;i<sz; i++) { for(int i=0;i<sz; i++) {
crs = (CachedRowSetImpl)vecRowSetsInJOIN.get(i); crs = (CachedRowSetImpl)vecRowSetsInJOIN.get(i);
...@@ -4311,6 +4311,27 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet { ...@@ -4311,6 +4311,27 @@ public class JoinRowSetImpl extends WebRowSetImpl implements JoinRowSet {
return crsInternal.createCopySchema(); return crsInternal.createCopySchema();
} }
/**
* {@inheritDoc}
*/
public void setSyncProvider(String providerStr) throws SQLException {
crsInternal.setSyncProvider(providerStr);
}
/**
* {@inheritDoc}
*/
public void acceptChanges() throws SyncProviderException {
crsInternal.acceptChanges();
}
/**
* {@inheritDoc}
*/
public SyncProvider getSyncProvider() throws SQLException {
return crsInternal.getSyncProvider();
}
/** /**
* This method re populates the resBundle * This method re populates the resBundle
* during the deserialization process * during the deserialization process
......
...@@ -338,11 +338,11 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -338,11 +338,11 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
if (crs.rowDeleted()) { if (crs.rowDeleted()) {
// The row has been deleted. // The row has been deleted.
if (conflict = (deleteOriginalRow(crs, this.crsResolve)) == true) { if (conflict = (deleteOriginalRow(crs, this.crsResolve)) == true) {
status.add(rows, new Integer(SyncResolver.DELETE_ROW_CONFLICT)); status.add(rows, Integer.valueOf(SyncResolver.DELETE_ROW_CONFLICT));
} else { } else {
// delete happened without any occurrence of conflicts // delete happened without any occurrence of conflicts
// so update status accordingly // so update status accordingly
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT)); status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
} }
} else if (crs.rowInserted()) { } else if (crs.rowInserted()) {
...@@ -350,20 +350,20 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -350,20 +350,20 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
pstmtIns = con.prepareStatement(insertCmd); pstmtIns = con.prepareStatement(insertCmd);
if ( (conflict = insertNewRow(crs, pstmtIns, this.crsResolve)) == true) { if ( (conflict = insertNewRow(crs, pstmtIns, this.crsResolve)) == true) {
status.add(rows, new Integer(SyncResolver.INSERT_ROW_CONFLICT)); status.add(rows, Integer.valueOf(SyncResolver.INSERT_ROW_CONFLICT));
} else { } else {
// insert happened without any occurrence of conflicts // insert happened without any occurrence of conflicts
// so update status accordingly // so update status accordingly
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT)); status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
} }
} else if (crs.rowUpdated()) { } else if (crs.rowUpdated()) {
// The row has been updated. // The row has been updated.
if ( conflict = (updateOriginalRow(crs)) == true) { if ( conflict = (updateOriginalRow(crs)) == true) {
status.add(rows, new Integer(SyncResolver.UPDATE_ROW_CONFLICT)); status.add(rows, Integer.valueOf(SyncResolver.UPDATE_ROW_CONFLICT));
} else { } else {
// update happened without any occurrence of conflicts // update happened without any occurrence of conflicts
// so update status accordingly // so update status accordingly
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT)); status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
} }
} else { } else {
...@@ -375,7 +375,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -375,7 +375,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
* that is fine. * that is fine.
**/ **/
int icolCount = crs.getMetaData().getColumnCount(); int icolCount = crs.getMetaData().getColumnCount();
status.add(rows, new Integer(SyncResolver.NO_ROW_CONFLICT)); status.add(rows, Integer.valueOf(SyncResolver.NO_ROW_CONFLICT));
this.crsResolve.moveToInsertRow(); this.crsResolve.moveToInsertRow();
for(int cols=0;cols<iColCount;cols++) { for(int cols=0;cols<iColCount;cols++) {
...@@ -398,7 +398,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -398,7 +398,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
boolean boolConf = false; boolean boolConf = false;
for (int j=1;j<status.size();j++){ for (int j=1;j<status.size();j++){
// ignore status for index = 0 which is set to null // ignore status for index = 0 which is set to null
if(! ((status.get(j)).equals(new Integer(SyncResolver.NO_ROW_CONFLICT)))) { if(! ((status.get(j)).equals(Integer.valueOf(SyncResolver.NO_ROW_CONFLICT)))) {
// there is at least one conflict which needs to be resolved // there is at least one conflict which needs to be resolved
boolConf = true; boolConf = true;
break; break;
...@@ -541,7 +541,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -541,7 +541,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
// how many fields need to be updated // how many fields need to be updated
int colsNotChanged = 0; int colsNotChanged = 0;
Vector cols = new Vector(); Vector cols = new Vector();
String updateExec = new String(updateCmd); String updateExec = updateCmd;
Object orig; Object orig;
Object curr; Object curr;
Object rsval; Object rsval;
...@@ -652,7 +652,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -652,7 +652,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
updateExec += ", "; updateExec += ", ";
} }
updateExec += crs.getMetaData().getColumnName(i); updateExec += crs.getMetaData().getColumnName(i);
cols.add(new Integer(i)); cols.add(Integer.valueOf(i));
updateExec += " = ? "; updateExec += " = ? ";
first = false; first = false;
...@@ -698,7 +698,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -698,7 +698,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
updateExec += ", "; updateExec += ", ";
} }
updateExec += crs.getMetaData().getColumnName(i); updateExec += crs.getMetaData().getColumnName(i);
cols.add(new Integer(i)); cols.add(Integer.valueOf(i));
updateExec += " = ? "; updateExec += " = ? ";
flag = false; flag = false;
} else { } else {
...@@ -1184,7 +1184,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable { ...@@ -1184,7 +1184,7 @@ public class CachedRowSetWriter implements TransactionalWriter, Serializable {
// trim all the leading and trailing whitespaces, // trim all the leading and trailing whitespaces,
// white spaces can never be catalog, schema or a table name. // white spaces can never be catalog, schema or a table name.
String cmd = new String(); String cmd = "";
catalog = catalog.trim(); catalog = catalog.trim();
schema = schema.trim(); schema = schema.trim();
......
...@@ -248,7 +248,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable { ...@@ -248,7 +248,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
String strProvider = strProviderInstance.substring(0, (caller.getSyncProvider()).toString().indexOf("@")); String strProvider = strProviderInstance.substring(0, (caller.getSyncProvider()).toString().indexOf("@"));
propString("sync-provider-name", strProvider); propString("sync-provider-name", strProvider);
propString("sync-provider-vendor", "Sun Microsystems Inc."); propString("sync-provider-vendor", "Oracle Corporation");
propString("sync-provider-version", "1.0"); propString("sync-provider-version", "1.0");
propInteger("sync-provider-grade", caller.getSyncProvider().getProviderGrade()); propInteger("sync-provider-grade", caller.getSyncProvider().getProviderGrade());
propInteger("data-source-lock", caller.getSyncProvider().getDataSourceLock()); propInteger("data-source-lock", caller.getSyncProvider().getDataSourceLock());
...@@ -387,7 +387,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable { ...@@ -387,7 +387,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
if (caller.wasNull()) if (caller.wasNull())
writeNull(); writeNull();
else else
writeInteger(caller.getInt(idx)); writeInteger(i);
break; break;
case java.sql.Types.BIGINT: case java.sql.Types.BIGINT:
long l = caller.getLong(idx); long l = caller.getLong(idx);
...@@ -574,7 +574,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable { ...@@ -574,7 +574,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
} }
private void writeBoolean(boolean b) throws java.io.IOException { private void writeBoolean(boolean b) throws java.io.IOException {
writer.write(new Boolean(b).toString()); writer.write(Boolean.valueOf(b).toString());
} }
private void writeFloat(float f) throws java.io.IOException { private void writeFloat(float f) throws java.io.IOException {
...@@ -641,7 +641,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable { ...@@ -641,7 +641,7 @@ public class WebRowSetXmlWriter implements XmlWriter, Serializable {
return null; return null;
} }
char []charStr = s.toCharArray(); char []charStr = s.toCharArray();
String specialStr = new String(); String specialStr = "";
for(int i = 0; i < charStr.length; i++) { for(int i = 0; i < charStr.length; i++) {
if(charStr[i] == '&') { if(charStr[i] == '&') {
......
...@@ -441,9 +441,9 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -441,9 +441,9 @@ public class XmlReaderContentHandler extends DefaultHandler {
updates = new Vector(); updates = new Vector();
// start out with the empty string // start out with the empty string
columnValue = new String(""); columnValue = "";
propertyValue = new String(""); propertyValue = "";
metaDataValue = new String(""); metaDataValue = "";
nullVal = false; nullVal = false;
idx = 0; idx = 0;
...@@ -481,21 +481,21 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -481,21 +481,21 @@ public class XmlReaderContentHandler extends DefaultHandler {
items = properties.length; items = properties.length;
for (i=0;i<items;i++) { for (i=0;i<items;i++) {
propMap.put(properties[i], new Integer(i)); propMap.put(properties[i], Integer.valueOf(i));
} }
colDefMap = new HashMap(); colDefMap = new HashMap();
items = colDef.length; items = colDef.length;
for (i=0;i<items;i++) { for (i=0;i<items;i++) {
colDefMap.put(colDef[i], new Integer(i)); colDefMap.put(colDef[i], Integer.valueOf(i));
} }
dataMap = new HashMap(); dataMap = new HashMap();
items = data.length; items = data.length;
for (i=0;i<items;i++) { for (i=0;i<items;i++) {
dataMap.put(data[i], new Integer(i)); dataMap.put(data[i], Integer.valueOf(i));
} }
//Initialize connection map here //Initialize connection map here
...@@ -686,7 +686,7 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -686,7 +686,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
} }
// propertyValue need to be reset to an empty string // propertyValue need to be reset to an empty string
propertyValue = new String(""); propertyValue = "";
setTag(-1); setTag(-1);
break; break;
case METADATA: case METADATA:
...@@ -710,7 +710,7 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -710,7 +710,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
} }
// metaDataValue needs to be reset to an empty string // metaDataValue needs to be reset to an empty string
metaDataValue = new String(""); metaDataValue = "";
} }
setTag(-1); setTag(-1);
break; break;
...@@ -736,7 +736,7 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -736,7 +736,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
insertValue(tempStr); insertValue(tempStr);
} }
// columnValue now need to be reset to the empty string // columnValue now need to be reset to the empty string
columnValue = new String(""); columnValue = "";
} catch (SQLException ex) { } catch (SQLException ex) {
throw new SAXException(MessageFormat.format(resBundle.handleGetObject("xmlrch.errinsert").toString(), ex.getMessage())); throw new SAXException(MessageFormat.format(resBundle.handleGetObject("xmlrch.errinsert").toString(), ex.getMessage()));
} }
...@@ -981,7 +981,7 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -981,7 +981,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
private boolean getBooleanValue(String s) { private boolean getBooleanValue(String s) {
return new Boolean(s).booleanValue(); return Boolean.valueOf(s).booleanValue();
} }
private java.math.BigDecimal getBigDecimalValue(String s) { private java.math.BigDecimal getBigDecimalValue(String s) {
...@@ -1316,7 +1316,7 @@ public class XmlReaderContentHandler extends DefaultHandler { ...@@ -1316,7 +1316,7 @@ public class XmlReaderContentHandler extends DefaultHandler {
**/ **/
tempUpdate = tempUpdate.concat(new String(ch,start,len)); tempUpdate = tempUpdate.concat(new String(ch,start,len));
upd[0] = new Integer(idx); upd[0] = Integer.valueOf(idx);
upd[1] = tempUpdate; upd[1] = tempUpdate;
//updates.add(upd); //updates.add(upd);
......
...@@ -93,14 +93,14 @@ public final class RIOptimisticProvider extends SyncProvider implements Serializ ...@@ -93,14 +93,14 @@ public final class RIOptimisticProvider extends SyncProvider implements Serializ
private CachedRowSetWriter writer; private CachedRowSetWriter writer;
/** /**
* The unique provider indentifier. * The unique provider identifier.
*/ */
private String providerID = "com.sun.rowset.providers.RIOptimisticProvider"; private String providerID = "com.sun.rowset.providers.RIOptimisticProvider";
/** /**
* The vendor name of this SyncProvider implementation * The vendor name of this SyncProvider implementation
*/ */
private String vendorName = "Sun Microsystems Inc."; private String vendorName = "Oracle Corporation";
/** /**
* The version number of this SyncProvider implementation * The version number of this SyncProvider implementation
...@@ -236,8 +236,8 @@ public final class RIOptimisticProvider extends SyncProvider implements Serializ ...@@ -236,8 +236,8 @@ public final class RIOptimisticProvider extends SyncProvider implements Serializ
} }
/** /**
* Returns the vendor name of the Reference Implemntation Optimistic * Returns the vendor name of the Reference Implementation Optimistic
* Syncchronication Provider * Synchronization Provider
* *
* @return the <code>String</code> detailing the vendor name of this * @return the <code>String</code> detailing the vendor name of this
* SyncProvider * SyncProvider
......
/* /*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -85,7 +85,7 @@ public final class RIXMLProvider extends SyncProvider { ...@@ -85,7 +85,7 @@ public final class RIXMLProvider extends SyncProvider {
/** /**
* The vendor name of this SyncProvider implementation. * The vendor name of this SyncProvider implementation.
*/ */
private String vendorName = "Sun Microsystems Inc."; private String vendorName = "Oracle Corporation";
/** /**
* The version number of this SyncProvider implementation. * The version number of this SyncProvider implementation.
......
...@@ -43,7 +43,8 @@ public class Installer { ...@@ -43,7 +43,8 @@ public class Installer {
"servicetag.dir.path"; "servicetag.dir.path";
private static String SVCTAG_ENABLE_REGISTRATION = private static String SVCTAG_ENABLE_REGISTRATION =
"servicetag.registration.enabled"; "servicetag.registration.enabled";
private final static String SUN_VENDOR = "Sun Microsystems"; private final static String ORACLE = "Oracle";
private final static String SUN = "Sun Microsystems";
private final static String REGISTRATION_XML = "registration.xml"; private final static String REGISTRATION_XML = "registration.xml";
private final static String SERVICE_TAG_FILE = "servicetag"; private final static String SERVICE_TAG_FILE = "servicetag";
private final static String REGISTRATION_HTML_NAME = "register"; private final static String REGISTRATION_HTML_NAME = "register";
...@@ -84,9 +85,10 @@ public class Installer { ...@@ -84,9 +85,10 @@ public class Installer {
// Implementation of ServiceTag.getJavaServiceTag(String) method // Implementation of ServiceTag.getJavaServiceTag(String) method
static ServiceTag getJavaServiceTag(String source) throws IOException { static ServiceTag getJavaServiceTag(String source) throws IOException {
if (!System.getProperty("java.vendor").startsWith(SUN_VENDOR)) { String vendor = System.getProperty("java.vendor", "");
if (!vendor.startsWith(SUN) && !vendor.startsWith(ORACLE)) {
// Products bundling this implementation may run on // Products bundling this implementation may run on
// Mac OS which is not a Sun JDK // Mac OS which is not a Sun/Oracle JDK
return null; return null;
} }
boolean cleanup = false; boolean cleanup = false;
...@@ -365,7 +367,7 @@ public class Installer { ...@@ -365,7 +367,7 @@ public class Installer {
props.getProperty("servicetag.parent.name"), props.getProperty("servicetag.parent.name"),
props.getProperty("servicetag.parent.urn"), props.getProperty("servicetag.parent.urn"),
getProductDefinedId(), getProductDefinedId(),
SUN_VENDOR, System.getProperty("java.vendor"),
System.getProperty("os.arch"), System.getProperty("os.arch"),
getZoneName(), getZoneName(),
svcTagSource); svcTagSource);
......
...@@ -80,12 +80,12 @@ import static com.sun.servicetag.RegistrationDocument.*; ...@@ -80,12 +80,12 @@ import static com.sun.servicetag.RegistrationDocument.*;
* <tr> * <tr>
* <td><tt>systemManufacturer</tt></td> * <td><tt>systemManufacturer</tt></td>
* <td>System manufacturer</td> * <td>System manufacturer</td>
* <td> e.g. Sun Microsystems</td> * <td> e.g. Oracle Corporation</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><tt>cpuManufacturer</tt></td> * <td><tt>cpuManufacturer</tt></td>
* <td>CPU manufacturer</td> * <td>CPU manufacturer</td>
* <td> e.g. Sun Microsystems</td> * <td> e.g. Oracle Corporation</td>
* </tr> * </tr>
* <tr> * <tr>
* <td><tt>serialNumber</tt></td> * <td><tt>serialNumber</tt></td>
......
...@@ -90,7 +90,7 @@ public class Registry { ...@@ -90,7 +90,7 @@ public class Registry {
stclient = getWindowsStClientFile(); stclient = getWindowsStClientFile();
} else { } else {
if (isVerbose()) { if (isVerbose()) {
System.out.println("Running on non-Sun JDK"); System.out.println("Running on unsupported platform");
} }
} }
initialized = true; initialized = true;
......
...@@ -44,6 +44,7 @@ import java.io.*; ...@@ -44,6 +44,7 @@ import java.io.*;
* Solaris implementation of the SystemEnvironment class. * Solaris implementation of the SystemEnvironment class.
*/ */
class SolarisSystemEnvironment extends SystemEnvironment { class SolarisSystemEnvironment extends SystemEnvironment {
private static final String ORACLE = "Oracle Corporation";
SolarisSystemEnvironment() { SolarisSystemEnvironment() {
setHostId(getCommandOutput("/usr/bin/hostid")); setHostId(getCommandOutput("/usr/bin/hostid"));
setSystemModel(getCommandOutput("/usr/bin/uname", "-i")); setSystemModel(getCommandOutput("/usr/bin/uname", "-i"));
...@@ -59,7 +60,7 @@ class SolarisSystemEnvironment extends SystemEnvironment { ...@@ -59,7 +60,7 @@ class SolarisSystemEnvironment extends SystemEnvironment {
private String getSolarisCpuManufacturer() { private String getSolarisCpuManufacturer() {
// not fully accurate, this could be another manufacturer (fujitsu for example) // not fully accurate, this could be another manufacturer (fujitsu for example)
if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) { if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) {
return "Sun Microsystems, Inc"; return ORACLE;
} }
// if we're here, then we'll try smbios (type 4) // if we're here, then we'll try smbios (type 4)
...@@ -73,7 +74,7 @@ class SolarisSystemEnvironment extends SystemEnvironment { ...@@ -73,7 +74,7 @@ class SolarisSystemEnvironment extends SystemEnvironment {
private String getSolarisSystemManufacturer() { private String getSolarisSystemManufacturer() {
// not fully accurate, this could be another manufacturer (fujitsu for example) // not fully accurate, this could be another manufacturer (fujitsu for example)
if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) { if ("sparc".equalsIgnoreCase(System.getProperty("os.arch"))) {
return "Sun Microsystems, Inc"; return ORACLE;
} }
// if we're here, then we'll try smbios (type 1) // if we're here, then we'll try smbios (type 1)
...@@ -117,7 +118,7 @@ class SolarisSystemEnvironment extends SystemEnvironment { ...@@ -117,7 +118,7 @@ class SolarisSystemEnvironment extends SystemEnvironment {
// ID SIZE TYPE // ID SIZE TYPE
// 1 150 SMB_TYPE_SYSTEM (system information) // 1 150 SMB_TYPE_SYSTEM (system information)
// //
// Manufacturer: Sun Microsystems // Manufacturer: Oracle Corporation
// Product: Sun Fire X4600 // Product: Sun Fire X4600
// Version: To Be Filled By O.E.M. // Version: To Be Filled By O.E.M.
// Serial Number: 00:14:4F:45:0C:2A // Serial Number: 00:14:4F:45:0C:2A
......
...@@ -1101,22 +1101,12 @@ public final class System { ...@@ -1101,22 +1101,12 @@ public final class System {
lineSeparator = props.getProperty("line.separator"); lineSeparator = props.getProperty("line.separator");
sun.misc.Version.init(); sun.misc.Version.init();
// Workaround until DownloadManager initialization is revisited.
// Make JavaLangAccess available early enough for internal
// Shutdown hooks to be registered
setJavaLangAccess();
// Gets and removes system properties that configure the Integer // Gets and removes system properties that configure the Integer
// cache used to support the object identity semantics of autoboxing. // cache used to support the object identity semantics of autoboxing.
// At this time, the size of the cache may be controlled by the // At this time, the size of the cache may be controlled by the
// vm option -XX:AutoBoxCacheMax=<size>. // vm option -XX:AutoBoxCacheMax=<size>.
Integer.getAndRemoveCacheProperties(); Integer.getAndRemoveCacheProperties();
// Load the zip library now in order to keep java.util.zip.ZipFile
// from trying to use itself to load this library later.
loadLibrary("zip");
FileInputStream fdIn = new FileInputStream(FileDescriptor.in); FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err); FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
...@@ -1124,6 +1114,10 @@ public final class System { ...@@ -1124,6 +1114,10 @@ public final class System {
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true)); setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true)); setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
// Load the zip library now in order to keep java.util.zip.ZipFile
// from trying to use itself to load this library later.
loadLibrary("zip");
// Setup Java signal handlers for HUP, TERM, and INT (where available). // Setup Java signal handlers for HUP, TERM, and INT (where available).
Terminator.setup(); Terminator.setup();
...@@ -1153,6 +1147,9 @@ public final class System { ...@@ -1153,6 +1147,9 @@ public final class System {
// way as other threads; we must do it ourselves here. // way as other threads; we must do it ourselves here.
Thread current = Thread.currentThread(); Thread current = Thread.currentThread();
current.getThreadGroup().add(current); current.getThreadGroup().add(current);
// register shared secrets
setJavaLangAccess();
} }
private static void setJavaLangAccess() { private static void setJavaLangAccess() {
......
...@@ -677,19 +677,20 @@ class InetAddress implements java.io.Serializable { ...@@ -677,19 +677,20 @@ class InetAddress implements java.io.Serializable {
static InetAddressImpl impl; static InetAddressImpl impl;
private static HashMap lookupTable = new HashMap(); private static HashMap<String, InetAddress[]> lookupTable
= new HashMap<String, InetAddress[]>();
/** /**
* Represents a cache entry * Represents a cache entry
*/ */
static final class CacheEntry { static final class CacheEntry {
CacheEntry(Object address, long expiration) { CacheEntry(InetAddress[] addresses, long expiration) {
this.address = address; this.addresses = addresses;
this.expiration = expiration; this.expiration = expiration;
} }
Object address; InetAddress[] addresses;
long expiration; long expiration;
} }
...@@ -698,7 +699,7 @@ class InetAddress implements java.io.Serializable { ...@@ -698,7 +699,7 @@ class InetAddress implements java.io.Serializable {
* at creation time. * at creation time.
*/ */
static final class Cache { static final class Cache {
private LinkedHashMap cache; private LinkedHashMap<String, CacheEntry> cache;
private Type type; private Type type;
enum Type {Positive, Negative}; enum Type {Positive, Negative};
...@@ -708,7 +709,7 @@ class InetAddress implements java.io.Serializable { ...@@ -708,7 +709,7 @@ class InetAddress implements java.io.Serializable {
*/ */
public Cache(Type type) { public Cache(Type type) {
this.type = type; this.type = type;
cache = new LinkedHashMap(); cache = new LinkedHashMap<String, CacheEntry>();
} }
private int getPolicy() { private int getPolicy() {
...@@ -724,7 +725,7 @@ class InetAddress implements java.io.Serializable { ...@@ -724,7 +725,7 @@ class InetAddress implements java.io.Serializable {
* entry then for this host then the entry will be * entry then for this host then the entry will be
* replaced. * replaced.
*/ */
public Cache put(String host, Object address) { public Cache put(String host, InetAddress[] addresses) {
int policy = getPolicy(); int policy = getPolicy();
if (policy == InetAddressCachePolicy.NEVER) { if (policy == InetAddressCachePolicy.NEVER) {
return this; return this;
...@@ -736,12 +737,10 @@ class InetAddress implements java.io.Serializable { ...@@ -736,12 +737,10 @@ class InetAddress implements java.io.Serializable {
// As we iterate in insertion order we can // As we iterate in insertion order we can
// terminate when a non-expired entry is found. // terminate when a non-expired entry is found.
LinkedList expired = new LinkedList(); LinkedList<String> expired = new LinkedList<String>();
Iterator i = cache.keySet().iterator();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
while (i.hasNext()) { for (String key : cache.keySet()) {
String key = (String)i.next(); CacheEntry entry = cache.get(key);
CacheEntry entry = (CacheEntry)cache.get(key);
if (entry.expiration >= 0 && entry.expiration < now) { if (entry.expiration >= 0 && entry.expiration < now) {
expired.add(key); expired.add(key);
...@@ -750,9 +749,8 @@ class InetAddress implements java.io.Serializable { ...@@ -750,9 +749,8 @@ class InetAddress implements java.io.Serializable {
} }
} }
i = expired.iterator(); for (String key : expired) {
while (i.hasNext()) { cache.remove(key);
cache.remove(i.next());
} }
} }
...@@ -766,7 +764,7 @@ class InetAddress implements java.io.Serializable { ...@@ -766,7 +764,7 @@ class InetAddress implements java.io.Serializable {
} else { } else {
expiration = System.currentTimeMillis() + (policy * 1000); expiration = System.currentTimeMillis() + (policy * 1000);
} }
CacheEntry entry = new CacheEntry(address, expiration); CacheEntry entry = new CacheEntry(addresses, expiration);
cache.put(host, entry); cache.put(host, entry);
return this; return this;
} }
...@@ -780,7 +778,7 @@ class InetAddress implements java.io.Serializable { ...@@ -780,7 +778,7 @@ class InetAddress implements java.io.Serializable {
if (policy == InetAddressCachePolicy.NEVER) { if (policy == InetAddressCachePolicy.NEVER) {
return null; return null;
} }
CacheEntry entry = (CacheEntry)cache.get(host); CacheEntry entry = cache.get(host);
// check if entry has expired // check if entry has expired
if (entry != null && policy != InetAddressCachePolicy.FOREVER) { if (entry != null && policy != InetAddressCachePolicy.FOREVER) {
...@@ -814,42 +812,41 @@ class InetAddress implements java.io.Serializable { ...@@ -814,42 +812,41 @@ class InetAddress implements java.io.Serializable {
} }
/* /*
* Cache the given hostname and address. * Cache the given hostname and addresses.
*/ */
private static void cacheAddress(String hostname, Object address, private static void cacheAddresses(String hostname,
boolean success) { InetAddress[] addresses,
boolean success) {
hostname = hostname.toLowerCase(); hostname = hostname.toLowerCase();
synchronized (addressCache) { synchronized (addressCache) {
cacheInitIfNeeded(); cacheInitIfNeeded();
if (success) { if (success) {
addressCache.put(hostname, address); addressCache.put(hostname, addresses);
} else { } else {
negativeCache.put(hostname, address); negativeCache.put(hostname, addresses);
} }
} }
} }
/* /*
* Lookup hostname in cache (positive & negative cache). If * Lookup hostname in cache (positive & negative cache). If
* found return address, null if not found. * found return addresses, null if not found.
*/ */
private static Object getCachedAddress(String hostname) { private static InetAddress[] getCachedAddresses(String hostname) {
hostname = hostname.toLowerCase(); hostname = hostname.toLowerCase();
// search both positive & negative caches // search both positive & negative caches
synchronized (addressCache) { synchronized (addressCache) {
CacheEntry entry;
cacheInitIfNeeded(); cacheInitIfNeeded();
entry = addressCache.get(hostname); CacheEntry entry = addressCache.get(hostname);
if (entry == null) { if (entry == null) {
entry = negativeCache.get(hostname); entry = negativeCache.get(hostname);
} }
if (entry != null) { if (entry != null) {
return entry.address; return entry.addresses;
} }
} }
...@@ -911,7 +908,7 @@ class InetAddress implements java.io.Serializable { ...@@ -911,7 +908,7 @@ class InetAddress implements java.io.Serializable {
static { static {
// create the impl // create the impl
impl = (new InetAddressImplFactory()).create(); impl = InetAddressImplFactory.create();
// get name service if provided and requested // get name service if provided and requested
String provider = null;; String provider = null;;
...@@ -931,7 +928,7 @@ class InetAddress implements java.io.Serializable { ...@@ -931,7 +928,7 @@ class InetAddress implements java.io.Serializable {
} }
// if not designate any name services provider, // if not designate any name services provider,
// creat a default one // create a default one
if (nameServices.size() == 0) { if (nameServices.size() == 0) {
NameService ns = createNSProvider("default"); NameService ns = createNSProvider("default");
nameServices.add(ns); nameServices.add(ns);
...@@ -939,7 +936,7 @@ class InetAddress implements java.io.Serializable { ...@@ -939,7 +936,7 @@ class InetAddress implements java.io.Serializable {
} }
/** /**
* Create an InetAddress based on the provided host name and IP address * Creates an InetAddress based on the provided host name and IP address.
* No name service is checked for the validity of the address. * No name service is checked for the validity of the address.
* *
* <p> The host name can either be a machine name, such as * <p> The host name can either be a machine name, such as
...@@ -1067,13 +1064,13 @@ class InetAddress implements java.io.Serializable { ...@@ -1067,13 +1064,13 @@ class InetAddress implements java.io.Serializable {
boolean ipv6Expected = false; boolean ipv6Expected = false;
if (host.charAt(0) == '[') { if (host.charAt(0) == '[') {
// This is supposed to be an IPv6 litteral // This is supposed to be an IPv6 literal
if (host.length() > 2 && host.charAt(host.length()-1) == ']') { if (host.length() > 2 && host.charAt(host.length()-1) == ']') {
host = host.substring(1, host.length() -1); host = host.substring(1, host.length() -1);
ipv6Expected = true; ipv6Expected = true;
} else { } else {
// This was supposed to be a IPv6 address, but it's not! // This was supposed to be a IPv6 address, but it's not!
throw new UnknownHostException(host); throw new UnknownHostException(host + ": invalid IPv6 address");
} }
} }
...@@ -1180,8 +1177,6 @@ class InetAddress implements java.io.Serializable { ...@@ -1180,8 +1177,6 @@ class InetAddress implements java.io.Serializable {
throws UnknownHostException { throws UnknownHostException {
/* If it gets here it is presumed to be a hostname */ /* If it gets here it is presumed to be a hostname */
/* Cache.get can return: null, unknownAddress, or InetAddress[] */ /* Cache.get can return: null, unknownAddress, or InetAddress[] */
Object obj = null;
Object objcopy = null;
/* make sure the connection to the host is allowed, before we /* make sure the connection to the host is allowed, before we
* give out a hostname * give out a hostname
...@@ -1193,26 +1188,23 @@ class InetAddress implements java.io.Serializable { ...@@ -1193,26 +1188,23 @@ class InetAddress implements java.io.Serializable {
} }
} }
obj = getCachedAddress(host); InetAddress[] addresses = getCachedAddresses(host);
/* If no entry in cache, then do the host lookup */ /* If no entry in cache, then do the host lookup */
if (obj == null) { if (addresses == null) {
obj = getAddressFromNameService(host); addresses = getAddressesFromNameService(host);
} }
if (obj == unknown_array) if (addresses == unknown_array)
throw new UnknownHostException(host); throw new UnknownHostException(host);
/* Make a copy of the InetAddress array */ return addresses.clone();
objcopy = ((InetAddress [])obj).clone();
return (InetAddress [])objcopy;
} }
private static Object getAddressFromNameService(String host) private static InetAddress[] getAddressesFromNameService(String host)
throws UnknownHostException throws UnknownHostException
{ {
Object obj = null; InetAddress[] addresses = null;
boolean success = false; boolean success = false;
UnknownHostException ex = null; UnknownHostException ex = null;
...@@ -1226,16 +1218,16 @@ class InetAddress implements java.io.Serializable { ...@@ -1226,16 +1218,16 @@ class InetAddress implements java.io.Serializable {
// would be blocked until the host is removed // would be blocked until the host is removed
// from the lookupTable. Then this thread // from the lookupTable. Then this thread
// should try to look up the addressCache. // should try to look up the addressCache.
// i) if it found the address in the // i) if it found the addresses in the
// addressCache, checkLookupTable() would // addressCache, checkLookupTable() would
// return the address. // return the addresses.
// ii) if it didn't find the address in the // ii) if it didn't find the addresses in the
// addressCache for any reason, // addressCache for any reason,
// it should add the host in the // it should add the host in the
// lookupTable and return null so the // lookupTable and return null so the
// following code would do a lookup itself. // following code would do a lookup itself.
if ((obj = checkLookupTable(host)) == null) { if ((addresses = checkLookupTable(host)) == null) {
// This is the first thread which looks up the address // This is the first thread which looks up the addresses
// this host or the cache entry for this host has been // this host or the cache entry for this host has been
// expired so this thread should do the lookup. // expired so this thread should do the lookup.
for (NameService nameService : nameServices) { for (NameService nameService : nameServices) {
...@@ -1246,26 +1238,26 @@ class InetAddress implements java.io.Serializable { ...@@ -1246,26 +1238,26 @@ class InetAddress implements java.io.Serializable {
* allocating space when the lookup fails. * allocating space when the lookup fails.
*/ */
obj = nameService.lookupAllHostAddr(host); addresses = nameService.lookupAllHostAddr(host);
success = true; success = true;
break; break;
} catch (UnknownHostException uhe) { } catch (UnknownHostException uhe) {
if (host.equalsIgnoreCase("localhost")) { if (host.equalsIgnoreCase("localhost")) {
InetAddress[] local = new InetAddress[] { impl.loopbackAddress() }; InetAddress[] local = new InetAddress[] { impl.loopbackAddress() };
obj = local; addresses = local;
success = true; success = true;
break; break;
} }
else { else {
obj = unknown_array; addresses = unknown_array;
success = false; success = false;
ex = uhe; ex = uhe;
} }
} }
} }
// Cache the address. // Cache the addresses.
cacheAddress(host, obj, success); cacheAddresses(host, addresses, success);
// Delete the host from the lookupTable, and // Delete the host from the lookupTable, and
// notify all threads waiting for the monitor // notify all threads waiting for the monitor
// for lookupTable. // for lookupTable.
...@@ -1274,13 +1266,13 @@ class InetAddress implements java.io.Serializable { ...@@ -1274,13 +1266,13 @@ class InetAddress implements java.io.Serializable {
throw ex; throw ex;
} }
return obj; return addresses;
} }
private static Object checkLookupTable(String host) { private static InetAddress[] checkLookupTable(String host) {
// make sure obj is null. // make sure addresses is null.
Object obj = null; InetAddress[] addresses = null;
synchronized (lookupTable) { synchronized (lookupTable) {
// If the host isn't in the lookupTable, add it in the // If the host isn't in the lookupTable, add it in the
...@@ -1288,11 +1280,11 @@ class InetAddress implements java.io.Serializable { ...@@ -1288,11 +1280,11 @@ class InetAddress implements java.io.Serializable {
// the lookup. // the lookup.
if (lookupTable.containsKey(host) == false) { if (lookupTable.containsKey(host) == false) {
lookupTable.put(host, null); lookupTable.put(host, null);
return obj; return addresses;
} }
// If the host is in the lookupTable, it means that another // If the host is in the lookupTable, it means that another
// thread is trying to look up the address of this host. // thread is trying to look up the addresses of this host.
// This thread should wait. // This thread should wait.
while (lookupTable.containsKey(host)) { while (lookupTable.containsKey(host)) {
try { try {
...@@ -1302,18 +1294,18 @@ class InetAddress implements java.io.Serializable { ...@@ -1302,18 +1294,18 @@ class InetAddress implements java.io.Serializable {
} }
} }
// The other thread has finished looking up the address of // The other thread has finished looking up the addresses of
// the host. This thread should retry to get the address // the host. This thread should retry to get the addresses
// from the addressCache. If it doesn't get the address from // from the addressCache. If it doesn't get the addresses from
// the cache, it will try to look up the address itself. // the cache, it will try to look up the addresses itself.
obj = getCachedAddress(host); addresses = getCachedAddresses(host);
if (obj == null) { if (addresses == null) {
synchronized (lookupTable) { synchronized (lookupTable) {
lookupTable.put(host, null); lookupTable.put(host, null);
} }
} }
return obj; return addresses;
} }
private static void updateLookupTable(String host) { private static void updateLookupTable(String host) {
...@@ -1396,15 +1388,20 @@ class InetAddress implements java.io.Serializable { ...@@ -1396,15 +1388,20 @@ class InetAddress implements java.io.Serializable {
cachedLocalHost = null; cachedLocalHost = null;
} }
// we are calling getAddressFromNameService directly // we are calling getAddressesFromNameService directly
// to avoid getting localHost from cache // to avoid getting localHost from cache
if (ret == null) { if (ret == null) {
InetAddress[] localAddrs; InetAddress[] localAddrs;
try { try {
localAddrs = localAddrs =
(InetAddress[]) InetAddress.getAddressFromNameService(local); InetAddress.getAddressesFromNameService(local);
} catch (UnknownHostException uhe) { } catch (UnknownHostException uhe) {
throw new UnknownHostException(local + ": " + uhe.getMessage()); // Rethrow with a more informative error message.
UnknownHostException uhe2 =
new UnknownHostException(local + ": " +
uhe.getMessage());
uhe2.initCause(uhe);
throw uhe2;
} }
cachedLocalHost = localAddrs[0]; cachedLocalHost = localAddrs[0];
cacheTime = now; cacheTime = now;
...@@ -1434,8 +1431,8 @@ class InetAddress implements java.io.Serializable { ...@@ -1434,8 +1431,8 @@ class InetAddress implements java.io.Serializable {
/* /*
* Load and instantiate an underlying impl class * Load and instantiate an underlying impl class
*/ */
static Object loadImpl(String implName) { static InetAddressImpl loadImpl(String implName) {
Object impl; Object impl = null;
/* /*
* Property "impl.prefix" will be prepended to the classname * Property "impl.prefix" will be prepended to the classname
...@@ -1446,7 +1443,6 @@ class InetAddress implements java.io.Serializable { ...@@ -1446,7 +1443,6 @@ class InetAddress implements java.io.Serializable {
*/ */
String prefix = AccessController.doPrivileged( String prefix = AccessController.doPrivileged(
new GetPropertyAction("impl.prefix", "")); new GetPropertyAction("impl.prefix", ""));
impl = null;
try { try {
impl = Class.forName("java.net." + prefix + implName).newInstance(); impl = Class.forName("java.net." + prefix + implName).newInstance();
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
...@@ -1471,7 +1467,7 @@ class InetAddress implements java.io.Serializable { ...@@ -1471,7 +1467,7 @@ class InetAddress implements java.io.Serializable {
} }
} }
return impl; return (InetAddressImpl) impl;
} }
private void readObjectNoData (ObjectInputStream s) throws private void readObjectNoData (ObjectInputStream s) throws
...@@ -1498,13 +1494,8 @@ class InetAddress implements java.io.Serializable { ...@@ -1498,13 +1494,8 @@ class InetAddress implements java.io.Serializable {
class InetAddressImplFactory { class InetAddressImplFactory {
static InetAddressImpl create() { static InetAddressImpl create() {
Object o; return InetAddress.loadImpl(isIPv6Supported() ?
if (isIPv6Supported()) { "Inet6AddressImpl" : "Inet4AddressImpl");
o = InetAddress.loadImpl("Inet6AddressImpl");
} else {
o = InetAddress.loadImpl("Inet4AddressImpl");
}
return (InetAddressImpl)o;
} }
static native boolean isIPv6Supported(); static native boolean isIPv6Supported();
......
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute 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.nio.file;
/**
* Checked exception thrown when a file system loop, or cycle, is encountered.
*
* @since 1.7
* @see Files#walkFileTree
*/
public class FileSystemLoopException
extends FileSystemException
{
private static final long serialVersionUID = 4843039591949217617L;
/**
* Constructs an instance of this class.
*
* @param file
* a string identifying the file causing the cycle or {@code null} if
* not known
*/
public FileSystemLoopException(String file) {
super(file);
}
}
...@@ -38,7 +38,6 @@ import sun.nio.fs.BasicFileAttributesHolder; ...@@ -38,7 +38,6 @@ import sun.nio.fs.BasicFileAttributesHolder;
class FileTreeWalker { class FileTreeWalker {
private final boolean followLinks; private final boolean followLinks;
private final boolean detectCycles;
private final LinkOption[] linkOptions; private final LinkOption[] linkOptions;
private final FileVisitor<? super Path> visitor; private final FileVisitor<? super Path> visitor;
private final int maxDepth; private final int maxDepth;
...@@ -48,17 +47,15 @@ class FileTreeWalker { ...@@ -48,17 +47,15 @@ class FileTreeWalker {
int maxDepth) int maxDepth)
{ {
boolean fl = false; boolean fl = false;
boolean dc = false;
for (FileVisitOption option: options) { for (FileVisitOption option: options) {
// will throw NPE if options contains null
switch (option) { switch (option) {
case FOLLOW_LINKS : fl = true; break; case FOLLOW_LINKS : fl = true; break;
case DETECT_CYCLES : dc = true; break;
default: default:
throw new AssertionError("Should not get here"); throw new AssertionError("Should not get here");
} }
} }
this.followLinks = fl; this.followLinks = fl;
this.detectCycles = fl | dc;
this.linkOptions = (fl) ? new LinkOption[0] : this.linkOptions = (fl) ? new LinkOption[0] :
new LinkOption[] { LinkOption.NOFOLLOW_LINKS }; new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
this.visitor = visitor; this.visitor = visitor;
...@@ -68,13 +65,11 @@ class FileTreeWalker { ...@@ -68,13 +65,11 @@ class FileTreeWalker {
/** /**
* Walk file tree starting at the given file * Walk file tree starting at the given file
*/ */
void walk(Path start) { void walk(Path start) throws IOException {
FileVisitResult result = walk(start, FileVisitResult result = walk(start,
0, 0,
new ArrayList<AncestorDirectory>()); new ArrayList<AncestorDirectory>());
if (result == null) { Objects.nonNull(result, "FileVisitor returned null");
throw new NullPointerException("Visitor returned 'null'");
}
} }
/** /**
...@@ -88,11 +83,8 @@ class FileTreeWalker { ...@@ -88,11 +83,8 @@ class FileTreeWalker {
private FileVisitResult walk(Path file, private FileVisitResult walk(Path file,
int depth, int depth,
List<AncestorDirectory> ancestors) List<AncestorDirectory> ancestors)
throws IOException
{ {
// depth check
if (depth > maxDepth)
return FileVisitResult.CONTINUE;
// if attributes are cached then use them if possible // if attributes are cached then use them if possible
BasicFileAttributes attrs = null; BasicFileAttributes attrs = null;
if ((depth > 0) && if ((depth > 0) &&
...@@ -137,13 +129,13 @@ class FileTreeWalker { ...@@ -137,13 +129,13 @@ class FileTreeWalker {
return visitor.visitFileFailed(file, exc); return visitor.visitFileFailed(file, exc);
} }
// file is not a directory so invoke visitFile method // at maximum depth or file is not a directory
if (!attrs.isDirectory()) { if (depth >= maxDepth || !attrs.isDirectory()) {
return visitor.visitFile(file, attrs); return visitor.visitFile(file, attrs);
} }
// check for cycles // check for cycles when following links
if (detectCycles) { if (followLinks) {
Object key = attrs.fileKey(); Object key = attrs.fileKey();
// if this directory and ancestor has a file key then we compare // if this directory and ancestor has a file key then we compare
...@@ -153,19 +145,23 @@ class FileTreeWalker { ...@@ -153,19 +145,23 @@ class FileTreeWalker {
if (key != null && ancestorKey != null) { if (key != null && ancestorKey != null) {
if (key.equals(ancestorKey)) { if (key.equals(ancestorKey)) {
// cycle detected // cycle detected
return visitor.visitFile(file, attrs); return visitor.visitFileFailed(file,
new FileSystemLoopException(file.toString()));
} }
} else { } else {
boolean isSameFile = false;
try { try {
if (file.isSameFile(ancestor.file())) { isSameFile = file.isSameFile(ancestor.file());
// cycle detected
return visitor.visitFile(file, attrs);
}
} catch (IOException x) { } catch (IOException x) {
// ignore // ignore
} catch (SecurityException x) { } catch (SecurityException x) {
// ignore // ignore
} }
if (isSameFile) {
// cycle detected
return visitor.visitFileFailed(file,
new FileSystemLoopException(file.toString()));
}
} }
} }
...@@ -181,7 +177,7 @@ class FileTreeWalker { ...@@ -181,7 +177,7 @@ class FileTreeWalker {
try { try {
stream = file.newDirectoryStream(); stream = file.newDirectoryStream();
} catch (IOException x) { } catch (IOException x) {
return visitor.preVisitDirectoryFailed(file, x); return visitor.visitFileFailed(file, x);
} catch (SecurityException x) { } catch (SecurityException x) {
// ignore, as per spec // ignore, as per spec
return FileVisitResult.CONTINUE; return FileVisitResult.CONTINUE;
...@@ -192,20 +188,14 @@ class FileTreeWalker { ...@@ -192,20 +188,14 @@ class FileTreeWalker {
// invoke preVisitDirectory and then visit each entry // invoke preVisitDirectory and then visit each entry
try { try {
result = visitor.preVisitDirectory(file); result = visitor.preVisitDirectory(file, attrs);
if (result != FileVisitResult.CONTINUE) { if (result != FileVisitResult.CONTINUE) {
return result; return result;
} }
// if an I/O occurs during iteration then a CME is thrown. We
// need to distinguish this from a CME thrown by the visitor.
boolean inAction = false;
try { try {
for (Path entry: stream) { for (Path entry: stream) {
inAction = true;
result = walk(entry, depth+1, ancestors); result = walk(entry, depth+1, ancestors);
inAction = false;
// returning null will cause NPE to be thrown // returning null will cause NPE to be thrown
if (result == null || result == FileVisitResult.TERMINATE) if (result == null || result == FileVisitResult.TERMINATE)
...@@ -215,17 +205,9 @@ class FileTreeWalker { ...@@ -215,17 +205,9 @@ class FileTreeWalker {
if (result == FileVisitResult.SKIP_SIBLINGS) if (result == FileVisitResult.SKIP_SIBLINGS)
break; break;
} }
} catch (ConcurrentModificationException x) { } catch (DirectoryIteratorException e) {
// if CME thrown because the iteration failed then remember // IOException will be notified to postVisitDirectory
// the IOException so that it is notified to postVisitDirectory ioe = e.getCause();
if (!inAction) {
// iteration failed
Throwable t = x.getCause();
if (t instanceof IOException)
ioe = (IOException)t;
}
if (ioe == null)
throw x;
} }
} finally { } finally {
try { try {
...@@ -238,7 +220,7 @@ class FileTreeWalker { ...@@ -238,7 +220,7 @@ class FileTreeWalker {
} finally { } finally {
// remove key from trail if doing cycle detection // remove key from trail if doing cycle detection
if (detectCycles) { if (followLinks) {
ancestors.remove(ancestors.size()-1); ancestors.remove(ancestors.size()-1);
} }
} }
......
...@@ -37,9 +37,5 @@ public enum FileVisitOption { ...@@ -37,9 +37,5 @@ public enum FileVisitOption {
/** /**
* Follow symbolic links. * Follow symbolic links.
*/ */
FOLLOW_LINKS, FOLLOW_LINKS;
/**
* Detect cycles in the file tree.
*/
DETECT_CYCLES;
} }
...@@ -40,33 +40,28 @@ import java.io.IOException; ...@@ -40,33 +40,28 @@ import java.io.IOException;
* Path start = ... * Path start = ...
* Files.walkFileTree(start, new SimpleFileVisitor&lt;Path&gt;() { * Files.walkFileTree(start, new SimpleFileVisitor&lt;Path&gt;() {
* &#64;Override * &#64;Override
* public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { * public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
* try { * throws IOException
* file.delete(); * {
* } catch (IOException exc) { * file.delete();
* // failed to delete, do error handling here
* }
* return FileVisitResult.CONTINUE; * return FileVisitResult.CONTINUE;
* } * }
* &#64;Override * &#64;Override
* public FileVisitResult postVisitDirectory(Path dir, IOException e) { * public FileVisitResult postVisitDirectory(Path dir, IOException e)
* if (e == null) { * throws IOException
* try { * {
* dir.delete(); * if (e != null) {
* } catch (IOException exc) {
* // failed to delete, do error handling here
* }
* } else {
* // directory iteration failed * // directory iteration failed
* throw e;
* } * }
* dir.delete();
* return FileVisitResult.CONTINUE; * return FileVisitResult.CONTINUE;
* } * }
* }); * });
* </pre> * </pre>
* <p> Furthermore, suppose we want to copy a file tree rooted at a source * <p> Furthermore, suppose we want to copy a file tree to a target location.
* directory to a target location. In that case, symbolic links should be * In that case, symbolic links should be followed and the target directory
* followed and the target directory should be created before the entries in * should be created before the entries in the directory are copied.
* the directory are copied.
* <pre> * <pre>
* final Path source = ... * final Path source = ...
* final Path target = ... * final Path target = ...
...@@ -74,25 +69,21 @@ import java.io.IOException; ...@@ -74,25 +69,21 @@ import java.io.IOException;
* Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, * Files.walkFileTree(source, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE,
* new SimpleFileVisitor&lt;Path&gt;() { * new SimpleFileVisitor&lt;Path&gt;() {
* &#64;Override * &#64;Override
* public FileVisitResult preVisitDirectory(Path dir) { * public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
* throws IOException
* {
* try { * try {
* dir.copyTo(target.resolve(source.relativize(dir))); * dir.copyTo(target.resolve(source.relativize(dir)));
* } catch (FileAlreadyExistsException e) { * } catch (FileAlreadyExistsException e) {
* // ignore * // ignore
* } catch (IOException e) {
* // copy failed, do error handling here
* // skip rest of directory and descendants
* return SKIP_SUBTREE;
* } * }
* return CONTINUE; * return CONTINUE;
* } * }
* &#64;Override * &#64;Override
* public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { * public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
* try { * throws IOException
* file.copyTo(target.resolve(source.relativize(file))); * {
* } catch (IOException e) { * file.copyTo(target.resolve(source.relativize(file)));
* // copy failed, do error handling here
* }
* return CONTINUE; * return CONTINUE;
* } * }
* }); * });
...@@ -114,22 +105,16 @@ public interface FileVisitor<T> { ...@@ -114,22 +105,16 @@ public interface FileVisitor<T> {
* *
* @param dir * @param dir
* a reference to the directory * a reference to the directory
* @param attrs
* the directory's basic attributes
* *
* @return the visit result * @return the visit result
*/
FileVisitResult preVisitDirectory(T dir);
/**
* Invoked for a directory that could not be opened.
* *
* @param dir * @throws IOException
* a reference to the directory * if an I/O error occurs
* @param exc
* the I/O exception thrown from the attempt to open the directory
*
* @return the visit result
*/ */
FileVisitResult preVisitDirectoryFailed(T dir, IOException exc); FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
throws IOException;
/** /**
* Invoked for a file in a directory. * Invoked for a file in a directory.
...@@ -140,21 +125,30 @@ public interface FileVisitor<T> { ...@@ -140,21 +125,30 @@ public interface FileVisitor<T> {
* the file's basic attributes * the file's basic attributes
* *
* @return the visit result * @return the visit result
*
* @throws IOException
* if an I/O error occurs
*/ */
FileVisitResult visitFile(T file, BasicFileAttributes attrs); FileVisitResult visitFile(T file, BasicFileAttributes attrs)
throws IOException;
/** /**
* Invoked for a file when its basic file attributes could not be read. * Invoked for a file that could not be visited. This method is invoked
* if the file's attributes could not be read, the file is a directory
* that could not be opened, and other reasons.
* *
* @param file * @param file
* a reference to the file * a reference to the file
* @param exc * @param exc
* the I/O exception thrown from the attempt to read the file * the I/O exception that prevented the file from being visited
* attributes
* *
* @return the visit result * @return the visit result
*
* @throws IOException
* if an I/O error occurs
*/ */
FileVisitResult visitFileFailed(T file, IOException exc); FileVisitResult visitFileFailed(T file, IOException exc)
throws IOException;
/** /**
* Invoked for a directory after entries in the directory, and all of their * Invoked for a directory after entries in the directory, and all of their
...@@ -171,6 +165,10 @@ public interface FileVisitor<T> { ...@@ -171,6 +165,10 @@ public interface FileVisitor<T> {
* of the directory to complete prematurely * of the directory to complete prematurely
* *
* @return the visit result * @return the visit result
*
* @throws IOException
* if an I/O error occurs
*/ */
FileVisitResult postVisitDirectory(T dir, IOException exc); FileVisitResult postVisitDirectory(T dir, IOException exc)
throws IOException;
} }
...@@ -135,9 +135,9 @@ public final class Files { ...@@ -135,9 +135,9 @@ public final class Files {
* FileVisitor} invoked for each file encountered. File tree traversal * FileVisitor} invoked for each file encountered. File tree traversal
* completes when all accessible files in the tree have been visited, or a * completes when all accessible files in the tree have been visited, or a
* visit method returns a result of {@link FileVisitResult#TERMINATE * visit method returns a result of {@link FileVisitResult#TERMINATE
* TERMINATE}. Where a visit method terminates due an uncaught error or * TERMINATE}. Where a visit method terminates due an {@code IOException},
* runtime exception then the traversal is terminated and the error or * an uncaught error, or runtime exception, then the traversal is terminated
* exception is propagated to the caller of this method. * and the error or exception is propagated to the caller of this method.
* *
* <p> For each file encountered this method attempts to gets its {@link * <p> For each file encountered this method attempts to gets its {@link
* java.nio.file.attribute.BasicFileAttributes}. If the file is not a * java.nio.file.attribute.BasicFileAttributes}. If the file is not a
...@@ -146,12 +146,10 @@ public final class Files { ...@@ -146,12 +146,10 @@ public final class Files {
* due to an I/O exception, then the {@link FileVisitor#visitFileFailed * due to an I/O exception, then the {@link FileVisitor#visitFileFailed
* visitFileFailed} method is invoked with the I/O exception. * visitFileFailed} method is invoked with the I/O exception.
* *
* <p> Where the file is a directory, this method attempts to open it by * <p> Where the file is a directory, and the directory could not be opened,
* invoking its {@link Path#newDirectoryStream newDirectoryStream} method. * then the {@code visitFileFailed} method is invoked with the I/O exception,
* Where the directory could not be opened, due to an {@code IOException}, * after which, the file tree walk continues, by default, at the next
* then the {@link FileVisitor#preVisitDirectoryFailed preVisitDirectoryFailed} * <em>sibling</em> of the directory.
* method is invoked with the I/O exception, after which, the file tree walk
* continues, by default, at the next <em>sibling</em> of the directory.
* *
* <p> Where the directory is opened successfully, then the entries in the * <p> Where the directory is opened successfully, then the entries in the
* directory, and their <em>descendants</em> are visited. When all entries * directory, and their <em>descendants</em> are visited. When all entries
...@@ -171,26 +169,25 @@ public final class Files { ...@@ -171,26 +169,25 @@ public final class Files {
* method is invoked as specified above). * method is invoked as specified above).
* *
* <p> If the {@code options} parameter contains the {@link * <p> If the {@code options} parameter contains the {@link
* FileVisitOption#DETECT_CYCLES DETECT_CYCLES} or {@link * FileVisitOption#FOLLOW_LINKS FOLLOW_LINKS} option then this method keeps
* FileVisitOption#FOLLOW_LINKS FOLLOW_LINKS} options then this method keeps
* track of directories visited so that cycles can be detected. A cycle * track of directories visited so that cycles can be detected. A cycle
* arises when there is an entry in a directory that is an ancestor of the * arises when there is an entry in a directory that is an ancestor of the
* directory. Cycle detection is done by recording the {@link * directory. Cycle detection is done by recording the {@link
* java.nio.file.attribute.BasicFileAttributes#fileKey file-key} of directories, * java.nio.file.attribute.BasicFileAttributes#fileKey file-key} of directories,
* or if file keys are not available, by invoking the {@link Path#isSameFile * or if file keys are not available, by invoking the {@link Path#isSameFile
* isSameFile} method to test if a directory is the same file as an * isSameFile} method to test if a directory is the same file as an
* ancestor. When a cycle is detected the {@link FileVisitor#visitFile * ancestor. When a cycle is detected it is treated as an I/O error, and the
* visitFile} is invoked with the attributes of the directory. The {@link * {@link FileVisitor#visitFileFailed visitFileFailed} method is invoked with
* java.nio.file.attribute.BasicFileAttributes#isDirectory isDirectory} * an instance of {@link FileSystemLoopException}.
* method may be used to test if the file is a directory and that a cycle is
* detected. The {@code preVisitDirectory} and {@code postVisitDirectory}
* methods are not invoked.
* *
* <p> The {@code maxDepth} parameter is the maximum number of levels of * <p> The {@code maxDepth} parameter is the maximum number of levels of
* directories to visit. A value of {@code 0} means that only the starting * directories to visit. A value of {@code 0} means that only the starting
* file is visited, unless denied by the security manager. A value of * file is visited, unless denied by the security manager. A value of
* {@link Integer#MAX_VALUE MAX_VALUE} may be used to indicate that all * {@link Integer#MAX_VALUE MAX_VALUE} may be used to indicate that all
* levels should be visited. * levels should be visited. The {@code visitFile} method is invoked for all
* files, including directories, encountered at {@code maxDepth}, unless the
* basic file attributes cannot be read, in which case the {@code
* visitFileFailed} method is invoked.
* *
* <p> If a visitor returns a result of {@code null} then {@code * <p> If a visitor returns a result of {@code null} then {@code
* NullPointerException} is thrown. * NullPointerException} is thrown.
...@@ -215,11 +212,14 @@ public final class Files { ...@@ -215,11 +212,14 @@ public final class Files {
* In the case of the default provider, the {@link * In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked * SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory. * to check read access to the directory.
* @throws IOException
* If an I/O error is thrown by a visitor method
*/ */
public static void walkFileTree(Path start, public static void walkFileTree(Path start,
Set<FileVisitOption> options, Set<FileVisitOption> options,
int maxDepth, int maxDepth,
FileVisitor<? super Path> visitor) FileVisitor<? super Path> visitor)
throws IOException
{ {
if (maxDepth < 0) if (maxDepth < 0)
throw new IllegalArgumentException("'maxDepth' is negative"); throw new IllegalArgumentException("'maxDepth' is negative");
...@@ -245,8 +245,12 @@ public final class Files { ...@@ -245,8 +245,12 @@ public final class Files {
* In the case of the default provider, the {@link * In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked * SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory. * to check read access to the directory.
* @throws IOException
* If an I/O error is thrown by a visitor method
*/ */
public static void walkFileTree(Path start, FileVisitor<? super Path> visitor) { public static void walkFileTree(Path start, FileVisitor<? super Path> visitor)
throws IOException
{
walkFileTree(start, walkFileTree(start,
EnumSet.noneOf(FileVisitOption.class), EnumSet.noneOf(FileVisitOption.class),
Integer.MAX_VALUE, Integer.MAX_VALUE,
......
...@@ -27,7 +27,7 @@ package java.nio.file; ...@@ -27,7 +27,7 @@ package java.nio.file;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.io.IOException; import java.io.IOException;
import java.io.IOError; import java.util.Objects;
/** /**
* A simple visitor of files with default behavior to visit all files and to * A simple visitor of files with default behavior to visit all files and to
...@@ -47,14 +47,6 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> { ...@@ -47,14 +47,6 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
protected SimpleFileVisitor() { protected SimpleFileVisitor() {
} }
/**
* Throws NullPointerException if obj is null.
*/
private static void checkNotNull(Object obj) {
if (obj == null)
throw new NullPointerException();
}
/** /**
* Invoked for a directory before entries in the directory are visited. * Invoked for a directory before entries in the directory are visited.
* *
...@@ -62,28 +54,14 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> { ...@@ -62,28 +54,14 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
* CONTINUE}. * CONTINUE}.
*/ */
@Override @Override
public FileVisitResult preVisitDirectory(T dir) { public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
checkNotNull(dir); throws IOException
{
Objects.nonNull(dir);
Objects.nonNull(attrs);
return FileVisitResult.CONTINUE; return FileVisitResult.CONTINUE;
} }
/**
* Invoked for a directory that could not be opened.
*
* <p> Unless overridden, this method throws {@link IOError} with the I/O
* exception as cause.
*
* @throws IOError
* with the I/O exception thrown when the attempt to open the
* directory failed
*/
@Override
public FileVisitResult preVisitDirectoryFailed(T dir, IOException exc) {
checkNotNull(dir);
checkNotNull(exc);
throw new IOError(exc);
}
/** /**
* Invoked for a file in a directory. * Invoked for a file in a directory.
* *
...@@ -91,27 +69,26 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> { ...@@ -91,27 +69,26 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
* CONTINUE}. * CONTINUE}.
*/ */
@Override @Override
public FileVisitResult visitFile(T file, BasicFileAttributes attrs) { public FileVisitResult visitFile(T file, BasicFileAttributes attrs)
checkNotNull(file); throws IOException
checkNotNull(attrs); {
Objects.nonNull(file);
Objects.nonNull(attrs);
return FileVisitResult.CONTINUE; return FileVisitResult.CONTINUE;
} }
/** /**
* Invoked for a file when its basic file attributes could not be read. * Invoked for a file that could not be visited.
*
* <p> Unless overridden, this method throws {@link IOError} with the I/O
* exception as cause.
* *
* @throws IOError * <p> Unless overridden, this method re-throws the I/O exception that prevented
* with the I/O exception thrown when the attempt to read the file * the file from being visited.
* attributes failed
*/ */
@Override @Override
public FileVisitResult visitFileFailed(T file, IOException exc) { public FileVisitResult visitFileFailed(T file, IOException exc)
checkNotNull(file); throws IOException
checkNotNull(exc); {
throw new IOError(exc); Objects.nonNull(file);
throw exc;
} }
/** /**
...@@ -120,18 +97,16 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> { ...@@ -120,18 +97,16 @@ public class SimpleFileVisitor<T> implements FileVisitor<T> {
* *
* <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE * <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE
* CONTINUE} if the directory iteration completes without an I/O exception; * CONTINUE} if the directory iteration completes without an I/O exception;
* otherwise this method throws {@link IOError} with the I/O exception as * otherwise this method re-throws the I/O exception that caused the iteration
* cause. * of the directory to terminate prematurely.
*
* @throws IOError
* with the I/O exception thrown when iteration of the directory
* completed prematurely due to an I/O error
*/ */
@Override @Override
public FileVisitResult postVisitDirectory(T dir, IOException exc) { public FileVisitResult postVisitDirectory(T dir, IOException exc)
checkNotNull(dir); throws IOException
{
Objects.nonNull(dir);
if (exc != null) if (exc != null)
throw new IOError(exc); throw exc;
return FileVisitResult.CONTINUE; return FileVisitResult.CONTINUE;
} }
} }
...@@ -3643,7 +3643,7 @@ public interface DatabaseMetaData extends Wrapper { ...@@ -3643,7 +3643,7 @@ public interface DatabaseMetaData extends Wrapper {
/** /**
* Retrieves whether a generated key will always be returned if the column * Retrieves whether a generated key will always be returned if the column
* name(s) or indexe(s) specified for the auto generated key column(s) * name(s) or index(es) specified for the auto generated key column(s)
* are valid and the statement succeeds. The key that is returned may or * are valid and the statement succeeds. The key that is returned may or
* may not be based on the column(s) for the auto generated key. * may not be based on the column(s) for the auto generated key.
* Consult your JDBC driver documentation for additional details. * Consult your JDBC driver documentation for additional details.
......
...@@ -1051,9 +1051,9 @@ public interface Statement extends Wrapper, AutoCloseable { ...@@ -1051,9 +1051,9 @@ public interface Statement extends Wrapper, AutoCloseable {
/** /**
* Returns a value indicating whether this {@code Statement} will be * Returns a value indicating whether this {@code Statement} will be
* closed when all dependent objects such as resultsets are closed. * closed when all its dependent result sets are closed.
* @return {@code true} if the {@code Statement} will be closed when all * @return {@code true} if the {@code Statement} will be closed when all
* of its dependent objects are closed; {@code false} otherwise * of its dependent result sets are closed; {@code false} otherwise
* @throws SQLException if this method is called on a closed * @throws SQLException if this method is called on a closed
* {@code Statement} * {@code Statement}
* @since 1.7 * @since 1.7
......
...@@ -42,7 +42,6 @@ import java.util.Collections; ...@@ -42,7 +42,6 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.concurrent.AbstractExecutorService; import java.util.concurrent.AbstractExecutorService;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionException;
...@@ -823,15 +822,13 @@ public class ForkJoinPool extends AbstractExecutorService { ...@@ -823,15 +822,13 @@ public class ForkJoinPool extends AbstractExecutorService {
(workerCounts & RUNNING_COUNT_MASK) <= 1); (workerCounts & RUNNING_COUNT_MASK) <= 1);
long startTime = untimed? 0 : System.nanoTime(); long startTime = untimed? 0 : System.nanoTime();
Thread.interrupted(); // clear/ignore interrupt Thread.interrupted(); // clear/ignore interrupt
if (eventCount != ec || w.runState != 0 || if (eventCount != ec || w.isTerminating())
runState >= TERMINATING) // recheck after clear break; // recheck after clear
break;
if (untimed) if (untimed)
LockSupport.park(w); LockSupport.park(w);
else { else {
LockSupport.parkNanos(w, SHRINK_RATE_NANOS); LockSupport.parkNanos(w, SHRINK_RATE_NANOS);
if (eventCount != ec || w.runState != 0 || if (eventCount != ec || w.isTerminating())
runState >= TERMINATING)
break; break;
if (System.nanoTime() - startTime >= SHRINK_RATE_NANOS) if (System.nanoTime() - startTime >= SHRINK_RATE_NANOS)
tryShutdownUnusedWorker(ec); tryShutdownUnusedWorker(ec);
...@@ -899,16 +896,23 @@ public class ForkJoinPool extends AbstractExecutorService { ...@@ -899,16 +896,23 @@ public class ForkJoinPool extends AbstractExecutorService {
UNSAFE.compareAndSwapInt(this, workerCountsOffset, wc, UNSAFE.compareAndSwapInt(this, workerCountsOffset, wc,
wc + (ONE_RUNNING|ONE_TOTAL))) { wc + (ONE_RUNNING|ONE_TOTAL))) {
ForkJoinWorkerThread w = null; ForkJoinWorkerThread w = null;
Throwable fail = null;
try { try {
w = factory.newThread(this); w = factory.newThread(this);
} finally { // adjust on null or exceptional factory return } catch (Throwable ex) {
if (w == null) { fail = ex;
decrementWorkerCounts(ONE_RUNNING, ONE_TOTAL);
tryTerminate(false); // handle failure during shutdown
}
} }
if (w == null) if (w == null) { // null or exceptional factory return
decrementWorkerCounts(ONE_RUNNING, ONE_TOTAL);
tryTerminate(false); // handle failure during shutdown
// If originating from an external caller,
// propagate exception, else ignore
if (fail != null && runState < TERMINATING &&
!(Thread.currentThread() instanceof
ForkJoinWorkerThread))
UNSAFE.throwException(fail);
break; break;
}
w.start(recordWorker(w), ueh); w.start(recordWorker(w), ueh);
if ((workerCounts >>> TOTAL_COUNT_SHIFT) >= pc) { if ((workerCounts >>> TOTAL_COUNT_SHIFT) >= pc) {
int c; // advance event count int c; // advance event count
...@@ -997,8 +1001,12 @@ public class ForkJoinPool extends AbstractExecutorService { ...@@ -997,8 +1001,12 @@ public class ForkJoinPool extends AbstractExecutorService {
boolean active = w.active; boolean active = w.active;
boolean inactivate = false; boolean inactivate = false;
int pc = parallelism; int pc = parallelism;
int rs; while (w.runState == 0) {
while (w.runState == 0 && (rs = runState) < TERMINATING) { int rs = runState;
if (rs >= TERMINATING) { // propagate shutdown
w.shutdown();
break;
}
if ((inactivate || (active && (rs & ACTIVE_COUNT_MASK) >= pc)) && if ((inactivate || (active && (rs & ACTIVE_COUNT_MASK) >= pc)) &&
UNSAFE.compareAndSwapInt(this, runStateOffset, rs, rs - 1)) UNSAFE.compareAndSwapInt(this, runStateOffset, rs, rs - 1))
inactivate = active = w.active = false; inactivate = active = w.active = false;
...@@ -1126,6 +1134,7 @@ public class ForkJoinPool extends AbstractExecutorService { ...@@ -1126,6 +1134,7 @@ public class ForkJoinPool extends AbstractExecutorService {
return true; return true;
} }
/** /**
* Actions on transition to TERMINATING * Actions on transition to TERMINATING
* *
...@@ -1149,7 +1158,7 @@ public class ForkJoinPool extends AbstractExecutorService { ...@@ -1149,7 +1158,7 @@ public class ForkJoinPool extends AbstractExecutorService {
if (passes > 0 && !w.isTerminated()) { if (passes > 0 && !w.isTerminated()) {
w.cancelTasks(); w.cancelTasks();
LockSupport.unpark(w); LockSupport.unpark(w);
if (passes > 1) { if (passes > 1 && !w.isInterrupted()) {
try { try {
w.interrupt(); w.interrupt();
} catch (SecurityException ignore) { } catch (SecurityException ignore) {
...@@ -1725,6 +1734,13 @@ public class ForkJoinPool extends AbstractExecutorService { ...@@ -1725,6 +1734,13 @@ public class ForkJoinPool extends AbstractExecutorService {
return (runState & (TERMINATING|TERMINATED)) == TERMINATING; return (runState & (TERMINATING|TERMINATED)) == TERMINATING;
} }
/**
* Returns true if terminating or terminated. Used by ForkJoinWorkerThread.
*/
final boolean isAtLeastTerminating() {
return runState >= TERMINATING;
}
/** /**
* Returns {@code true} if this pool has been shut down. * Returns {@code true} if this pool has been shut down.
* *
......
...@@ -55,10 +55,10 @@ import java.util.WeakHashMap; ...@@ -55,10 +55,10 @@ import java.util.WeakHashMap;
* start other subtasks. As indicated by the name of this class, * start other subtasks. As indicated by the name of this class,
* many programs using {@code ForkJoinTask} employ only methods * many programs using {@code ForkJoinTask} employ only methods
* {@link #fork} and {@link #join}, or derivatives such as {@link * {@link #fork} and {@link #join}, or derivatives such as {@link
* #invokeAll}. However, this class also provides a number of other * #invokeAll(ForkJoinTask...) invokeAll}. However, this class also
* methods that can come into play in advanced usages, as well as * provides a number of other methods that can come into play in
* extension mechanics that allow support of new forms of fork/join * advanced usages, as well as extension mechanics that allow
* processing. * support of new forms of fork/join processing.
* *
* <p>A {@code ForkJoinTask} is a lightweight form of {@link Future}. * <p>A {@code ForkJoinTask} is a lightweight form of {@link Future}.
* The efficiency of {@code ForkJoinTask}s stems from a set of * The efficiency of {@code ForkJoinTask}s stems from a set of
...@@ -250,7 +250,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { ...@@ -250,7 +250,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
int s; // the odd construction reduces lock bias effects int s; // the odd construction reduces lock bias effects
while ((s = status) >= 0) { while ((s = status) >= 0) {
try { try {
synchronized(this) { synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL)) if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL))
wait(); wait();
} }
...@@ -270,7 +270,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { ...@@ -270,7 +270,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
int s; int s;
if ((s = status) >= 0) { if ((s = status) >= 0) {
try { try {
synchronized(this) { synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL)) if (UNSAFE.compareAndSwapInt(this, statusOffset, s,SIGNAL))
wait(millis, 0); wait(millis, 0);
} }
...@@ -288,7 +288,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { ...@@ -288,7 +288,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
private void externalAwaitDone() { private void externalAwaitDone() {
int s; int s;
while ((s = status) >= 0) { while ((s = status) >= 0) {
synchronized(this) { synchronized (this) {
if (UNSAFE.compareAndSwapInt(this, statusOffset, s, SIGNAL)){ if (UNSAFE.compareAndSwapInt(this, statusOffset, s, SIGNAL)){
boolean interrupted = false; boolean interrupted = false;
while (status >= 0) { while (status >= 0) {
...@@ -669,11 +669,34 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { ...@@ -669,11 +669,34 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
setCompletion(NORMAL); setCompletion(NORMAL);
} }
/**
* Waits if necessary for the computation to complete, and then
* retrieves its result.
*
* @return the computed result
* @throws CancellationException if the computation was cancelled
* @throws ExecutionException if the computation threw an
* exception
* @throws InterruptedException if the current thread is not a
* member of a ForkJoinPool and was interrupted while waiting
*/
public final V get() throws InterruptedException, ExecutionException { public final V get() throws InterruptedException, ExecutionException {
quietlyJoin(); int s;
if (Thread.interrupted()) if (Thread.currentThread() instanceof ForkJoinWorkerThread) {
throw new InterruptedException(); quietlyJoin();
int s = status; s = status;
}
else {
while ((s = status) >= 0) {
synchronized (this) { // interruptible form of awaitDone
if (UNSAFE.compareAndSwapInt(this, statusOffset,
s, SIGNAL)) {
while (status >= 0)
wait();
}
}
}
}
if (s < NORMAL) { if (s < NORMAL) {
Throwable ex; Throwable ex;
if (s == CANCELLED) if (s == CANCELLED)
...@@ -684,6 +707,20 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { ...@@ -684,6 +707,20 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
return getRawResult(); return getRawResult();
} }
/**
* Waits if necessary for at most the given time for the computation
* to complete, and then retrieves its result, if available.
*
* @param timeout the maximum time to wait
* @param unit the time unit of the timeout argument
* @return the computed result
* @throws CancellationException if the computation was cancelled
* @throws ExecutionException if the computation threw an
* exception
* @throws InterruptedException if the current thread is not a
* member of a ForkJoinPool and was interrupted while waiting
* @throws TimeoutException if the wait timed out
*/
public final V get(long timeout, TimeUnit unit) public final V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException { throws InterruptedException, ExecutionException, TimeoutException {
Thread t = Thread.currentThread(); Thread t = Thread.currentThread();
...@@ -725,7 +762,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable { ...@@ -725,7 +762,7 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
long ms = nt / 1000000; long ms = nt / 1000000;
int ns = (int) (nt % 1000000); int ns = (int) (nt % 1000000);
try { try {
synchronized(this) { synchronized (this) {
if (status >= 0) if (status >= 0)
wait(ms, ns); wait(ms, ns);
} }
......
...@@ -778,11 +778,20 @@ public class ForkJoinWorkerThread extends Thread { ...@@ -778,11 +778,20 @@ public class ForkJoinWorkerThread extends Thread {
// status check methods used mainly by ForkJoinPool // status check methods used mainly by ForkJoinPool
final boolean isRunning() { return runState == 0; } final boolean isRunning() { return runState == 0; }
final boolean isTerminating() { return (runState & TERMINATING) != 0; }
final boolean isTerminated() { return (runState & TERMINATED) != 0; } final boolean isTerminated() { return (runState & TERMINATED) != 0; }
final boolean isSuspended() { return (runState & SUSPENDED) != 0; } final boolean isSuspended() { return (runState & SUSPENDED) != 0; }
final boolean isTrimmed() { return (runState & TRIMMED) != 0; } final boolean isTrimmed() { return (runState & TRIMMED) != 0; }
final boolean isTerminating() {
if ((runState & TERMINATING) != 0)
return true;
if (pool.isAtLeastTerminating()) { // propagate pool state
shutdown();
return true;
}
return false;
}
/** /**
* Sets state to TERMINATING. Does NOT unpark or interrupt * Sets state to TERMINATING. Does NOT unpark or interrupt
* to wake up if currently blocked. Callers must do so if desired. * to wake up if currently blocked. Callers must do so if desired.
......
...@@ -138,7 +138,7 @@ package java.util.concurrent; ...@@ -138,7 +138,7 @@ package java.util.concurrent;
* if (right.tryUnfork()) // directly calculate if not stolen * if (right.tryUnfork()) // directly calculate if not stolen
* sum += right.atLeaf(right.lo, right.hi); * sum += right.atLeaf(right.lo, right.hi);
* else { * else {
* right.helpJoin(); * right.join();
* sum += right.result; * sum += right.result;
* } * }
* right = right.next; * right = right.next;
......
...@@ -690,6 +690,11 @@ public class LogManager { ...@@ -690,6 +690,11 @@ public class LogManager {
* Note that since untrusted code may create loggers with * Note that since untrusted code may create loggers with
* arbitrary names this method should not be relied on to * arbitrary names this method should not be relied on to
* find Loggers for security sensitive logging. * find Loggers for security sensitive logging.
* It is also important to note that the Logger associated with the
* String {@code name} may be garbage collected at any time if there
* is no strong reference to the Logger. The caller of this method
* must check the return value for null in order to properly handle
* the case where the Logger has been garbage collected.
* <p> * <p>
* @param name name of the logger * @param name name of the logger
* @return matching logger or null if none is found * @return matching logger or null if none is found
...@@ -713,6 +718,14 @@ public class LogManager { ...@@ -713,6 +718,14 @@ public class LogManager {
* <p> * <p>
* Note: Loggers may be added dynamically as new classes are loaded. * Note: Loggers may be added dynamically as new classes are loaded.
* This method only reports on the loggers that are currently registered. * This method only reports on the loggers that are currently registered.
* It is also important to note that this method only returns the name
* of a Logger, not a strong reference to the Logger itself.
* The returned String does nothing to prevent the Logger from being
* garbage collected. In particular, if the returned name is passed
* to {@code LogManager.getLogger()}, then the caller must check the
* return value from {@code LogManager.getLogger()} for null to properly
* handle the case where the Logger has been garbage collected in the
* time since its name was returned by this method.
* <p> * <p>
* @return enumeration of logger name strings * @return enumeration of logger name strings
*/ */
......
...@@ -42,7 +42,10 @@ import java.lang.ref.WeakReference; ...@@ -42,7 +42,10 @@ import java.lang.ref.WeakReference;
* <p> * <p>
* Logger objects may be obtained by calls on one of the getLogger * Logger objects may be obtained by calls on one of the getLogger
* factory methods. These will either create a new Logger or * factory methods. These will either create a new Logger or
* return a suitable existing Logger. * return a suitable existing Logger. It is important to note that
* the Logger returned by one of the {@code getLogger} factory methods
* may be garbage collected at any time if a strong reference to the
* Logger is not kept.
* <p> * <p>
* Logging messages will be forwarded to registered Handler * Logging messages will be forwarded to registered Handler
* objects, which can forward the messages to a variety of * objects, which can forward the messages to a variety of
...@@ -210,7 +213,9 @@ public class Logger { ...@@ -210,7 +213,9 @@ public class Logger {
* who are making serious use of the logging package (for example * who are making serious use of the logging package (for example
* in products) should create and use their own Logger objects, * in products) should create and use their own Logger objects,
* with appropriate names, so that logging can be controlled on a * with appropriate names, so that logging can be controlled on a
* suitable per-Logger granularity. * suitable per-Logger granularity. Developers also need to keep a
* strong reference to their Logger objects to prevent them from
* being garbage collected.
* <p> * <p>
* @deprecated Initialization of this field is prone to deadlocks. * @deprecated Initialization of this field is prone to deadlocks.
* The field must be initialized by the Logger class initialization * The field must be initialized by the Logger class initialization
...@@ -287,6 +292,15 @@ public class Logger { ...@@ -287,6 +292,15 @@ public class Logger {
* based on the LogManager configuration and it will configured * based on the LogManager configuration and it will configured
* to also send logging output to its parent's Handlers. It will * to also send logging output to its parent's Handlers. It will
* be registered in the LogManager global namespace. * be registered in the LogManager global namespace.
* <p>
* Note: The LogManager may only retain a weak reference to the newly
* created Logger. It is important to understand that a previously
* created Logger with the given name may be garbage collected at any
* time if there is no strong reference to the Logger. In particular,
* this means that two back-to-back calls like
* {@code getLogger("MyLogger").log(...)} may use different Logger
* objects named "MyLogger" if there is no strong reference to the
* Logger named "MyLogger" elsewhere in the program.
* *
* @param name A name for the logger. This should * @param name A name for the logger. This should
* be a dot-separated name and should normally * be a dot-separated name and should normally
...@@ -311,6 +325,15 @@ public class Logger { ...@@ -311,6 +325,15 @@ public class Logger {
* output to its parent's Handlers. It will be registered in * output to its parent's Handlers. It will be registered in
* the LogManager global namespace. * the LogManager global namespace.
* <p> * <p>
* Note: The LogManager may only retain a weak reference to the newly
* created Logger. It is important to understand that a previously
* created Logger with the given name may be garbage collected at any
* time if there is no strong reference to the Logger. In particular,
* this means that two back-to-back calls like
* {@code getLogger("MyLogger", ...).log(...)} may use different Logger
* objects named "MyLogger" if there is no strong reference to the
* Logger named "MyLogger" elsewhere in the program.
* <p>
* If the named Logger already exists and does not yet have a * If the named Logger already exists and does not yet have a
* localization resource bundle then the given resource bundle * localization resource bundle then the given resource bundle
* name is used. If the named Logger already exists and has * name is used. If the named Logger already exists and has
......
/* /*
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -734,7 +734,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -734,7 +734,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setCommand"); throw new SQLException("Set initParams() before setCommand");
} }
params.clear(); params.clear();
command = new String(cmd); command = cmd;
} }
} }
...@@ -797,7 +797,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -797,7 +797,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Invalid url string detected. " + throw new SQLException("Invalid url string detected. " +
"Cannot be of length less than 1"); "Cannot be of length less than 1");
} else { } else {
URL = new String(url); URL = url;
} }
dataSource = null; dataSource = null;
...@@ -854,7 +854,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -854,7 +854,7 @@ public static final int ASCII_STREAM_PARAM = 2;
} else if (name.equals("")) { } else if (name.equals("")) {
throw new SQLException("DataSource name cannot be empty string"); throw new SQLException("DataSource name cannot be empty string");
} else { } else {
dataSource = new String(name); dataSource = name;
} }
URL = null; URL = null;
...@@ -889,7 +889,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -889,7 +889,7 @@ public static final int ASCII_STREAM_PARAM = 2;
{ {
username = null; username = null;
} else { } else {
username = new String(name); username = name;
} }
} }
...@@ -924,7 +924,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -924,7 +924,7 @@ public static final int ASCII_STREAM_PARAM = 2;
{ {
password = null; password = null;
} else { } else {
password = new String(pass); password = pass;
} }
} }
...@@ -1563,13 +1563,13 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1563,13 +1563,13 @@ public static final int ASCII_STREAM_PARAM = 2;
nullVal = new Object[2]; nullVal = new Object[2];
nullVal[0] = null; nullVal[0] = null;
nullVal[1] = new Integer(sqlType); nullVal[1] = Integer.valueOf(sqlType);
if (params == null){ if (params == null){
throw new SQLException("Set initParams() before setNull"); throw new SQLException("Set initParams() before setNull");
} }
params.put(new Integer(parameterIndex - 1), nullVal); params.put(Integer.valueOf(parameterIndex - 1), nullVal);
} }
/** /**
...@@ -1644,14 +1644,14 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1644,14 +1644,14 @@ public static final int ASCII_STREAM_PARAM = 2;
nullVal = new Object[3]; nullVal = new Object[3];
nullVal[0] = null; nullVal[0] = null;
nullVal[1] = new Integer(sqlType); nullVal[1] = Integer.valueOf(sqlType);
nullVal[2] = new String(typeName); nullVal[2] = typeName;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setNull"); throw new SQLException("Set initParams() before setNull");
} }
params.put(new Integer(parameterIndex - 1), nullVal); params.put(Integer.valueOf(parameterIndex - 1), nullVal);
} }
...@@ -1686,7 +1686,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1686,7 +1686,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setNull"); throw new SQLException("Set initParams() before setNull");
} }
params.put(new Integer(parameterIndex - 1), new Boolean(x)); params.put(Integer.valueOf(parameterIndex - 1), Boolean.valueOf(x));
} }
/** /**
...@@ -1720,7 +1720,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1720,7 +1720,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setByte"); throw new SQLException("Set initParams() before setByte");
} }
params.put(new Integer(parameterIndex - 1), new Byte(x)); params.put(Integer.valueOf(parameterIndex - 1), Byte.valueOf(x));
} }
/** /**
...@@ -1754,7 +1754,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1754,7 +1754,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setShort"); throw new SQLException("Set initParams() before setShort");
} }
params.put(new Integer(parameterIndex - 1), new Short(x)); params.put(Integer.valueOf(parameterIndex - 1), Short.valueOf(x));
} }
/** /**
...@@ -1786,7 +1786,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1786,7 +1786,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setInt"); throw new SQLException("Set initParams() before setInt");
} }
params.put(new Integer(parameterIndex - 1), new Integer(x)); params.put(Integer.valueOf(parameterIndex - 1), Integer.valueOf(x));
} }
/** /**
...@@ -1818,7 +1818,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1818,7 +1818,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setLong"); throw new SQLException("Set initParams() before setLong");
} }
params.put(new Integer(parameterIndex - 1), new Long(x)); params.put(Integer.valueOf(parameterIndex - 1), Long.valueOf(x));
} }
/** /**
...@@ -1850,7 +1850,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1850,7 +1850,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setFloat"); throw new SQLException("Set initParams() before setFloat");
} }
params.put(new Integer(parameterIndex - 1), new Float(x)); params.put(Integer.valueOf(parameterIndex - 1), new Float(x));
} }
/** /**
...@@ -1882,7 +1882,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1882,7 +1882,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setDouble"); throw new SQLException("Set initParams() before setDouble");
} }
params.put(new Integer(parameterIndex - 1), new Double(x)); params.put(Integer.valueOf(parameterIndex - 1), new Double(x));
} }
/** /**
...@@ -1914,7 +1914,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1914,7 +1914,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setBigDecimal"); throw new SQLException("Set initParams() before setBigDecimal");
} }
params.put(new Integer(parameterIndex - 1), x); params.put(Integer.valueOf(parameterIndex - 1), x);
} }
/** /**
...@@ -1948,7 +1948,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1948,7 +1948,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setString"); throw new SQLException("Set initParams() before setString");
} }
params.put(new Integer(parameterIndex - 1), x); params.put(Integer.valueOf(parameterIndex - 1), x);
} }
/** /**
...@@ -1982,7 +1982,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -1982,7 +1982,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setBytes"); throw new SQLException("Set initParams() before setBytes");
} }
params.put(new Integer(parameterIndex - 1), x); params.put(Integer.valueOf(parameterIndex - 1), x);
} }
/** /**
...@@ -2024,7 +2024,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2024,7 +2024,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setDate"); throw new SQLException("Set initParams() before setDate");
} }
params.put(new Integer(parameterIndex - 1), x); params.put(Integer.valueOf(parameterIndex - 1), x);
} }
/** /**
...@@ -2069,7 +2069,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2069,7 +2069,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setTime"); throw new SQLException("Set initParams() before setTime");
} }
params.put(new Integer(parameterIndex - 1), x); params.put(Integer.valueOf(parameterIndex - 1), x);
} }
/** /**
...@@ -2112,7 +2112,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2112,7 +2112,7 @@ public static final int ASCII_STREAM_PARAM = 2;
throw new SQLException("Set initParams() before setTimestamp"); throw new SQLException("Set initParams() before setTimestamp");
} }
params.put(new Integer(parameterIndex - 1), x); params.put(Integer.valueOf(parameterIndex - 1), x);
} }
/** /**
...@@ -2185,14 +2185,14 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2185,14 +2185,14 @@ public static final int ASCII_STREAM_PARAM = 2;
asciiStream = new Object[3]; asciiStream = new Object[3];
asciiStream[0] = x; asciiStream[0] = x;
asciiStream[1] = new Integer(length); asciiStream[1] = Integer.valueOf(length);
asciiStream[2] = new Integer(ASCII_STREAM_PARAM); asciiStream[2] = Integer.valueOf(ASCII_STREAM_PARAM);
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setAsciiStream"); throw new SQLException("Set initParams() before setAsciiStream");
} }
params.put(new Integer(parameterIndex - 1), asciiStream); params.put(Integer.valueOf(parameterIndex - 1), asciiStream);
} }
/** /**
...@@ -2290,13 +2290,13 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2290,13 +2290,13 @@ public static final int ASCII_STREAM_PARAM = 2;
binaryStream = new Object[3]; binaryStream = new Object[3];
binaryStream[0] = x; binaryStream[0] = x;
binaryStream[1] = new Integer(length); binaryStream[1] = Integer.valueOf(length);
binaryStream[2] = new Integer(BINARY_STREAM_PARAM); binaryStream[2] = Integer.valueOf(BINARY_STREAM_PARAM);
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setBinaryStream"); throw new SQLException("Set initParams() before setBinaryStream");
} }
params.put(new Integer(parameterIndex - 1), binaryStream); params.put(Integer.valueOf(parameterIndex - 1), binaryStream);
} }
...@@ -2396,12 +2396,12 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2396,12 +2396,12 @@ public static final int ASCII_STREAM_PARAM = 2;
unicodeStream = new Object[3]; unicodeStream = new Object[3];
unicodeStream[0] = x; unicodeStream[0] = x;
unicodeStream[1] = new Integer(length); unicodeStream[1] = Integer.valueOf(length);
unicodeStream[2] = new Integer(UNICODE_STREAM_PARAM); unicodeStream[2] = Integer.valueOf(UNICODE_STREAM_PARAM);
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setUnicodeStream"); throw new SQLException("Set initParams() before setUnicodeStream");
} }
params.put(new Integer(parameterIndex - 1), unicodeStream); params.put(Integer.valueOf(parameterIndex - 1), unicodeStream);
} }
/** /**
...@@ -2475,11 +2475,11 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2475,11 +2475,11 @@ public static final int ASCII_STREAM_PARAM = 2;
charStream = new Object[2]; charStream = new Object[2];
charStream[0] = reader; charStream[0] = reader;
charStream[1] = new Integer(length); charStream[1] = Integer.valueOf(length);
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setCharacterStream"); throw new SQLException("Set initParams() before setCharacterStream");
} }
params.put(new Integer(parameterIndex - 1), charStream); params.put(Integer.valueOf(parameterIndex - 1), charStream);
} }
/** /**
...@@ -2591,12 +2591,12 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2591,12 +2591,12 @@ public static final int ASCII_STREAM_PARAM = 2;
obj = new Object[3]; obj = new Object[3];
obj[0] = x; obj[0] = x;
obj[1] = new Integer(targetSqlType); obj[1] = Integer.valueOf(targetSqlType);
obj[2] = new Integer(scale); obj[2] = Integer.valueOf(scale);
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setObject"); throw new SQLException("Set initParams() before setObject");
} }
params.put(new Integer(parameterIndex - 1), obj); params.put(Integer.valueOf(parameterIndex - 1), obj);
} }
/** /**
...@@ -2654,11 +2654,11 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2654,11 +2654,11 @@ public static final int ASCII_STREAM_PARAM = 2;
obj = new Object[2]; obj = new Object[2];
obj[0] = x; obj[0] = x;
obj[1] = new Integer(targetSqlType); obj[1] = Integer.valueOf(targetSqlType);
if (params == null){ if (params == null){
throw new SQLException("Set initParams() before setObject"); throw new SQLException("Set initParams() before setObject");
} }
params.put(new Integer(parameterIndex - 1), obj); params.put(Integer.valueOf(parameterIndex - 1), obj);
} }
/** /**
...@@ -2726,7 +2726,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2726,7 +2726,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if (params == null) { if (params == null) {
throw new SQLException("Set initParams() before setObject"); throw new SQLException("Set initParams() before setObject");
} }
params.put(new Integer(parameterIndex - 1), x); params.put(Integer.valueOf(parameterIndex - 1), x);
} }
/** /**
...@@ -2773,7 +2773,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2773,7 +2773,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if (params == null) { if (params == null) {
throw new SQLException("Set initParams() before setRef"); throw new SQLException("Set initParams() before setRef");
} }
params.put(new Integer(parameterIndex - 1), new SerialRef(ref)); params.put(Integer.valueOf(parameterIndex - 1), new SerialRef(ref));
} }
/** /**
...@@ -2817,7 +2817,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2817,7 +2817,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setBlob"); throw new SQLException("Set initParams() before setBlob");
} }
params.put(new Integer(parameterIndex - 1), new SerialBlob(x)); params.put(Integer.valueOf(parameterIndex - 1), new SerialBlob(x));
} }
/** /**
...@@ -2862,7 +2862,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2862,7 +2862,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setClob"); throw new SQLException("Set initParams() before setClob");
} }
params.put(new Integer(parameterIndex - 1), new SerialClob(x)); params.put(Integer.valueOf(parameterIndex - 1), new SerialClob(x));
} }
/** /**
...@@ -2910,7 +2910,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2910,7 +2910,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if (params == null){ if (params == null){
throw new SQLException("Set initParams() before setArray"); throw new SQLException("Set initParams() before setArray");
} }
params.put(new Integer(parameterIndex - 1), new SerialArray(array)); params.put(Integer.valueOf(parameterIndex - 1), new SerialArray(array));
} }
/** /**
...@@ -2975,7 +2975,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -2975,7 +2975,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setDate"); throw new SQLException("Set initParams() before setDate");
} }
params.put(new Integer(parameterIndex - 1), date); params.put(Integer.valueOf(parameterIndex - 1), date);
} }
/** /**
...@@ -3041,7 +3041,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -3041,7 +3041,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setTime"); throw new SQLException("Set initParams() before setTime");
} }
params.put(new Integer(parameterIndex - 1), time); params.put(Integer.valueOf(parameterIndex - 1), time);
} }
/** /**
...@@ -3107,7 +3107,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -3107,7 +3107,7 @@ public static final int ASCII_STREAM_PARAM = 2;
if(params == null){ if(params == null){
throw new SQLException("Set initParams() before setTimestamp"); throw new SQLException("Set initParams() before setTimestamp");
} }
params.put(new Integer(parameterIndex - 1), timestamp); params.put(Integer.valueOf(parameterIndex - 1), timestamp);
} }
/** /**
...@@ -3181,7 +3181,7 @@ public static final int ASCII_STREAM_PARAM = 2; ...@@ -3181,7 +3181,7 @@ public static final int ASCII_STREAM_PARAM = 2;
Object[] paramsArray = new Object[params.size()]; Object[] paramsArray = new Object[params.size()];
for (int i = 0; i < params.size(); i++) { for (int i = 0; i < params.size(); i++) {
paramsArray[i] = params.get(new Integer(i)); paramsArray[i] = params.get(Integer.valueOf(i));
if (paramsArray[i] == null) { if (paramsArray[i] == null) {
throw new SQLException("missing parameter: " + (i + 1)); throw new SQLException("missing parameter: " + (i + 1));
} //end if } //end if
......
...@@ -39,7 +39,7 @@ import javax.sql.rowset.spi.*; ...@@ -39,7 +39,7 @@ import javax.sql.rowset.spi.*;
* <code>CachedRowSet</code> must implement. * <code>CachedRowSet</code> must implement.
* <P> * <P>
* The reference implementation of the <code>CachedRowSet</code> interface provided * The reference implementation of the <code>CachedRowSet</code> interface provided
* by Sun Microsystems is a standard implementation. Developers may use this implementation * by Oracle Corporation is a standard implementation. Developers may use this implementation
* just as it is, they may extend it, or they may choose to write their own implementations * just as it is, they may extend it, or they may choose to write their own implementations
* of this interface. * of this interface.
* <P> * <P>
...@@ -1623,4 +1623,3 @@ public interface CachedRowSet extends RowSet, Joinable { ...@@ -1623,4 +1623,3 @@ public interface CachedRowSet extends RowSet, Joinable {
public boolean previousPage() throws SQLException; public boolean previousPage() throws SQLException;
} }
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册