--- a/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -288,3 +288,5 @@
6494b13f88a867026ee316b444d9a4fa589dd6bd jdk9-b43
abbfccd659b91a7bb815d5e36fed635dcdd40f31 jdk9-b44
bfc24ae2b900187585079bb11e66e459d1e525fe jdk9-b45
+722378bc599e38d9a1dd484de30f10dfd7b21438 jdk9-b46
+8327024a99559982b848e9c2191da9c0bf8838fd jdk9-b47
--- a/.hgtags-top-repo Mon Jan 26 19:01:50 2015 +0300
+++ b/.hgtags-top-repo Tue Jan 27 13:58:55 2015 -0500
@@ -288,3 +288,5 @@
02ee8c65622e8bd97496d584e22fc7dcf0edc4ae jdk9-b43
8994f5d87b3bb5e8d317d4e8ccb326da1a73684a jdk9-b44
3dd628fde2086218d548841022ee8436b6b88185 jdk9-b45
+12f1e276447bcc81516e85367d53e4f08897049d jdk9-b46
+b6cca3e6175a69f39e5799b7349ddb0176630291 jdk9-b47
--- a/common/autoconf/configure Mon Jan 26 19:01:50 2015 +0300
+++ b/common/autoconf/configure Tue Jan 27 13:58:55 2015 -0500
@@ -36,6 +36,13 @@
shift
fi
+if test "x$BASH" = x; then
+ echo "Error: This script must be run using bash." 1>&2
+ exit 1
+fi
+# Force autoconf to use bash
+export CONFIG_SHELL=$BASH
+
conf_script_dir="$TOPDIR/common/autoconf"
if [ "$CUSTOM_CONFIG_DIR" = "" ]; then
--- a/common/bin/compare.sh Mon Jan 26 19:01:50 2015 +0300
+++ b/common/bin/compare.sh Tue Jan 27 13:58:55 2015 -0500
@@ -22,7 +22,7 @@
# questions.
#
-# This script is processed by configure before it's usable. It is run from
+# This script is processed by configure before it's usable. It is run from
# the root of the build directory.
@@ -76,10 +76,13 @@
TMP=1
if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then
+ # Filter out date string, ant version and java version differences.
TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
$GREP '^[<>]' | \
$SED -e '/[<>] Ant-Version: Apache Ant .*/d' \
- -e '/[<>] Created-By: .* (Oracle Corporation).*/d')
+ -e '/[<>] Created-By: .* (Oracle [Corpatin)]*/d' \
+ -e '/[<>] [Corpatin]*)/d' \
+ -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d')
fi
if test "x$SUFFIX" = "xjava"; then
TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
@@ -92,7 +95,7 @@
-e '/\/\/ java GenerateCharacter.*/d')
fi
# Ignore date strings in class files.
- # On Macosx the system sources for generated java classes produce different output on
+ # On Macosx the system sources for generated java classes produce different output on
# consequtive invocations seemingly randomly.
# For example a method parameter randomly named "thePoint" or "aPoint". Ignore this.
# Anonymous lambda classes get randomly assigned counters in their names.
@@ -100,18 +103,18 @@
# To improve performance when large diffs are found, do a rough filtering of classes
# elibeble for these exceptions
if $GREP -R -e '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}' \
- -e '[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}' \
- -e thePoint -e aPoint -e setItemsPtr \
+ -e '[0-9]\{2\}/[0-9]\{2\}/[0-9]\{4\}' \
+ -e thePoint -e aPoint -e setItemsPtr \
-e 'lambda\$[a-zA-Z0-9]*\$[0-9]' ${THIS_FILE} > /dev/null; then
$JAVAP -c -constants -l -p "${OTHER_FILE}" > ${OTHER_FILE}.javap
$JAVAP -c -constants -l -p "${THIS_FILE}" > ${THIS_FILE}.javap
TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \
$GREP '^[<>]' | \
$SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
- -e '/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/d' \
- -e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \
- -e '/[<>].*public com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*itemsPtr();/d' \
- -e '/[<>].*public void setItemsPtr(com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*);/d' \
+ -e '/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/d' \
+ -e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \
+ -e '/[<>].*public com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*itemsPtr();/d' \
+ -e '/[<>].*public void setItemsPtr(com\.apple\.jobjc\.Pointer<com\.apple\.jobjc\..*);/d' \
-e '/[<>].*lambda\$[a-zA-Z0-9]*\$[0-9]*/d')
fi
fi
@@ -121,20 +124,19 @@
# Disable this exception since we aren't changing the properties cleaning method yet.
# $CAT $OTHER_FILE | $SED -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \
# | $SED -f "$SRC_ROOT/common/makefiles/support/unicode2x.sed" \
-# | $SED -e '/^#/d' -e '/^$/d' \
+# | $SED -e '/^#/d' -e '/^$/d' \
# -e :a -e '/\\$/N; s/\\\n//; ta' \
-# -e 's/^[ \t]*//;s/[ \t]*$//' \
-# -e 's/\\=/=/' | LC_ALL=C $SORT > $OTHER_FILE.cleaned
+# -e 's/^[ \t]*//;s/[ \t]*$//' \
+# -e 's/\\=/=/' | LC_ALL=C $SORT > $OTHER_FILE.cleaned
# Filter out date string differences.
TMP=$(LC_ALL=C $DIFF $OTHER_FILE.cleaned $THIS_FILE | \
$GREP '^[<>]' | \
$SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d')
fi
- if test "x$SUFFIX" = "xMF"; then
- # Filter out date string differences.
+ if test "x$SUFFIX" = "xhtml"; then
TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
$GREP '^[<>]' | \
- $SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d')
+ $SED -e '/[<>] <!-- Generated by javadoc .* on .* -->/d' )
fi
if test -n "$TMP"; then
echo Files $OTHER_FILE and $THIS_FILE differ
@@ -158,7 +160,7 @@
(cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_this)
$DIFF $WORK_DIR/dirs_other $WORK_DIR/dirs_this > $WORK_DIR/dirs_diff
-
+
echo -n Directory structure...
if [ -s $WORK_DIR/dirs_diff ]; then
echo Differences found.
@@ -192,7 +194,7 @@
(cd $OTHER_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_other)
(cd $THIS_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_this)
-
+
$DIFF $WORK_DIR/files_other $WORK_DIR/files_this > $WORK_DIR/files_diff
echo -n File names...
@@ -236,11 +238,11 @@
TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'`
if [ "$OP" != "$TP" ]
then
- if [ -z "$found" ]; then echo ; found="yes"; fi
- $PRINTF "\told: ${OP} new: ${TP}\t$f\n"
+ if [ -z "$found" ]; then echo ; found="yes"; fi
+ $PRINTF "\tother: ${OP} this: ${TP}\t$f\n"
fi
done
- if [ -z "$found" ]; then
+ if [ -z "$found" ]; then
echo "Identical!"
else
REGRESSIONS=true
@@ -265,24 +267,22 @@
if [ ! -f ${THIS_DIR}/$f ]; then continue; fi
OF=`cd ${OTHER_DIR} && $FILE -h $f | $SED 's/BuildID[^,]*//g'`
TF=`cd ${THIS_DIR} && $FILE -h $f | $SED 's/BuildID[^,]*//g'`
- if [ "$f" = "./src.zip" ] || [[ "$f" = *"/Home/src.zip" ]] || [[ "$f" = *"/lib/JObjC.jar" ]]
- then
- if [ "`echo $OF | $GREP -ic zip`" -gt 0 -a "`echo $TF | $GREP -ic zip`" -gt 0 ]
- then
- # the way we produces zip-files make it so that directories are stored in old file
- # but not in new (only files with full-path)
- # this makes file-5.09 report them as different
- continue;
- fi
- fi
-
if [ "$OF" != "$TF" ]
then
- if [ -z "$found" ]; then echo ; found="yes"; fi
- $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n"
+ if [ "`echo $OF | $GREP -c 'Zip archive data'`" -gt 0 ] \
+ && [ "`echo $TF | $GREP -c 'Zip archive data'`" -gt 0 ]
+ then
+ # the way we produce zip-files make it so that directories are stored in
+ # old file but not in new (only files with full-path) this makes file
+ # report them as different
+ continue
+ else
+ if [ -z "$found" ]; then echo ; found="yes"; fi
+ $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n"
+ fi
fi
done
- if [ -z "$found" ]; then
+ if [ -z "$found" ]; then
echo "Identical!"
else
REGRESSIONS=true
@@ -296,12 +296,13 @@
THIS_DIR=$1
OTHER_DIR=$2
WORK_DIR=$3
-
+
GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \
! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" ! -name "*.jimage" \
- ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \
+ ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" ! -name "*.cpl" \
! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \
! -name "*.lib" ! -name "*.war" ! -name "JavaControlPanel" \
+ ! -name "*.obj" ! -name "*.o" ! -name "JavaControlPanelHelper" ! -name "JavaUpdater" \
| $GREP -v "./bin/" | $SORT | $FILTER)
echo General files...
@@ -377,7 +378,7 @@
THIS_SUFFIX="${THIS_ZIP##*.}"
OTHER_SUFFIX="${OTHER_ZIP##*.}"
if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then
- echo The files do not have the same suffix type!
+ echo "The files do not have the same suffix type! ($THIS_SUFFIX != $OTHER_SUFFIX)"
return 2
fi
@@ -389,7 +390,7 @@
fi
# Not quite identical, the might still contain the same data.
# Unpack the jar/zip files in temp dirs
-
+
THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this
OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other
$RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR
@@ -464,9 +465,9 @@
$RM -f $WORK_DIR/$ZIP_FILE.diffs
for file in $DIFFING_FILES; do
- if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then
+ if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then
diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs
- fi
+ fi
done
if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then
@@ -573,6 +574,10 @@
$MKDIR -p $FILE_WORK_DIR
+ # Make soft links to original files from work dir to facilitate debugging
+ $LN -f -s $THIS_FILE $WORK_FILE_BASE.this
+ $LN -f -s $OTHER_FILE $WORK_FILE_BASE.other
+
ORIG_THIS_FILE="$THIS_FILE"
ORIG_OTHER_FILE="$OTHER_FILE"
@@ -589,50 +594,51 @@
fi
if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
- unset _NT_SYMBOL_PATH
- # On windows we need to unzip the debug symbols, if present
- OTHER_FILE_BASE=${OTHER_FILE/.dll/}
- OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/}
- DIZ_NAME=$(basename $OTHER_FILE_BASE).diz
+ unset _NT_SYMBOL_PATH
+ # On windows we need to unzip the debug symbols, if present
+ OTHER_FILE_BASE=${OTHER_FILE/.dll/}
+ OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/}
+ OTHER_FILE_BASE=${OTHER_FILE_BASE/.cpl/}
+ DIZ_NAME=$(basename $OTHER_FILE_BASE).diz
# java.exe and java.dll diz files will have the same name. Have to
- # make sure java.exe gets the right one. This is only needed for
- # OTHER since in the new build, all pdb files are left around.
- if [ "$NAME" = "java.exe" ] && [ -f "$OTHER/tmp/java/java/obj64/java.diz" ]; then
- OTHER_DIZ_FILE="$OTHER/tmp/java/java/obj64/java.diz"
- elif [ -f "${OTHER_FILE_BASE}.diz" ]; then
- OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz
- else
+ # make sure java.exe gets the right one. This is only needed for
+ # OTHER since in the new build, all pdb files are left around.
+ if [ "$NAME" = "java.exe" ] && [ -f "$OTHER/tmp/java/java/obj64/java.diz" ]; then
+ OTHER_DIZ_FILE="$OTHER/tmp/java/java/obj64/java.diz"
+ elif [ -f "${OTHER_FILE_BASE}.diz" ]; then
+ OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz
+ else
# Some files, jli.dll, appears twice in the image but only one of
- # thme has a diz file next to it.
- OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)"
- if [ ! -f "$OTHER_DIZ_FILE" ]; then
- # As a last resort, look for diz file in the whole build output
- # dir.
- OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)"
- fi
- fi
- if [ -n "$OTHER_DIZ_FILE" ]; then
- $MKDIR -p $FILE_WORK_DIR/other
- (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE)
- export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other"
- fi
- THIS_FILE_BASE=${THIS_FILE/.dll/}
- THIS_FILE_BASE=${THIS_FILE_BASE/.exe/}
- if [ -f "${THIS_FILE/.dll/}.diz" ]; then
- THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz
- else
- THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)"
- if [ ! -f "$THIS_DIZ_FILE" ]; then
- # As a last resort, look for diz file in the whole build output
- # dir.
- THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)"
- fi
- fi
- if [ -n "$THIS_DIZ_FILE" ]; then
- $MKDIR -p $FILE_WORK_DIR/this
- (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE)
- export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this"
- fi
+ # thme has a diz file next to it.
+ OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)"
+ if [ ! -f "$OTHER_DIZ_FILE" ]; then
+ # As a last resort, look for diz file in the whole build output
+ # dir.
+ OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)"
+ fi
+ fi
+ if [ -n "$OTHER_DIZ_FILE" ]; then
+ $MKDIR -p $FILE_WORK_DIR/other
+ (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE)
+ export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other"
+ fi
+ THIS_FILE_BASE=${THIS_FILE/.dll/}
+ THIS_FILE_BASE=${THIS_FILE_BASE/.exe/}
+ if [ -f "${THIS_FILE/.dll/}.diz" ]; then
+ THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz
+ else
+ THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)"
+ if [ ! -f "$THIS_DIZ_FILE" ]; then
+ # As a last resort, look for diz file in the whole build output
+ # dir.
+ THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)"
+ fi
+ fi
+ if [ -n "$THIS_DIZ_FILE" ]; then
+ $MKDIR -p $FILE_WORK_DIR/this
+ (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE)
+ export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this"
+ fi
fi
if [ -z "$SKIP_BIN_DIFF" ]; then
@@ -670,19 +676,19 @@
DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE)
SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM)
if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_REL" -gt 98 ] \
- && [ "$DIFF_SIZE_REL" -lt 102 ]; then
+ && [ "$DIFF_SIZE_REL" -lt 102 ]; then
SIZE_MSG="($SIZE_MSG)"
DIFF_SIZE=
elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
- && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
- && [ "$DIFF_SIZE_NUM" = 512 ]; then
- # On windows, size of binaries increase in 512 increments.
+ && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
+ && [ "$DIFF_SIZE_NUM" = 512 ]; then
+ # On windows, size of binaries increase in 512 increments.
SIZE_MSG="($SIZE_MSG)"
DIFF_SIZE=
elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
- && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
- && [ "$DIFF_SIZE_NUM" = -512 ]; then
- # On windows, size of binaries increase in 512 increments.
+ && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
+ && [ "$DIFF_SIZE_NUM" = -512 ]; then
+ # On windows, size of binaries increase in 512 increments.
SIZE_MSG="($SIZE_MSG)"
DIFF_SIZE=
else
@@ -717,18 +723,18 @@
if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
# The output from dumpbin on windows differs depending on if the debug symbol
# files are still around at the location the binary is pointing too. Need
- # to filter out that extra information.
- $DUMPBIN -exports $OTHER_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
- $DUMPBIN -exports $THIS_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
+ # to filter out that extra information.
+ $DUMPBIN -exports $OTHER_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
+ $DUMPBIN -exports $THIS_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
# Some symbols get seemingly random 15 character prefixes. Filter them out.
$NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
- $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
+ $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
else
- $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
- $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
+ $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
+ $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
fi
-
+
LC_ALL=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
if [ -s $WORK_FILE_BASE.symbols.diff ]; then
SYM_MSG=" diff "
@@ -741,7 +747,7 @@
SYM_MSG=" $SYM_MSG "
fi
else
- SYM_MSG="($SYM_MSG)"
+ SYM_MSG="($SYM_MSG)"
DIFF_SYM=
fi
else
@@ -754,48 +760,48 @@
# Check dependencies
if [ -n "$LDD_CMD" ]; then
- (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME 2>/dev/null | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.other | $UNIQ > $WORK_FILE_BASE.deps.other.uniq)
- (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME 2</dev/null | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.this | $UNIQ > $WORK_FILE_BASE.deps.this.uniq)
- (cd $FILE_WORK_DIR && $RM -f $NAME)
-
- LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff
- LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq
-
- if [ -s $WORK_FILE_BASE.deps.diff ]; then
+ (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME 2>/dev/null | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.other | $UNIQ > $WORK_FILE_BASE.deps.other.uniq)
+ (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME 2</dev/null | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.this | $UNIQ > $WORK_FILE_BASE.deps.this.uniq)
+ (cd $FILE_WORK_DIR && $RM -f $NAME)
+
+ LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff
+ LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq
+
+ if [ -s $WORK_FILE_BASE.deps.diff ]; then
if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then
- DEP_MSG=" diff "
+ DEP_MSG=" diff "
else
- DEP_MSG=" redun "
+ DEP_MSG=" redun "
fi
if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then
- DIFF_DEP=true
- if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then
+ DIFF_DEP=true
+ if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then
DEP_MSG="*$DEP_MSG*"
REGRESSIONS=true
- else
+ else
DEP_MSG=" $DEP_MSG "
- fi
+ fi
else
- DEP_MSG="($DEP_MSG)"
- DIFF_DEP=
+ DEP_MSG="($DEP_MSG)"
+ DIFF_DEP=
fi
- else
- DEP_MSG=" "
- DIFF_DEP=
+ else
+ DEP_MSG=" "
+ DIFF_DEP=
if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then
DEP_MSG=" ! "
fi
- fi
+ fi
else
- DEP_MSG=" - "
+ DEP_MSG=" - "
fi
-
+
# Compare fulldump output
if [ -n "$FULLDUMP_CMD" ] && [ -z "$SKIP_FULLDUMP_DIFF" ]; then
$FULLDUMP_CMD $OTHER_FILE > $WORK_FILE_BASE.fulldump.other 2>&1
$FULLDUMP_CMD $THIS_FILE > $WORK_FILE_BASE.fulldump.this 2>&1
LC_ALL=C $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this > $WORK_FILE_BASE.fulldump.diff
-
+
if [ -s $WORK_FILE_BASE.fulldump.diff ]; then
ELF_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.fulldump.diff | awk '{print $5}')
ELF_MSG=$($PRINTF "%8d" $ELF_DIFF_SIZE)
@@ -822,14 +828,17 @@
# Compare disassemble output
if [ -n "$DIS_CMD" ] && [ -z "$SKIP_DIS_DIFF" ]; then
- if [ -z "$DIS_DIFF_FILTER" ]; then
- DIS_DIFF_FILTER="$CAT"
- fi
- $DIS_CMD $OTHER_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.other 2>&1
- $DIS_CMD $THIS_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.this 2>&1
-
+ # By default we filter out differences that include references to symbols.
+ # To get a raw diff with the complete disassembly, set
+ # DIS_DIFF_FILTER="$CAT"
+ if [ -z "$DIS_DIFF_FILTER" ]; then
+ DIS_DIFF_FILTER="$GREP -v ' # .* <.*>$'"
+ fi
+ $DIS_CMD $OTHER_FILE | $GREP -v $NAME | eval "$DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.other 2>&1
+ $DIS_CMD $THIS_FILE | $GREP -v $NAME | eval "$DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.this 2>&1
+
LC_ALL=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff
-
+
if [ -s $WORK_FILE_BASE.dis.diff ]; then
DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}')
DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE)
@@ -907,7 +916,9 @@
OTHER_DIR=$2
WORK_DIR=$3
- LIBS=$(cd $THIS_DIR && $FIND . -type f \( -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' -o -name 'JavaControlPanel' \) | $SORT | $FILTER)
+ LIBS=$(cd $THIS_DIR && $FIND . -type f \( -name 'lib*.so' -o -name '*.dylib' \
+ -o -name '*.dll' -o -name '*.obj' -o -name '*.o' \
+ -o -name '*.cpl' \) | $SORT | $FILTER)
if [ -n "$LIBS" ]; then
echo Libraries...
@@ -967,7 +978,7 @@
$MKDIR -p $COMPARE_ROOT
if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
if [ "$(uname -o)" = "Cygwin" ]; then
- COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT)
+ COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT)
fi
fi
@@ -1091,7 +1102,7 @@
CMP_JARS=true
CMP_LIBS=true
CMP_EXECS=true
-
+
if [ -z "$FILTER" ]; then
FILTER="$GREP"
fi
@@ -1177,8 +1188,8 @@
OTHER_J2RE="$OTHER/images/jre"
echo "Selecting jdk images for compare"
else
- echo "No common images found."
- exit 1
+ echo "No common images found."
+ exit 1
fi
if [ -d "$THIS/images/jdk-bundle" ] && [ -d "$OTHER/images/jdk-bundle" ]; then
@@ -1189,6 +1200,17 @@
echo "Also comparing macosx bundles"
fi
+ if [ -d "$THIS/deploy" ] && [ -d "$OTHER/deploy" ]; then
+ THIS_DEPLOY_BUNDLE_DIR="$THIS/deploy/dist/installer/bundles"
+ OTHER_DEPLOY_BUNDLE_DIR="$OTHER/deploy/bundles"
+ echo "Also comparing deploy/bundles"
+ if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
+ THIS_DEPLOY_APPLET_PLUGIN_DIR="$THIS/deploy/JavaAppletPlugin.plugin"
+ OTHER_DEPLOY_APPLET_PLUGIN_DIR="$OTHER/deploy/JavaAppletPlugin.plugin"
+ echo "Also comparing JavaAppletPlugin"
+ fi
+ fi
+
if [ -d "$OTHER/images" ]; then
OTHER_SEC_DIR="$OTHER/images"
else
@@ -1212,7 +1234,7 @@
if [ -d "$THIS/docs" ] && [ -d "$OTHER/docs" ]; then
THIS_DOCS="$THIS/docs"
OTHER_DOCS="$OTHER/docs"
- echo "Also comparing docs"
+ echo "Also comparing docs"
else
echo "WARNING! Docs haven't been built and won't be compared."
fi
@@ -1227,7 +1249,7 @@
compare_dirs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk
echo -n "J2RE "
compare_dirs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
-
+
echo -n "J2SDK "
compare_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk
echo -n "J2RE "
@@ -1238,7 +1260,7 @@
compare_dirs $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/jdk-bundle
echo -n "J2RE Bundle "
compare_dirs $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/jre-bundle
-
+
echo -n "J2SDK Bundle "
compare_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/jdk-bundle
echo -n "J2RE Bundle "
@@ -1254,6 +1276,12 @@
compare_dirs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
compare_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ echo -n "JavaAppletPlugin "
+ compare_dirs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ echo -n "JavaAppletPlugin "
+ compare_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
if [ "$CMP_PERMS" = "true" ]; then
@@ -1266,6 +1294,10 @@
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
compare_permissions $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ echo -n "JavaAppletPlugin "
+ compare_permissions $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
if [ "$CMP_TYPES" = "true" ]; then
@@ -1284,6 +1316,10 @@
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
compare_file_types $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ echo -n "JavaAppletPlugin "
+ compare_file_types $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
if [ "$CMP_GENERAL" = "true" ]; then
@@ -1306,6 +1342,10 @@
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
compare_general_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ echo -n "JavaAppletPlugin "
+ compare_general_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
if [ "$CMP_ZIPS" = "true" ]; then
@@ -1333,6 +1373,12 @@
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
compare_all_zip_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_BUNDLE_DIR" ] && [ -n "$OTHER_DEPLOY_BUNDLE_DIR" ]; then
+ compare_all_zip_files $THIS_DEPLOY_BUNDLE_DIR $OTHER_DEPLOY_BUNDLE_DIR $COMPARE_ROOT/deploy-bundle
+ fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ compare_all_zip_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
if [ "$CMP_JARS" = "true" ]; then
@@ -1342,6 +1388,9 @@
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
compare_all_jar_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ compare_all_jar_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
if [ "$CMP_LIBS" = "true" ]; then
@@ -1356,15 +1405,27 @@
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
compare_all_libs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ echo -n "JavaAppletPlugin "
+ compare_all_libs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
if [ "$CMP_EXECS" = "true" ]; then
if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then
compare_all_execs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk
+ if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
+ echo -n "J2RE "
+ compare_all_execs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re
+ fi
fi
if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
compare_all_execs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
fi
+ if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
+ echo -n "JavaAppletPlugin "
+ compare_all_execs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
+ fi
fi
echo
--- a/corba/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/corba/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -288,3 +288,5 @@
9645e35616b60c5c07b4fdf11a132afc8081dfa8 jdk9-b43
1f57bd728c9e6865ccb9d43ccd80a1c11230a32f jdk9-b44
9e3f2bed80c0e5a84a256ce41f1d10c5ade48466 jdk9-b45
+326f2068b4a4c05e2fa27d6acf93eba7b54b090d jdk9-b46
+ee8447ca632e1d39180b4767c749db101bff7314 jdk9-b47
--- a/hotspot/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -448,3 +448,5 @@
65a9747147b8090037541040ba67156ec914db6a jdk9-b43
43a44b56dca61a4d766a20f0528fdd8b5ceff873 jdk9-b44
5dc8184af1e2bb30b0103113d1f1a58a21a80c37 jdk9-b45
+a184ee1d717297bd35b7c3e35393e137921a3ed2 jdk9-b46
+3b241fb72b8925b75941d612db762a6d5da66d02 jdk9-b47
--- a/hotspot/make/aix/Makefile Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/aix/Makefile Tue Jan 27 13:58:55 2015 -0500
@@ -246,8 +246,7 @@
XSLT_CHECK = $(REMOTE) $(RUN.JAVAP) javax.xml.transform.TransformerFactory
# If not found then fail fast.
check_j2se_version:
- $(QUIETLY) $(XSLT_CHECK) > /dev/null 2>&1; \
- if [ $$? -ne 0 ]; then \
+ $(QUIETLY) if ! $(XSLT_CHECK) > /dev/null 2>&1; then \
$(REMOTE) $(RUN.JAVA) -version; \
echo "*** An XSLT processor (J2SE 1.4.x or newer) is required" \
"to bootstrap this build" 1>&2; \
--- a/hotspot/make/bsd/Makefile Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/bsd/Makefile Tue Jan 27 13:58:55 2015 -0500
@@ -240,8 +240,7 @@
XSLT_CHECK = $(REMOTE) $(RUN.JAVAP) javax.xml.transform.TransformerFactory
# If not found then fail fast.
check_j2se_version:
- $(QUIETLY) $(XSLT_CHECK) > /dev/null 2>&1; \
- if [ $$? -ne 0 ]; then \
+ $(QUIETLY) if ! $(XSLT_CHECK) > /dev/null 2>&1; then \
$(REMOTE) $(RUN.JAVA) -version; \
echo "*** An XSLT processor (J2SE 1.4.x or newer) is required" \
"to bootstrap this build" 1>&2; \
--- a/hotspot/make/bsd/makefiles/dtrace.make Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/bsd/makefiles/dtrace.make Tue Jan 27 13:58:55 2015 -0500
@@ -179,23 +179,23 @@
# $@.tmp is created first to avoid an empty $(JVMOFFS).h if an error occurs.
$(JVMOFFS).h: $(GENOFFS)
$(QUIETLY) DYLD_LIBRARY_PATH=.:$(DYLD_LIBRARY_PATH) ./$(GENOFFS) -header > $@.tmp; touch $@; \
- if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
- then rm -f $@; mv $@.tmp $@; \
- else rm -f $@.tmp; \
+ if diff $@.tmp $@ > /dev/null 2>&1 ; \
+ then rm -f $@.tmp; \
+ else rm -f $@; mv $@.tmp $@; \
fi
$(JVMOFFS)Index.h: $(GENOFFS)
$(QUIETLY) DYLD_LIBRARY_PATH=.:$(DYLD_LIBRARY_PATH) ./$(GENOFFS) -index > $@.tmp; touch $@; \
- if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
- then rm -f $@; mv $@.tmp $@; \
- else rm -f $@.tmp; \
+ if diff $@.tmp $@ > /dev/null 2>&1 ; \
+ then rm -f $@.tmp; \
+ else rm -f $@; mv $@.tmp $@; \
fi
$(JVMOFFS).cpp: $(GENOFFS) $(JVMOFFS).h $(JVMOFFS)Index.h
$(QUIETLY) DYLD_LIBRARY_PATH=.:$(DYLD_LIBRARY_PATH) ./$(GENOFFS) -table > $@.tmp; touch $@; \
- if [ `diff $@.tmp $@ > /dev/null 2>&1; echo $$?` -ne 0 ] ; \
- then rm -f $@; mv $@.tmp $@; \
- else rm -f $@.tmp; \
+ if diff $@.tmp $@ > /dev/null 2>&1; \
+ then rm -f $@.tmp; \
+ else rm -f $@; mv $@.tmp $@; \
fi
$(JVMOFFS.o): $(JVMOFFS).h $(JVMOFFS).cpp
--- a/hotspot/make/bsd/makefiles/universal.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/bsd/makefiles/universal.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -59,7 +59,7 @@
# Package built libraries in a universal binary
$(UNIVERSAL_LIPO_LIST):
- BUILT_LIPO_FILES="`find $(EXPORT_JRE_LIB_DIR)/{i386,amd64}/$(subst $(EXPORT_JRE_LIB_DIR)/,,$@) 2>/dev/null`"; \
+ BUILT_LIPO_FILES="`find $(EXPORT_JRE_LIB_DIR)/{i386,amd64}/$(subst $(EXPORT_JRE_LIB_DIR)/,,$@) 2>/dev/null`" || test $$? = "1"; \
if [ -n "$${BUILT_LIPO_FILES}" ]; then \
$(MKDIR) -p $(shell dirname $@); \
lipo -create -output $@ $${BUILT_LIPO_FILES}; \
@@ -70,7 +70,7 @@
# - copies directories; including empty dirs
# - copies files, symlinks, other non-directory files
$(UNIVERSAL_COPY_LIST):
- BUILT_COPY_FILES="`find $(EXPORT_JRE_LIB_DIR)/{i386,amd64}/$(subst $(EXPORT_JRE_LIB_DIR)/,,$@) -prune 2>/dev/null`"; \
+ BUILT_COPY_FILES="`find $(EXPORT_JRE_LIB_DIR)/{i386,amd64}/$(subst $(EXPORT_JRE_LIB_DIR)/,,$@) -prune 2>/dev/null`" || test $$? = "1"; \
if [ -n "$${BUILT_COPY_FILES}" ]; then \
for i in $${BUILT_COPY_FILES}; do \
$(MKDIR) -p $(shell dirname $@); \
--- a/hotspot/make/linux/Makefile Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/linux/Makefile Tue Jan 27 13:58:55 2015 -0500
@@ -246,8 +246,7 @@
XSLT_CHECK = $(REMOTE) $(RUN.JAVAP) javax.xml.transform.TransformerFactory
# If not found then fail fast.
check_j2se_version:
- $(QUIETLY) $(XSLT_CHECK) > /dev/null 2>&1; \
- if [ $$? -ne 0 ]; then \
+ $(QUIETLY) if ! $(XSLT_CHECK) > /dev/null 2>&1; then \
$(REMOTE) $(RUN.JAVA) -version; \
echo "*** An XSLT processor (J2SE 1.4.x or newer) is required" \
"to bootstrap this build" 1>&2; \
--- a/hotspot/make/linux/makefiles/vm.make Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/linux/makefiles/vm.make Tue Jan 27 13:58:55 2015 -0500
@@ -340,10 +340,8 @@
rm -f $@.1; ln -s $@ $@.1; \
if [ \"$(CROSS_COMPILE_ARCH)\" = \"\" ] ; then \
if [ -x /usr/sbin/selinuxenabled ] ; then \
- /usr/sbin/selinuxenabled; \
- if [ $$? = 0 ] ; then \
- /usr/bin/chcon -t textrel_shlib_t $@; \
- if [ $$? != 0 ]; then \
+ if /usr/sbin/selinuxenabled; then \
+ if ! /usr/bin/chcon -t textrel_shlib_t $@; then \
echo "ERROR: Cannot chcon $@"; \
fi \
fi \
--- a/hotspot/make/sa.files Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/sa.files Tue Jan 27 13:58:55 2015 -0500
@@ -39,6 +39,7 @@
$(AGENT_SRC_DIR)/sun/jvm/hotspot/asm/sparc/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/c1/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/ci/*.java \
+$(AGENT_SRC_DIR)/sun/jvm/hotspot/classfile/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/code/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/compiler/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/*.java \
@@ -49,8 +50,10 @@
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/cdbg/basic/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/dummy/*.java \
+$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/ia64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/amd64/*.java \
+$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/ia64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/ppc64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/sparc/*.java \
@@ -71,6 +74,7 @@
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/win32/coff/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/amd64/*.java \
+$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/ia64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windows/x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windows/amd64/*.java \
@@ -101,6 +105,8 @@
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/solaris_x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/sparc/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/x86/*.java \
+$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/win32_amd64/*.java \
+$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/win32_x86/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/ppc64/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/tools/*.java \
$(AGENT_SRC_DIR)/sun/jvm/hotspot/tools/jcore/*.java \
--- a/hotspot/make/solaris/Makefile Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/solaris/Makefile Tue Jan 27 13:58:55 2015 -0500
@@ -190,8 +190,7 @@
XSLT_CHECK = $(RUN.JAVAP) javax.xml.transform.TransformerFactory
# If not found then fail fast.
check_j2se_version:
- $(QUIETLY) $(XSLT_CHECK) > /dev/null 2>&1; \
- if [ $$? -ne 0 ]; then \
+ $(QUIETLY) if ! $(XSLT_CHECK) > /dev/null 2>&1; then \
$(RUN.JAVA) -version; \
echo "*** An XSLT processor (J2SE 1.4.x or newer) is required" \
"to bootstrap this build" 1>&2; \
--- a/hotspot/make/solaris/makefiles/dtrace.make Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/make/solaris/makefiles/dtrace.make Tue Jan 27 13:58:55 2015 -0500
@@ -171,11 +171,11 @@
./lib$(GENOFFS).so
CONDITIONALLY_UPDATE_JVMOFFS_TARGET = \
- cmp -s $@ $@.tmp; \
- case $$? in \
- 0) rm -f $@.tmp;; \
- *) rm -f $@ && mv $@.tmp $@ && echo Updated $@;; \
- esac
+ if cmp -s $@ $@.tmp; then \
+ rm -f $@.tmp; \
+ else \
+ rm -f $@ && mv $@.tmp $@ && echo Updated $@; \
+ fi
# $@.tmp is created first to avoid an empty $(JVMOFFS).h if an error occurs.
$(JVMOFFS).h: $(GENOFFS)
--- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -567,16 +567,21 @@
inline void load_with_trap_null_check(Register d, int si16, Register s1);
// Load heap oop and decompress. Loaded oop may not be null.
- inline void load_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1 = noreg);
+ // Specify tmp to save one cycle.
+ inline void load_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1 = noreg,
+ Register tmp = noreg);
+ // Store heap oop and decompress. Decompressed oop may not be null.
+ // Specify tmp register if d should not be changed.
inline void store_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1,
- /*specify if d must stay uncompressed*/ Register tmp = noreg);
+ Register tmp = noreg);
// Null allowed.
inline void load_heap_oop(Register d, RegisterOrConstant offs, Register s1 = noreg);
// Encode/decode heap oop. Oop may not be null, else en/decoding goes wrong.
+ // src == d allowed.
inline Register encode_heap_oop_not_null(Register d, Register src = noreg);
- inline void decode_heap_oop_not_null(Register d);
+ inline Register decode_heap_oop_not_null(Register d, Register src = noreg);
// Null allowed.
inline void decode_heap_oop(Register d);
--- a/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.inline.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/cpu/ppc/vm/macroAssembler_ppc.inline.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -311,11 +311,14 @@
ld(d, si16, s1);
}
-inline void MacroAssembler::load_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1) {
+inline void MacroAssembler::load_heap_oop_not_null(Register d, RegisterOrConstant offs, Register s1, Register tmp) {
if (UseCompressedOops) {
- lwz(d, offs, s1);
+ // In disjoint mode decoding can save a cycle if src != dst.
+ Register narrowOop = (tmp != noreg && Universe::narrow_oop_base_disjoint()) ? tmp : d;
+ lwz(narrowOop, offs, s1);
// Attention: no null check here!
- decode_heap_oop_not_null(d);
+ Register res = decode_heap_oop_not_null(d, narrowOop);
+ assert(res == d, "caller will not consume loaded value");
} else {
ld(d, offs, s1);
}
@@ -340,26 +343,36 @@
}
inline Register MacroAssembler::encode_heap_oop_not_null(Register d, Register src) {
- Register current = (src!=noreg) ? src : d; // Compressed oop is in d if no src provided.
- if (Universe::narrow_oop_base() != NULL) {
+ Register current = (src != noreg) ? src : d; // Oop to be compressed is in d if no src provided.
+ if (Universe::narrow_oop_base_overlaps()) {
sub(d, current, R30);
current = d;
}
if (Universe::narrow_oop_shift() != 0) {
- srdi(d, current, LogMinObjAlignmentInBytes);
+ rldicl(d, current, 64-Universe::narrow_oop_shift(), 32); // Clears the upper bits.
current = d;
}
return current; // Encoded oop is in this register.
}
-inline void MacroAssembler::decode_heap_oop_not_null(Register d) {
+inline Register MacroAssembler::decode_heap_oop_not_null(Register d, Register src) {
+ if (Universe::narrow_oop_base_disjoint() && src != noreg && src != d &&
+ Universe::narrow_oop_shift() != 0) {
+ mr(d, R30);
+ rldimi(d, src, Universe::narrow_oop_shift(), 32-Universe::narrow_oop_shift());
+ return d;
+ }
+
+ Register current = (src != noreg) ? src : d; // Compressed oop is in d if no src provided.
if (Universe::narrow_oop_shift() != 0) {
- assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
- sldi(d, d, LogMinObjAlignmentInBytes);
+ sldi(d, current, Universe::narrow_oop_shift());
+ current = d;
}
if (Universe::narrow_oop_base() != NULL) {
- add(d, d, R30);
+ add(d, current, R30);
+ current = d;
}
+ return current; // Decoded oop is in this register.
}
inline void MacroAssembler::decode_heap_oop(Register d) {
@@ -368,13 +381,7 @@
cmpwi(CCR0, d, 0);
beq(CCR0, isNull);
}
- if (Universe::narrow_oop_shift() != 0) {
- assert (LogMinObjAlignmentInBytes == Universe::narrow_oop_shift(), "decode alg wrong");
- sldi(d, d, LogMinObjAlignmentInBytes);
- }
- if (Universe::narrow_oop_base() != NULL) {
- add(d, d, R30);
- }
+ decode_heap_oop_not_null(d);
bind(isNull);
}
--- a/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/cpu/ppc/vm/methodHandles_ppc.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -172,15 +172,15 @@
// Load the invoker, as MH -> MH.form -> LF.vmentry
__ verify_oop(recv);
- __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes()), recv);
+ __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes()), recv, temp2);
__ verify_oop(method_temp);
- __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()), method_temp);
+ __ load_heap_oop_not_null(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()), method_temp, temp2);
__ verify_oop(method_temp);
- // the following assumes that a Method* is normally compressed in the vmtarget field:
+ // The following assumes that a Method* is normally compressed in the vmtarget field:
__ ld(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()), method_temp);
if (VerifyMethodHandles && !for_compiler_entry) {
- // make sure recv is already on stack
+ // Make sure recv is already on stack.
__ ld(temp2, in_bytes(Method::const_offset()), method_temp);
__ load_sized_value(temp2, in_bytes(ConstMethod::size_of_parameters_offset()), temp2,
sizeof(u2), /*is_signed*/ false);
@@ -259,8 +259,9 @@
}
if (TraceMethodHandles) {
- if (tmp_mh != noreg)
+ if (tmp_mh != noreg) {
__ mr(R23_method_handle, tmp_mh); // make stub happy
+ }
trace_method_handle_interpreter_entry(_masm, iid);
}
@@ -332,7 +333,7 @@
if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) {
Label L_ok;
Register temp2_defc = temp2;
- __ load_heap_oop_not_null(temp2_defc, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg);
+ __ load_heap_oop_not_null(temp2_defc, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg, temp3);
load_klass_from_Class(_masm, temp2_defc, temp3, temp4);
__ verify_klass_ptr(temp2_defc);
__ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, temp4, L_ok);
@@ -407,7 +408,7 @@
}
Register temp2_intf = temp2;
- __ load_heap_oop_not_null(temp2_intf, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg);
+ __ load_heap_oop_not_null(temp2_intf, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes()), member_reg, temp3);
load_klass_from_Class(_masm, temp2_intf, temp3, temp4);
__ verify_klass_ptr(temp2_intf);
@@ -464,7 +465,7 @@
strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH
const char* mh_reg_name = has_mh ? "R23_method_handle" : "G23";
tty->print_cr("MH %s %s="INTPTR_FORMAT " sp=" INTPTR_FORMAT,
- adaptername, mh_reg_name, (intptr_t) mh, (intptr_t) entry_sp);
+ adaptername, mh_reg_name, (intptr_t) mh, entry_sp);
if (Verbose) {
tty->print_cr("Registers:");
@@ -535,23 +536,22 @@
BLOCK_COMMENT("trace_method_handle {");
- int nbytes_save = 10 * 8; // 10 volatile gprs
- __ save_LR_CR(R0);
- __ mr(R0, R1_SP); // saved_sp
- assert(Assembler::is_simm(-nbytes_save, 16), "Overwriting R0");
- // Push_frame_reg_args only uses R0 if nbytes_save is wider than 16 bit.
- __ push_frame_reg_args(nbytes_save, R0);
- __ save_volatile_gprs(R1_SP, frame::abi_reg_args_size); // Except R0.
+ const Register tmp = R11; // Will be preserved.
+ const int nbytes_save = 11*8; // volatile gprs except R0
+ __ save_volatile_gprs(R1_SP, -nbytes_save); // except R0
+ __ save_LR_CR(tmp); // save in old frame
- __ load_const(R3_ARG1, (address)adaptername);
+ __ mr(R5_ARG3, R1_SP); // saved_sp
+ __ push_frame_reg_args(nbytes_save, tmp);
+
+ __ load_const_optimized(R3_ARG1, (address)adaptername, tmp);
__ mr(R4_ARG2, R23_method_handle);
- __ mr(R5_ARG3, R0); // saved_sp
__ mr(R6_ARG4, R1_SP);
__ call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub));
- __ restore_volatile_gprs(R1_SP, 112); // Except R0.
__ pop_frame();
- __ restore_LR_CR(R0);
+ __ restore_LR_CR(tmp);
+ __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
BLOCK_COMMENT("} trace_method_handle");
}
--- a/hotspot/src/cpu/ppc/vm/ppc.ad Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/cpu/ppc/vm/ppc.ad Tue Jan 27 13:58:55 2015 -0500
@@ -1,6 +1,6 @@
//
-// Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
-// Copyright 2012, 2014 SAP AG. All rights reserved.
+// Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
+// Copyright 2012, 2015 SAP AG. All rights reserved.
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
//
// This code is free software; you can redistribute it and/or modify it
@@ -2698,7 +2698,7 @@
const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none);
__ relocate(a.rspec());
} else if (constant_reloc == relocInfo::metadata_type) {
- AddressLiteral a = __ allocate_metadata_address((Metadata *)val);
+ AddressLiteral a = __ constant_metadata_address((Metadata *)val);
const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none);
__ relocate(a.rspec());
} else {
@@ -2727,7 +2727,7 @@
const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none);
__ relocate(a.rspec());
} else if (constant_reloc == relocInfo::metadata_type) {
- AddressLiteral a = __ allocate_metadata_address((Metadata *)val);
+ AddressLiteral a = __ constant_metadata_address((Metadata *)val);
const_toc_addr = __ address_constant((address)a.value(), RelocationHolder::none);
__ relocate(a.rspec());
} else { // non-oop pointers, e.g. card mark base, heap top
@@ -6029,6 +6029,20 @@
ins_pipe(pipe_class_default);
%}
+// Optimize DecodeN for disjoint base.
+// Load base of compressed oops into a register
+instruct loadBase(iRegLdst dst) %{
+ effect(DEF dst);
+
+ format %{ "MR $dst, r30_heapbase" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_or);
+ __ mr($dst$$Register, R30);
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
// Loading ConN must be postalloc expanded so that edges between
// the nodes are safe. They may not interfere with a safepoint.
// GL TODO: This needs three instructions: better put this into the constant pool.
@@ -6724,13 +6738,12 @@
ins_pipe(pipe_class_default);
%}
-// base != 0
-// 32G aligned narrow oop base.
-instruct encodeP_32GAligned(iRegNdst dst, iRegPsrc src) %{
+// Disjoint narrow oop base.
+instruct encodeP_Disjoint(iRegNdst dst, iRegPsrc src) %{
match(Set dst (EncodeP src));
- predicate(false /* TODO: PPC port Universe::narrow_oop_base_disjoint()*/);
-
- format %{ "EXTRDI $dst, $src, #32, #3 \t// encode with 32G aligned base" %}
+ predicate(Universe::narrow_oop_base_disjoint());
+
+ format %{ "EXTRDI $dst, $src, #32, #3 \t// encode with disjoint base" %}
size(4);
ins_encode %{
// TODO: PPC port $archOpcode(ppc64Opcode_rldicl);
@@ -6745,7 +6758,7 @@
effect(TEMP crx);
predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull &&
Universe::narrow_oop_shift() != 0 &&
- true /* TODO: PPC port Universe::narrow_oop_base_overlaps()*/);
+ Universe::narrow_oop_base_overlaps());
format %{ "EncodeP $dst, $crx, $src \t// postalloc expanded" %}
postalloc_expand( postalloc_expand_encode_oop(dst, src, crx));
@@ -6756,7 +6769,7 @@
match(Set dst (EncodeP src));
predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull &&
Universe::narrow_oop_shift() != 0 &&
- true /* TODO: PPC port Universe::narrow_oop_base_overlaps()*/);
+ Universe::narrow_oop_base_overlaps());
format %{ "EncodeP $dst, $src\t// $src != Null, postalloc expanded" %}
postalloc_expand( postalloc_expand_encode_oop_not_null(dst, src) );
@@ -6876,6 +6889,7 @@
n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant) &&
Universe::narrow_oop_shift() != 0 &&
Universe::narrow_oop_base() != 0);
+ ins_cost(4 * DEFAULT_COST); // Should be more expensive than decodeN_Disjoint_isel_Ex.
effect(TEMP crx);
format %{ "DecodeN $dst, $src \t// Kills $crx, postalloc expanded" %}
@@ -6897,6 +6911,106 @@
ins_pipe(pipe_class_default);
%}
+// Optimize DecodeN for disjoint base.
+// Shift narrow oop and or it into register that already contains the heap base.
+// Base == dst must hold, and is assured by construction in postaloc_expand.
+instruct decodeN_mergeDisjoint(iRegPdst dst, iRegNsrc src, iRegLsrc base) %{
+ match(Set dst (DecodeN src));
+ effect(TEMP base);
+ predicate(false);
+
+ format %{ "RLDIMI $dst, $src, shift, 32-shift \t// DecodeN (disjoint base)" %}
+ size(4);
+ ins_encode %{
+ // TODO: PPC port $archOpcode(ppc64Opcode_rldimi);
+ __ rldimi($dst$$Register, $src$$Register, Universe::narrow_oop_shift(), 32-Universe::narrow_oop_shift());
+ %}
+ ins_pipe(pipe_class_default);
+%}
+
+// Optimize DecodeN for disjoint base.
+// This node requires only one cycle on the critical path.
+// We must postalloc_expand as we can not express use_def effects where
+// the used register is L and the def'ed register P.
+instruct decodeN_Disjoint_notNull_Ex(iRegPdst dst, iRegNsrc src) %{
+ match(Set dst (DecodeN src));
+ effect(TEMP_DEF dst);
+ predicate((n->bottom_type()->is_oopptr()->ptr() == TypePtr::NotNull ||
+ n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
+ Universe::narrow_oop_base_disjoint());
+ ins_cost(DEFAULT_COST);
+
+ format %{ "MOV $dst, R30 \t\n"
+ "RLDIMI $dst, $src, shift, 32-shift \t// decode with disjoint base" %}
+ postalloc_expand %{
+ loadBaseNode *n1 = new loadBaseNode();
+ n1->add_req(NULL);
+ n1->_opnds[0] = op_dst;
+
+ decodeN_mergeDisjointNode *n2 = new decodeN_mergeDisjointNode();
+ n2->add_req(n_region, n_src, n1);
+ n2->_opnds[0] = op_dst;
+ n2->_opnds[1] = op_src;
+ n2->_opnds[2] = op_dst;
+ n2->_bottom_type = _bottom_type;
+
+ ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
+ ra_->set_pair(n2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
+
+ nodes->push(n1);
+ nodes->push(n2);
+ %}
+%}
+
+instruct decodeN_Disjoint_isel_Ex(iRegPdst dst, iRegNsrc src, flagsReg crx) %{
+ match(Set dst (DecodeN src));
+ effect(TEMP_DEF dst, TEMP crx);
+ predicate((n->bottom_type()->is_oopptr()->ptr() != TypePtr::NotNull &&
+ n->bottom_type()->is_oopptr()->ptr() != TypePtr::Constant) &&
+ Universe::narrow_oop_base_disjoint() && VM_Version::has_isel());
+ ins_cost(3 * DEFAULT_COST);
+
+ format %{ "DecodeN $dst, $src \t// decode with disjoint base using isel" %}
+ postalloc_expand %{
+ loadBaseNode *n1 = new loadBaseNode();
+ n1->add_req(NULL);
+ n1->_opnds[0] = op_dst;
+
+ cmpN_reg_imm0Node *n_compare = new cmpN_reg_imm0Node();
+ n_compare->add_req(n_region, n_src);
+ n_compare->_opnds[0] = op_crx;
+ n_compare->_opnds[1] = op_src;
+ n_compare->_opnds[2] = new immN_0Oper(TypeNarrowOop::NULL_PTR);
+
+ decodeN_mergeDisjointNode *n2 = new decodeN_mergeDisjointNode();
+ n2->add_req(n_region, n_src, n1);
+ n2->_opnds[0] = op_dst;
+ n2->_opnds[1] = op_src;
+ n2->_opnds[2] = op_dst;
+ n2->_bottom_type = _bottom_type;
+
+ cond_set_0_ptrNode *n_cond_set = new cond_set_0_ptrNode();
+ n_cond_set->add_req(n_region, n_compare, n2);
+ n_cond_set->_opnds[0] = op_dst;
+ n_cond_set->_opnds[1] = op_crx;
+ n_cond_set->_opnds[2] = op_dst;
+ n_cond_set->_bottom_type = _bottom_type;
+
+ assert(ra_->is_oop(this) == true, "A decodeN node must produce an oop!");
+ ra_->set_oop(n_cond_set, true);
+
+ ra_->set_pair(n1->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
+ ra_->set_pair(n_compare->_idx, ra_->get_reg_second(n_crx), ra_->get_reg_first(n_crx));
+ ra_->set_pair(n2->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
+ ra_->set_pair(n_cond_set->_idx, ra_->get_reg_second(this), ra_->get_reg_first(this));
+
+ nodes->push(n1);
+ nodes->push(n_compare);
+ nodes->push(n2);
+ nodes->push(n_cond_set);
+ %}
+%}
+
// src != 0, shift != 0, base != 0
instruct decodeN_notNull_addBase_Ex(iRegPdst dst, iRegNsrc src) %{
match(Set dst (DecodeN src));
@@ -6904,6 +7018,7 @@
n->bottom_type()->is_oopptr()->ptr() == TypePtr::Constant) &&
Universe::narrow_oop_shift() != 0 &&
Universe::narrow_oop_base() != 0);
+ ins_cost(2 * DEFAULT_COST);
format %{ "DecodeN $dst, $src \t// $src != NULL, postalloc expanded" %}
postalloc_expand( postalloc_expand_decode_oop_not_null(dst, src));
@@ -6973,13 +7088,12 @@
ins_pipe(pipe_class_default);
%}
-// base != 0
-// 32G aligned narrow oop base.
-instruct encodePKlass_32GAligned(iRegNdst dst, iRegPsrc src) %{
+// Disjoint narrow oop base.
+instruct encodePKlass_Disjoint(iRegNdst dst, iRegPsrc src) %{
match(Set dst (EncodePKlass src));
predicate(false /* TODO: PPC port Universe::narrow_klass_base_disjoint()*/);
- format %{ "EXTRDI $dst, $src, #32, #3 \t// encode with 32G aligned base" %}
+ format %{ "EXTRDI $dst, $src, #32, #3 \t// encode with disjoint base" %}
size(4);
ins_encode %{
// TODO: PPC port $archOpcode(ppc64Opcode_rldicl);
@@ -7486,7 +7600,7 @@
ins_encode %{
// TODO: PPC port $archOpcode(ppc64Opcode_compound);
__ cmpxchgd($crx$$CondRegister, R0, $oldVal$$Register, $newVal$$Register, $mem_ptr$$Register,
- MacroAssembler::MemBarNone, MacroAssembler::cmpxchgx_hint_atomic_update(),
+ MacroAssembler::MemBarAcq, MacroAssembler::cmpxchgx_hint_atomic_update(),
noreg, NULL, true);
%}
ins_pipe(pipe_class_default);
@@ -10476,7 +10590,7 @@
match(Set crx (CmpN src1 src2));
size(4);
- ins_cost(DEFAULT_COST);
+ ins_cost(2);
format %{ "CMPLW $crx, $src1, $src2 \t// compressed ptr" %}
ins_encode %{
// TODO: PPC port $archOpcode(ppc64Opcode_cmpl);
@@ -10488,7 +10602,7 @@
instruct cmpN_reg_imm0(flagsReg crx, iRegNsrc src1, immN_0 src2) %{
match(Set crx (CmpN src1 src2));
// Make this more expensive than zeroCheckN_iReg_imm0.
- ins_cost(DEFAULT_COST);
+ ins_cost(2);
format %{ "CMPLWI $crx, $src1, $src2 \t// compressed ptr" %}
size(4);
@@ -10508,6 +10622,7 @@
_kids[0]->_leaf->as_Bool()->_test._test == BoolTest::ne &&
_leaf->as_If()->_prob >= PROB_LIKELY_MAG(4) &&
Matcher::branches_to_uncommon_trap(_leaf));
+ ins_cost(1); // Should not be cheaper than zeroCheckN.
ins_is_TrapBasedCheckNode(true);
@@ -10889,7 +11004,7 @@
instruct partialSubtypeCheck(iRegPdst result, iRegP_N2P subklass, iRegP_N2P superklass,
iRegPdst tmp_klass, iRegPdst tmp_arrayptr) %{
match(Set result (PartialSubtypeCheck subklass superklass));
- effect(TEMP result, TEMP tmp_klass, TEMP tmp_arrayptr);
+ effect(TEMP_DEF result, TEMP tmp_klass, TEMP tmp_arrayptr);
ins_cost(DEFAULT_COST*10);
format %{ "PartialSubtypeCheck $result = ($subklass instanceOf $superklass) tmp: $tmp_klass, $tmp_arrayptr" %}
@@ -11000,7 +11115,7 @@
predicate(SpecialStringIndexOf); // type check implicit by parameter type, See Matcher::match_rule_supported
match(Set result (StrIndexOf (Binary haystack haycnt) (Binary (AddP needleImm offsetImm) needlecntImm)));
- effect(TEMP result, TEMP tmp1, TEMP tmp2, KILL cr0, KILL cr1);
+ effect(TEMP_DEF result, TEMP tmp1, TEMP tmp2, KILL cr0, KILL cr1);
ins_cost(150);
format %{ "String IndexOf CSCL1 $haystack[0..$haycnt], $needleImm+$offsetImm[0..$needlecntImm]"
@@ -11037,7 +11152,7 @@
iRegIdst tmp1, iRegIdst tmp2,
flagsRegCR0 cr0, flagsRegCR1 cr1) %{
match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
- effect(USE_KILL needle, /* TDEF needle, */ TEMP result,
+ effect(USE_KILL needle, /* TDEF needle, */ TEMP_DEF result,
TEMP tmp1, TEMP tmp2);
// Required for EA: check if it is still a type_array.
predicate(SpecialStringIndexOf && n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop() &&
@@ -11084,7 +11199,7 @@
iRegIdst tmp1, iRegIdst tmp2, iRegIdst tmp3, iRegIdst tmp4, iRegIdst tmp5,
flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6) %{
match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecntImm)));
- effect(USE_KILL haycnt, /* better: TDEF haycnt, */ TEMP result,
+ effect(USE_KILL haycnt, /* better: TDEF haycnt, */ TEMP_DEF result,
TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP tmp5, KILL cr0, KILL cr1, KILL cr6);
// Required for EA: check if it is still a type_array.
predicate(SpecialStringIndexOf && n->in(3)->in(1)->bottom_type()->is_aryptr()->const_oop() &&
@@ -11118,7 +11233,7 @@
flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6) %{
match(Set result (StrIndexOf (Binary haystack haycnt) (Binary needle needlecnt)));
effect(USE_KILL haycnt, USE_KILL needlecnt, /*better: TDEF haycnt, TDEF needlecnt,*/
- TEMP result,
+ TEMP_DEF result,
TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr0, KILL cr1, KILL cr6);
predicate(SpecialStringIndexOf); // See Matcher::match_rule_supported.
ins_cost(300);
@@ -11142,7 +11257,7 @@
iRegPdst tmp1, iRegPdst tmp2,
flagsRegCR0 cr0, flagsRegCR6 cr6, regCTR ctr) %{
match(Set result (StrEquals (Binary str1 str2) cntImm));
- effect(TEMP result, TEMP tmp1, TEMP tmp2,
+ effect(TEMP_DEF result, TEMP tmp1, TEMP tmp2,
KILL cr0, KILL cr6, KILL ctr);
predicate(SpecialStringEquals); // See Matcher::match_rule_supported.
ins_cost(250);
@@ -11165,7 +11280,7 @@
iRegPdst tmp1, iRegPdst tmp2, iRegPdst tmp3, iRegPdst tmp4, iRegPdst tmp5,
flagsRegCR0 cr0, flagsRegCR1 cr1, flagsRegCR6 cr6, regCTR ctr) %{
match(Set result (StrEquals (Binary str1 str2) cnt));
- effect(TEMP result, TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP tmp5,
+ effect(TEMP_DEF result, TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, TEMP tmp5,
KILL cr0, KILL cr1, KILL cr6, KILL ctr);
predicate(SpecialStringEquals); // See Matcher::match_rule_supported.
ins_cost(300);
@@ -11188,7 +11303,7 @@
instruct string_compare(rarg1RegP str1, rarg2RegP str2, rarg3RegI cnt1, rarg4RegI cnt2, iRegIdst result,
iRegPdst tmp, flagsRegCR0 cr0, regCTR ctr) %{
match(Set result (StrComp (Binary str1 cnt1) (Binary str2 cnt2)));
- effect(USE_KILL cnt1, USE_KILL cnt2, USE_KILL str1, USE_KILL str2, TEMP result, TEMP tmp, KILL cr0, KILL ctr);
+ effect(USE_KILL cnt1, USE_KILL cnt2, USE_KILL str1, USE_KILL str2, TEMP_DEF result, TEMP tmp, KILL cr0, KILL ctr);
ins_cost(300);
ins_alignment(8); // 'compute_padding()' gets called, up to this number-1 nops will get inserted.
--- a/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -483,15 +483,6 @@
}
-jbyte* G1PostBarrierStub::_byte_map_base = NULL;
-
-jbyte* G1PostBarrierStub::byte_map_base_slow() {
- BarrierSet* bs = Universe::heap()->barrier_set();
- assert(bs->is_a(BarrierSet::G1SATBCTLogging),
- "Must be if we're using this.");
- return ((G1SATBCardTableModRefBS*)bs)->byte_map_base;
-}
-
void G1PostBarrierStub::emit_code(LIR_Assembler* ce) {
__ bind(_entry);
--- a/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/cpu/x86/vm/c1_CodeStubs_x86.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -541,15 +541,6 @@
}
-jbyte* G1PostBarrierStub::_byte_map_base = NULL;
-
-jbyte* G1PostBarrierStub::byte_map_base_slow() {
- BarrierSet* bs = Universe::heap()->barrier_set();
- assert(bs->is_a(BarrierSet::G1SATBCTLogging),
- "Must be if we're using this.");
- return ((G1SATBCardTableModRefBS*)bs)->byte_map_base;
-}
-
void G1PostBarrierStub::emit_code(LIR_Assembler* ce) {
__ bind(_entry);
assert(addr()->is_register(), "Precondition.");
--- a/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/os/bsd/vm/perfMemory_bsd.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -197,7 +197,38 @@
}
-// check if the given path is considered a secure directory for
+// Check if the given statbuf is considered a secure directory for
+// the backing store files. Returns true if the directory is considered
+// a secure location. Returns false if the statbuf is a symbolic link or
+// if an error occurred.
+//
+static bool is_statbuf_secure(struct stat *statp) {
+ if (S_ISLNK(statp->st_mode) || !S_ISDIR(statp->st_mode)) {
+ // The path represents a link or some non-directory file type,
+ // which is not what we expected. Declare it insecure.
+ //
+ return false;
+ }
+ // We have an existing directory, check if the permissions are safe.
+ //
+ if ((statp->st_mode & (S_IWGRP|S_IWOTH)) != 0) {
+ // The directory is open for writing and could be subjected
+ // to a symlink or a hard link attack. Declare it insecure.
+ //
+ return false;
+ }
+ // See if the uid of the directory matches the effective uid of the process.
+ //
+ if (statp->st_uid != geteuid()) {
+ // The directory was not created by this user, declare it insecure.
+ //
+ return false;
+ }
+ return true;
+}
+
+
+// Check if the given path is considered a secure directory for
// the backing store files. Returns true if the directory exists
// and is considered a secure location. Returns false if the path
// is a symbolic link or if an error occurred.
@@ -211,27 +242,185 @@
return false;
}
- // the path exists, now check it's mode
- if (S_ISLNK(statbuf.st_mode) || !S_ISDIR(statbuf.st_mode)) {
- // the path represents a link or some non-directory file type,
- // which is not what we expected. declare it insecure.
- //
+ // The path exists, see if it is secure.
+ return is_statbuf_secure(&statbuf);
+}
+
+
+// Check if the given directory file descriptor is considered a secure
+// directory for the backing store files. Returns true if the directory
+// exists and is considered a secure location. Returns false if the path
+// is a symbolic link or if an error occurred.
+//
+static bool is_dirfd_secure(int dir_fd) {
+ struct stat statbuf;
+ int result = 0;
+
+ RESTARTABLE(::fstat(dir_fd, &statbuf), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+
+ // The path exists, now check its mode.
+ return is_statbuf_secure(&statbuf);
+}
+
+
+// Check to make sure fd1 and fd2 are referencing the same file system object.
+//
+static bool is_same_fsobject(int fd1, int fd2) {
+ struct stat statbuf1;
+ struct stat statbuf2;
+ int result = 0;
+
+ RESTARTABLE(::fstat(fd1, &statbuf1), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+ RESTARTABLE(::fstat(fd2, &statbuf2), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+
+ if ((statbuf1.st_ino == statbuf2.st_ino) &&
+ (statbuf1.st_dev == statbuf2.st_dev)) {
+ return true;
+ } else {
return false;
}
- else {
- // we have an existing directory, check if the permissions are safe.
- //
- if ((statbuf.st_mode & (S_IWGRP|S_IWOTH)) != 0) {
- // the directory is open for writing and could be subjected
- // to a symlnk attack. declare it insecure.
- //
- return false;
+}
+
+
+// Open the directory of the given path and validate it.
+// Return a DIR * of the open directory.
+//
+static DIR *open_directory_secure(const char* dirname) {
+ // Open the directory using open() so that it can be verified
+ // to be secure by calling is_dirfd_secure(), opendir() and then check
+ // to see if they are the same file system object. This method does not
+ // introduce a window of opportunity for the directory to be attacked that
+ // calling opendir() and is_directory_secure() does.
+ int result;
+ DIR *dirp = NULL;
+ RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result);
+ if (result == OS_ERR) {
+ // Directory doesn't exist or is a symlink, so there is nothing to cleanup.
+ if (PrintMiscellaneous && Verbose) {
+ if (errno == ELOOP) {
+ warning("directory %s is a symlink and is not secure\n", dirname);
+ } else {
+ warning("could not open directory %s: %s\n", dirname, strerror(errno));
+ }
}
+ return dirp;
+ }
+ int fd = result;
+
+ // Determine if the open directory is secure.
+ if (!is_dirfd_secure(fd)) {
+ // The directory is not a secure directory.
+ os::close(fd);
+ return dirp;
+ }
+
+ // Open the directory.
+ dirp = ::opendir(dirname);
+ if (dirp == NULL) {
+ // The directory doesn't exist, close fd and return.
+ os::close(fd);
+ return dirp;
+ }
+
+ // Check to make sure fd and dirp are referencing the same file system object.
+ if (!is_same_fsobject(fd, dirfd(dirp))) {
+ // The directory is not secure.
+ os::close(fd);
+ os::closedir(dirp);
+ dirp = NULL;
+ return dirp;
+ }
+
+ // Close initial open now that we know directory is secure
+ os::close(fd);
+
+ return dirp;
+}
+
+// NOTE: The code below uses fchdir(), open() and unlink() because
+// fdopendir(), openat() and unlinkat() are not supported on all
+// versions. Once the support for fdopendir(), openat() and unlinkat()
+// is available on all supported versions the code can be changed
+// to use these functions.
+
+// Open the directory of the given path, validate it and set the
+// current working directory to it.
+// Return a DIR * of the open directory and the saved cwd fd.
+//
+static DIR *open_directory_secure_cwd(const char* dirname, int *saved_cwd_fd) {
+
+ // Open the directory.
+ DIR* dirp = open_directory_secure(dirname);
+ if (dirp == NULL) {
+ // Directory doesn't exist or is insecure, so there is nothing to cleanup.
+ return dirp;
+ }
+ int fd = dirfd(dirp);
+
+ // Open a fd to the cwd and save it off.
+ int result;
+ RESTARTABLE(::open(".", O_RDONLY), result);
+ if (result == OS_ERR) {
+ *saved_cwd_fd = -1;
+ } else {
+ *saved_cwd_fd = result;
+ }
+
+ // Set the current directory to dirname by using the fd of the directory.
+ result = fchdir(fd);
+
+ return dirp;
+}
+
+// Close the directory and restore the current working directory.
+//
+static void close_directory_secure_cwd(DIR* dirp, int saved_cwd_fd) {
+
+ int result;
+ // If we have a saved cwd change back to it and close the fd.
+ if (saved_cwd_fd != -1) {
+ result = fchdir(saved_cwd_fd);
+ ::close(saved_cwd_fd);
+ }
+
+ // Close the directory.
+ os::closedir(dirp);
+}
+
+// Check if the given file descriptor is considered a secure.
+//
+static bool is_file_secure(int fd, const char *filename) {
+
+ int result;
+ struct stat statbuf;
+
+ // Determine if the file is secure.
+ RESTARTABLE(::fstat(fd, &statbuf), result);
+ if (result == OS_ERR) {
+ if (PrintMiscellaneous && Verbose) {
+ warning("fstat failed on %s: %s\n", filename, strerror(errno));
+ }
+ return false;
+ }
+ if (statbuf.st_nlink > 1) {
+ // A file with multiple links is not expected.
+ if (PrintMiscellaneous && Verbose) {
+ warning("file %s has multiple links\n", filename);
+ }
+ return false;
}
return true;
}
-
// return the user name for the given user id
//
// the caller is expected to free the allocated memory.
@@ -317,9 +506,11 @@
const char* tmpdirname = os::get_temp_directory();
+ // open the temp directory
DIR* tmpdirp = os::opendir(tmpdirname);
if (tmpdirp == NULL) {
+ // Cannot open the directory to get the user name, return.
return NULL;
}
@@ -344,25 +535,14 @@
strcat(usrdir_name, "/");
strcat(usrdir_name, dentry->d_name);
- DIR* subdirp = os::opendir(usrdir_name);
+ // open the user directory
+ DIR* subdirp = open_directory_secure(usrdir_name);
if (subdirp == NULL) {
FREE_C_HEAP_ARRAY(char, usrdir_name);
continue;
}
- // Since we don't create the backing store files in directories
- // pointed to by symbolic links, we also don't follow them when
- // looking for the files. We check for a symbolic link after the
- // call to opendir in order to eliminate a small window where the
- // symlink can be exploited.
- //
- if (!is_directory_secure(usrdir_name)) {
- FREE_C_HEAP_ARRAY(char, usrdir_name);
- os::closedir(subdirp);
- continue;
- }
-
struct dirent* udentry;
char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name), mtInternal);
errno = 0;
@@ -465,26 +645,6 @@
}
-// remove file
-//
-// this method removes the file with the given file name in the
-// named directory.
-//
-static void remove_file(const char* dirname, const char* filename) {
-
- size_t nbytes = strlen(dirname) + strlen(filename) + 2;
- char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
-
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, filename);
-
- remove_file(path);
-
- FREE_C_HEAP_ARRAY(char, path);
-}
-
-
// cleanup stale shared memory resources
//
// This method attempts to remove all stale shared memory files in
@@ -496,17 +656,11 @@
//
static void cleanup_sharedmem_resources(const char* dirname) {
- // open the user temp directory
- DIR* dirp = os::opendir(dirname);
-
+ int saved_cwd_fd;
+ // open the directory and set the current working directory to it
+ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd);
if (dirp == NULL) {
- // directory doesn't exist, so there is nothing to cleanup
- return;
- }
-
- if (!is_directory_secure(dirname)) {
- // the directory is not a secure directory
- os::closedir(dirp);
+ // directory doesn't exist or is insecure, so there is nothing to cleanup
return;
}
@@ -520,6 +674,7 @@
//
struct dirent* entry;
char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
+
errno = 0;
while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
@@ -530,7 +685,7 @@
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
// attempt to remove all unexpected files, except "." and ".."
- remove_file(dirname, entry->d_name);
+ unlink(entry->d_name);
}
errno = 0;
@@ -553,11 +708,14 @@
if ((pid == os::current_process_id()) ||
(kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) {
- remove_file(dirname, entry->d_name);
+ unlink(entry->d_name);
}
errno = 0;
}
- os::closedir(dirp);
+
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
+
FREE_C_HEAP_ARRAY(char, dbuf);
}
@@ -614,19 +772,54 @@
return -1;
}
- int result;
+ int saved_cwd_fd;
+ // open the directory and set the current working directory to it
+ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd);
+ if (dirp == NULL) {
+ // Directory doesn't exist or is insecure, so cannot create shared
+ // memory file.
+ return -1;
+ }
- RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result);
+ // Open the filename in the current directory.
+ // Cannot use O_TRUNC here; truncation of an existing file has to happen
+ // after the is_file_secure() check below.
+ int result;
+ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IREAD|S_IWRITE), result);
if (result == OS_ERR) {
if (PrintMiscellaneous && Verbose) {
- warning("could not create file %s: %s\n", filename, strerror(errno));
+ if (errno == ELOOP) {
+ warning("file %s is a symlink and is not secure\n", filename);
+ } else {
+ warning("could not create file %s: %s\n", filename, strerror(errno));
+ }
}
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
+
return -1;
}
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
// save the file descriptor
int fd = result;
+ // check to see if the file is secure
+ if (!is_file_secure(fd, filename)) {
+ ::close(fd);
+ return -1;
+ }
+
+ // truncate the file to get rid of any existing data
+ RESTARTABLE(::ftruncate(fd, (off_t)0), result);
+ if (result == OS_ERR) {
+ if (PrintMiscellaneous && Verbose) {
+ warning("could not truncate shared memory file: %s\n", strerror(errno));
+ }
+ ::close(fd);
+ return -1;
+ }
// set the file size
RESTARTABLE(::ftruncate(fd, (off_t)size), result);
if (result == OS_ERR) {
@@ -684,8 +877,15 @@
THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR);
}
}
+ int fd = result;
- return result;
+ // check to see if the file is secure
+ if (!is_file_secure(fd, filename)) {
+ ::close(fd);
+ return -1;
+ }
+
+ return fd;
}
// create a named shared memory region. returns the address of the
@@ -717,13 +917,21 @@
char* dirname = get_user_tmp_dir(user_name);
char* filename = get_sharedmem_filename(dirname, vmid);
+ // get the short filename
+ char* short_filename = strrchr(filename, '/');
+ if (short_filename == NULL) {
+ short_filename = filename;
+ } else {
+ short_filename++;
+ }
+
// cleanup any stale shared memory files
cleanup_sharedmem_resources(dirname);
assert(((size > 0) && (size % os::vm_page_size() == 0)),
"unexpected PerfMemory region size");
- fd = create_sharedmem_resources(dirname, filename, size);
+ fd = create_sharedmem_resources(dirname, short_filename, size);
FREE_C_HEAP_ARRAY(char, user_name);
FREE_C_HEAP_ARRAY(char, dirname);
@@ -838,12 +1046,12 @@
// constructs for the file and the shared memory mapping.
if (mode == PerfMemory::PERF_MODE_RO) {
mmap_prot = PROT_READ;
- file_flags = O_RDONLY;
+ file_flags = O_RDONLY | O_NOFOLLOW;
}
else if (mode == PerfMemory::PERF_MODE_RW) {
#ifdef LATER
mmap_prot = PROT_READ | PROT_WRITE;
- file_flags = O_RDWR;
+ file_flags = O_RDWR | O_NOFOLLOW;
#else
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
"Unsupported access mode");
--- a/hotspot/src/os/linux/vm/perfMemory_linux.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/os/linux/vm/perfMemory_linux.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -197,7 +197,38 @@
}
-// check if the given path is considered a secure directory for
+// Check if the given statbuf is considered a secure directory for
+// the backing store files. Returns true if the directory is considered
+// a secure location. Returns false if the statbuf is a symbolic link or
+// if an error occurred.
+//
+static bool is_statbuf_secure(struct stat *statp) {
+ if (S_ISLNK(statp->st_mode) || !S_ISDIR(statp->st_mode)) {
+ // The path represents a link or some non-directory file type,
+ // which is not what we expected. Declare it insecure.
+ //
+ return false;
+ }
+ // We have an existing directory, check if the permissions are safe.
+ //
+ if ((statp->st_mode & (S_IWGRP|S_IWOTH)) != 0) {
+ // The directory is open for writing and could be subjected
+ // to a symlink or a hard link attack. Declare it insecure.
+ //
+ return false;
+ }
+ // See if the uid of the directory matches the effective uid of the process.
+ //
+ if (statp->st_uid != geteuid()) {
+ // The directory was not created by this user, declare it insecure.
+ //
+ return false;
+ }
+ return true;
+}
+
+
+// Check if the given path is considered a secure directory for
// the backing store files. Returns true if the directory exists
// and is considered a secure location. Returns false if the path
// is a symbolic link or if an error occurred.
@@ -211,22 +242,180 @@
return false;
}
- // the path exists, now check it's mode
- if (S_ISLNK(statbuf.st_mode) || !S_ISDIR(statbuf.st_mode)) {
- // the path represents a link or some non-directory file type,
- // which is not what we expected. declare it insecure.
- //
+ // The path exists, see if it is secure.
+ return is_statbuf_secure(&statbuf);
+}
+
+
+// Check if the given directory file descriptor is considered a secure
+// directory for the backing store files. Returns true if the directory
+// exists and is considered a secure location. Returns false if the path
+// is a symbolic link or if an error occurred.
+//
+static bool is_dirfd_secure(int dir_fd) {
+ struct stat statbuf;
+ int result = 0;
+
+ RESTARTABLE(::fstat(dir_fd, &statbuf), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+
+ // The path exists, now check its mode.
+ return is_statbuf_secure(&statbuf);
+}
+
+
+// Check to make sure fd1 and fd2 are referencing the same file system object.
+//
+static bool is_same_fsobject(int fd1, int fd2) {
+ struct stat statbuf1;
+ struct stat statbuf2;
+ int result = 0;
+
+ RESTARTABLE(::fstat(fd1, &statbuf1), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+ RESTARTABLE(::fstat(fd2, &statbuf2), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+
+ if ((statbuf1.st_ino == statbuf2.st_ino) &&
+ (statbuf1.st_dev == statbuf2.st_dev)) {
+ return true;
+ } else {
return false;
}
- else {
- // we have an existing directory, check if the permissions are safe.
- //
- if ((statbuf.st_mode & (S_IWGRP|S_IWOTH)) != 0) {
- // the directory is open for writing and could be subjected
- // to a symlnk attack. declare it insecure.
- //
- return false;
+}
+
+
+// Open the directory of the given path and validate it.
+// Return a DIR * of the open directory.
+//
+static DIR *open_directory_secure(const char* dirname) {
+ // Open the directory using open() so that it can be verified
+ // to be secure by calling is_dirfd_secure(), opendir() and then check
+ // to see if they are the same file system object. This method does not
+ // introduce a window of opportunity for the directory to be attacked that
+ // calling opendir() and is_directory_secure() does.
+ int result;
+ DIR *dirp = NULL;
+ RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result);
+ if (result == OS_ERR) {
+ if (PrintMiscellaneous && Verbose) {
+ if (errno == ELOOP) {
+ warning("directory %s is a symlink and is not secure\n", dirname);
+ } else {
+ warning("could not open directory %s: %s\n", dirname, strerror(errno));
+ }
}
+ return dirp;
+ }
+ int fd = result;
+
+ // Determine if the open directory is secure.
+ if (!is_dirfd_secure(fd)) {
+ // The directory is not a secure directory.
+ os::close(fd);
+ return dirp;
+ }
+
+ // Open the directory.
+ dirp = ::opendir(dirname);
+ if (dirp == NULL) {
+ // The directory doesn't exist, close fd and return.
+ os::close(fd);
+ return dirp;
+ }
+
+ // Check to make sure fd and dirp are referencing the same file system object.
+ if (!is_same_fsobject(fd, dirfd(dirp))) {
+ // The directory is not secure.
+ os::close(fd);
+ os::closedir(dirp);
+ dirp = NULL;
+ return dirp;
+ }
+
+ // Close initial open now that we know directory is secure
+ os::close(fd);
+
+ return dirp;
+}
+
+// NOTE: The code below uses fchdir(), open() and unlink() because
+// fdopendir(), openat() and unlinkat() are not supported on all
+// versions. Once the support for fdopendir(), openat() and unlinkat()
+// is available on all supported versions the code can be changed
+// to use these functions.
+
+// Open the directory of the given path, validate it and set the
+// current working directory to it.
+// Return a DIR * of the open directory and the saved cwd fd.
+//
+static DIR *open_directory_secure_cwd(const char* dirname, int *saved_cwd_fd) {
+
+ // Open the directory.
+ DIR* dirp = open_directory_secure(dirname);
+ if (dirp == NULL) {
+ // Directory doesn't exist or is insecure, so there is nothing to cleanup.
+ return dirp;
+ }
+ int fd = dirfd(dirp);
+
+ // Open a fd to the cwd and save it off.
+ int result;
+ RESTARTABLE(::open(".", O_RDONLY), result);
+ if (result == OS_ERR) {
+ *saved_cwd_fd = -1;
+ } else {
+ *saved_cwd_fd = result;
+ }
+
+ // Set the current directory to dirname by using the fd of the directory.
+ result = fchdir(fd);
+
+ return dirp;
+}
+
+// Close the directory and restore the current working directory.
+//
+static void close_directory_secure_cwd(DIR* dirp, int saved_cwd_fd) {
+
+ int result;
+ // If we have a saved cwd change back to it and close the fd.
+ if (saved_cwd_fd != -1) {
+ result = fchdir(saved_cwd_fd);
+ ::close(saved_cwd_fd);
+ }
+
+ // Close the directory.
+ os::closedir(dirp);
+}
+
+// Check if the given file descriptor is considered a secure.
+//
+static bool is_file_secure(int fd, const char *filename) {
+
+ int result;
+ struct stat statbuf;
+
+ // Determine if the file is secure.
+ RESTARTABLE(::fstat(fd, &statbuf), result);
+ if (result == OS_ERR) {
+ if (PrintMiscellaneous && Verbose) {
+ warning("fstat failed on %s: %s\n", filename, strerror(errno));
+ }
+ return false;
+ }
+ if (statbuf.st_nlink > 1) {
+ // A file with multiple links is not expected.
+ if (PrintMiscellaneous && Verbose) {
+ warning("file %s has multiple links\n", filename);
+ }
+ return false;
}
return true;
}
@@ -317,9 +506,11 @@
const char* tmpdirname = os::get_temp_directory();
+ // open the temp directory
DIR* tmpdirp = os::opendir(tmpdirname);
if (tmpdirp == NULL) {
+ // Cannot open the directory to get the user name, return.
return NULL;
}
@@ -344,7 +535,8 @@
strcat(usrdir_name, "/");
strcat(usrdir_name, dentry->d_name);
- DIR* subdirp = os::opendir(usrdir_name);
+ // open the user directory
+ DIR* subdirp = open_directory_secure(usrdir_name);
if (subdirp == NULL) {
FREE_C_HEAP_ARRAY(char, usrdir_name);
@@ -465,26 +657,6 @@
}
-// remove file
-//
-// this method removes the file with the given file name in the
-// named directory.
-//
-static void remove_file(const char* dirname, const char* filename) {
-
- size_t nbytes = strlen(dirname) + strlen(filename) + 2;
- char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
-
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, filename);
-
- remove_file(path);
-
- FREE_C_HEAP_ARRAY(char, path);
-}
-
-
// cleanup stale shared memory resources
//
// This method attempts to remove all stale shared memory files in
@@ -496,17 +668,11 @@
//
static void cleanup_sharedmem_resources(const char* dirname) {
- // open the user temp directory
- DIR* dirp = os::opendir(dirname);
-
+ int saved_cwd_fd;
+ // open the directory
+ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd);
if (dirp == NULL) {
- // directory doesn't exist, so there is nothing to cleanup
- return;
- }
-
- if (!is_directory_secure(dirname)) {
- // the directory is not a secure directory
- os::closedir(dirp);
+ // directory doesn't exist or is insecure, so there is nothing to cleanup
return;
}
@@ -520,6 +686,7 @@
//
struct dirent* entry;
char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
+
errno = 0;
while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
@@ -528,9 +695,8 @@
if (pid == 0) {
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
-
// attempt to remove all unexpected files, except "." and ".."
- remove_file(dirname, entry->d_name);
+ unlink(entry->d_name);
}
errno = 0;
@@ -552,12 +718,14 @@
//
if ((pid == os::current_process_id()) ||
(kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) {
-
- remove_file(dirname, entry->d_name);
+ unlink(entry->d_name);
}
errno = 0;
}
- os::closedir(dirp);
+
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
+
FREE_C_HEAP_ARRAY(char, dbuf);
}
@@ -614,19 +782,54 @@
return -1;
}
- int result;
+ int saved_cwd_fd;
+ // open the directory and set the current working directory to it
+ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd);
+ if (dirp == NULL) {
+ // Directory doesn't exist or is insecure, so cannot create shared
+ // memory file.
+ return -1;
+ }
- RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result);
+ // Open the filename in the current directory.
+ // Cannot use O_TRUNC here; truncation of an existing file has to happen
+ // after the is_file_secure() check below.
+ int result;
+ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IREAD|S_IWRITE), result);
if (result == OS_ERR) {
if (PrintMiscellaneous && Verbose) {
- warning("could not create file %s: %s\n", filename, strerror(errno));
+ if (errno == ELOOP) {
+ warning("file %s is a symlink and is not secure\n", filename);
+ } else {
+ warning("could not create file %s: %s\n", filename, strerror(errno));
+ }
}
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
+
return -1;
}
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
// save the file descriptor
int fd = result;
+ // check to see if the file is secure
+ if (!is_file_secure(fd, filename)) {
+ ::close(fd);
+ return -1;
+ }
+
+ // truncate the file to get rid of any existing data
+ RESTARTABLE(::ftruncate(fd, (off_t)0), result);
+ if (result == OS_ERR) {
+ if (PrintMiscellaneous && Verbose) {
+ warning("could not truncate shared memory file: %s\n", strerror(errno));
+ }
+ ::close(fd);
+ return -1;
+ }
// set the file size
RESTARTABLE(::ftruncate(fd, (off_t)size), result);
if (result == OS_ERR) {
@@ -684,8 +887,15 @@
THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR);
}
}
+ int fd = result;
- return result;
+ // check to see if the file is secure
+ if (!is_file_secure(fd, filename)) {
+ ::close(fd);
+ return -1;
+ }
+
+ return fd;
}
// create a named shared memory region. returns the address of the
@@ -716,6 +926,13 @@
char* dirname = get_user_tmp_dir(user_name);
char* filename = get_sharedmem_filename(dirname, vmid);
+ // get the short filename
+ char* short_filename = strrchr(filename, '/');
+ if (short_filename == NULL) {
+ short_filename = filename;
+ } else {
+ short_filename++;
+ }
// cleanup any stale shared memory files
cleanup_sharedmem_resources(dirname);
@@ -723,7 +940,7 @@
assert(((size > 0) && (size % os::vm_page_size() == 0)),
"unexpected PerfMemory region size");
- fd = create_sharedmem_resources(dirname, filename, size);
+ fd = create_sharedmem_resources(dirname, short_filename, size);
FREE_C_HEAP_ARRAY(char, user_name);
FREE_C_HEAP_ARRAY(char, dirname);
@@ -838,12 +1055,12 @@
// constructs for the file and the shared memory mapping.
if (mode == PerfMemory::PERF_MODE_RO) {
mmap_prot = PROT_READ;
- file_flags = O_RDONLY;
+ file_flags = O_RDONLY | O_NOFOLLOW;
}
else if (mode == PerfMemory::PERF_MODE_RW) {
#ifdef LATER
mmap_prot = PROT_READ | PROT_WRITE;
- file_flags = O_RDWR;
+ file_flags = O_RDWR | O_NOFOLLOW;
#else
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
"Unsupported access mode");
--- a/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/os/solaris/vm/perfMemory_solaris.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -199,7 +199,38 @@
}
-// check if the given path is considered a secure directory for
+// Check if the given statbuf is considered a secure directory for
+// the backing store files. Returns true if the directory is considered
+// a secure location. Returns false if the statbuf is a symbolic link or
+// if an error occurred.
+//
+static bool is_statbuf_secure(struct stat *statp) {
+ if (S_ISLNK(statp->st_mode) || !S_ISDIR(statp->st_mode)) {
+ // The path represents a link or some non-directory file type,
+ // which is not what we expected. Declare it insecure.
+ //
+ return false;
+ }
+ // We have an existing directory, check if the permissions are safe.
+ //
+ if ((statp->st_mode & (S_IWGRP|S_IWOTH)) != 0) {
+ // The directory is open for writing and could be subjected
+ // to a symlink or a hard link attack. Declare it insecure.
+ //
+ return false;
+ }
+ // See if the uid of the directory matches the effective uid of the process.
+ //
+ if (statp->st_uid != geteuid()) {
+ // The directory was not created by this user, declare it insecure.
+ //
+ return false;
+ }
+ return true;
+}
+
+
+// Check if the given path is considered a secure directory for
// the backing store files. Returns true if the directory exists
// and is considered a secure location. Returns false if the path
// is a symbolic link or if an error occurred.
@@ -213,27 +244,185 @@
return false;
}
- // the path exists, now check it's mode
- if (S_ISLNK(statbuf.st_mode) || !S_ISDIR(statbuf.st_mode)) {
- // the path represents a link or some non-directory file type,
- // which is not what we expected. declare it insecure.
- //
+ // The path exists, see if it is secure.
+ return is_statbuf_secure(&statbuf);
+}
+
+
+// Check if the given directory file descriptor is considered a secure
+// directory for the backing store files. Returns true if the directory
+// exists and is considered a secure location. Returns false if the path
+// is a symbolic link or if an error occurred.
+//
+static bool is_dirfd_secure(int dir_fd) {
+ struct stat statbuf;
+ int result = 0;
+
+ RESTARTABLE(::fstat(dir_fd, &statbuf), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+
+ // The path exists, now check its mode.
+ return is_statbuf_secure(&statbuf);
+}
+
+
+// Check to make sure fd1 and fd2 are referencing the same file system object.
+//
+static bool is_same_fsobject(int fd1, int fd2) {
+ struct stat statbuf1;
+ struct stat statbuf2;
+ int result = 0;
+
+ RESTARTABLE(::fstat(fd1, &statbuf1), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+ RESTARTABLE(::fstat(fd2, &statbuf2), result);
+ if (result == OS_ERR) {
+ return false;
+ }
+
+ if ((statbuf1.st_ino == statbuf2.st_ino) &&
+ (statbuf1.st_dev == statbuf2.st_dev)) {
+ return true;
+ } else {
return false;
}
- else {
- // we have an existing directory, check if the permissions are safe.
- //
- if ((statbuf.st_mode & (S_IWGRP|S_IWOTH)) != 0) {
- // the directory is open for writing and could be subjected
- // to a symlnk attack. declare it insecure.
- //
- return false;
+}
+
+
+// Open the directory of the given path and validate it.
+// Return a DIR * of the open directory.
+//
+static DIR *open_directory_secure(const char* dirname) {
+ // Open the directory using open() so that it can be verified
+ // to be secure by calling is_dirfd_secure(), opendir() and then check
+ // to see if they are the same file system object. This method does not
+ // introduce a window of opportunity for the directory to be attacked that
+ // calling opendir() and is_directory_secure() does.
+ int result;
+ DIR *dirp = NULL;
+ RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result);
+ if (result == OS_ERR) {
+ // Directory doesn't exist or is a symlink, so there is nothing to cleanup.
+ if (PrintMiscellaneous && Verbose) {
+ if (errno == ELOOP) {
+ warning("directory %s is a symlink and is not secure\n", dirname);
+ } else {
+ warning("could not open directory %s: %s\n", dirname, strerror(errno));
+ }
}
+ return dirp;
+ }
+ int fd = result;
+
+ // Determine if the open directory is secure.
+ if (!is_dirfd_secure(fd)) {
+ // The directory is not a secure directory.
+ os::close(fd);
+ return dirp;
+ }
+
+ // Open the directory.
+ dirp = ::opendir(dirname);
+ if (dirp == NULL) {
+ // The directory doesn't exist, close fd and return.
+ os::close(fd);
+ return dirp;
+ }
+
+ // Check to make sure fd and dirp are referencing the same file system object.
+ if (!is_same_fsobject(fd, dirp->dd_fd)) {
+ // The directory is not secure.
+ os::close(fd);
+ os::closedir(dirp);
+ dirp = NULL;
+ return dirp;
+ }
+
+ // Close initial open now that we know directory is secure
+ os::close(fd);
+
+ return dirp;
+}
+
+// NOTE: The code below uses fchdir(), open() and unlink() because
+// fdopendir(), openat() and unlinkat() are not supported on all
+// versions. Once the support for fdopendir(), openat() and unlinkat()
+// is available on all supported versions the code can be changed
+// to use these functions.
+
+// Open the directory of the given path, validate it and set the
+// current working directory to it.
+// Return a DIR * of the open directory and the saved cwd fd.
+//
+static DIR *open_directory_secure_cwd(const char* dirname, int *saved_cwd_fd) {
+
+ // Open the directory.
+ DIR* dirp = open_directory_secure(dirname);
+ if (dirp == NULL) {
+ // Directory doesn't exist or is insecure, so there is nothing to cleanup.
+ return dirp;
+ }
+ int fd = dirp->dd_fd;
+
+ // Open a fd to the cwd and save it off.
+ int result;
+ RESTARTABLE(::open(".", O_RDONLY), result);
+ if (result == OS_ERR) {
+ *saved_cwd_fd = -1;
+ } else {
+ *saved_cwd_fd = result;
+ }
+
+ // Set the current directory to dirname by using the fd of the directory.
+ result = fchdir(fd);
+
+ return dirp;
+}
+
+// Close the directory and restore the current working directory.
+//
+static void close_directory_secure_cwd(DIR* dirp, int saved_cwd_fd) {
+
+ int result;
+ // If we have a saved cwd change back to it and close the fd.
+ if (saved_cwd_fd != -1) {
+ result = fchdir(saved_cwd_fd);
+ ::close(saved_cwd_fd);
+ }
+
+ // Close the directory.
+ os::closedir(dirp);
+}
+
+// Check if the given file descriptor is considered a secure.
+//
+static bool is_file_secure(int fd, const char *filename) {
+
+ int result;
+ struct stat statbuf;
+
+ // Determine if the file is secure.
+ RESTARTABLE(::fstat(fd, &statbuf), result);
+ if (result == OS_ERR) {
+ if (PrintMiscellaneous && Verbose) {
+ warning("fstat failed on %s: %s\n", filename, strerror(errno));
+ }
+ return false;
+ }
+ if (statbuf.st_nlink > 1) {
+ // A file with multiple links is not expected.
+ if (PrintMiscellaneous && Verbose) {
+ warning("file %s has multiple links\n", filename);
+ }
+ return false;
}
return true;
}
-
// return the user name for the given user id
//
// the caller is expected to free the allocated memory.
@@ -308,9 +497,11 @@
const char* tmpdirname = os::get_temp_directory();
+ // open the temp directory
DIR* tmpdirp = os::opendir(tmpdirname);
if (tmpdirp == NULL) {
+ // Cannot open the directory to get the user name, return.
return NULL;
}
@@ -335,7 +526,8 @@
strcat(usrdir_name, "/");
strcat(usrdir_name, dentry->d_name);
- DIR* subdirp = os::opendir(usrdir_name);
+ // open the user directory
+ DIR* subdirp = open_directory_secure(usrdir_name);
if (subdirp == NULL) {
FREE_C_HEAP_ARRAY(char, usrdir_name);
@@ -504,26 +696,6 @@
}
-// remove file
-//
-// this method removes the file with the given file name in the
-// named directory.
-//
-static void remove_file(const char* dirname, const char* filename) {
-
- size_t nbytes = strlen(dirname) + strlen(filename) + 2;
- char* path = NEW_C_HEAP_ARRAY(char, nbytes, mtInternal);
-
- strcpy(path, dirname);
- strcat(path, "/");
- strcat(path, filename);
-
- remove_file(path);
-
- FREE_C_HEAP_ARRAY(char, path);
-}
-
-
// cleanup stale shared memory resources
//
// This method attempts to remove all stale shared memory files in
@@ -535,17 +707,11 @@
//
static void cleanup_sharedmem_resources(const char* dirname) {
- // open the user temp directory
- DIR* dirp = os::opendir(dirname);
-
+ int saved_cwd_fd;
+ // open the directory
+ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd);
if (dirp == NULL) {
- // directory doesn't exist, so there is nothing to cleanup
- return;
- }
-
- if (!is_directory_secure(dirname)) {
- // the directory is not a secure directory
- os::closedir(dirp);
+ // directory doesn't exist or is insecure, so there is nothing to cleanup
return;
}
@@ -559,6 +725,7 @@
//
struct dirent* entry;
char* dbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(dirname), mtInternal);
+
errno = 0;
while ((entry = os::readdir(dirp, (struct dirent *)dbuf)) != NULL) {
@@ -569,7 +736,7 @@
if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) {
// attempt to remove all unexpected files, except "." and ".."
- remove_file(dirname, entry->d_name);
+ unlink(entry->d_name);
}
errno = 0;
@@ -592,11 +759,14 @@
if ((pid == os::current_process_id()) ||
(kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) {
- remove_file(dirname, entry->d_name);
+ unlink(entry->d_name);
}
errno = 0;
}
- os::closedir(dirp);
+
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
+
FREE_C_HEAP_ARRAY(char, dbuf);
}
@@ -653,19 +823,54 @@
return -1;
}
- int result;
+ int saved_cwd_fd;
+ // open the directory and set the current working directory to it
+ DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd);
+ if (dirp == NULL) {
+ // Directory doesn't exist or is insecure, so cannot create shared
+ // memory file.
+ return -1;
+ }
- RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result);
+ // Open the filename in the current directory.
+ // Cannot use O_TRUNC here; truncation of an existing file has to happen
+ // after the is_file_secure() check below.
+ int result;
+ RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_NOFOLLOW, S_IREAD|S_IWRITE), result);
if (result == OS_ERR) {
if (PrintMiscellaneous && Verbose) {
- warning("could not create file %s: %s\n", filename, strerror(errno));
+ if (errno == ELOOP) {
+ warning("file %s is a symlink and is not secure\n", filename);
+ } else {
+ warning("could not create file %s: %s\n", filename, strerror(errno));
+ }
}
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
+
return -1;
}
+ // close the directory and reset the current working directory
+ close_directory_secure_cwd(dirp, saved_cwd_fd);
// save the file descriptor
int fd = result;
+ // check to see if the file is secure
+ if (!is_file_secure(fd, filename)) {
+ ::close(fd);
+ return -1;
+ }
+
+ // truncate the file to get rid of any existing data
+ RESTARTABLE(::ftruncate(fd, (off_t)0), result);
+ if (result == OS_ERR) {
+ if (PrintMiscellaneous && Verbose) {
+ warning("could not truncate shared memory file: %s\n", strerror(errno));
+ }
+ ::close(fd);
+ return -1;
+ }
// set the file size
RESTARTABLE(::ftruncate(fd, (off_t)size), result);
if (result == OS_ERR) {
@@ -701,8 +906,15 @@
THROW_MSG_(vmSymbols::java_io_IOException(), strerror(errno), OS_ERR);
}
}
+ int fd = result;
- return result;
+ // check to see if the file is secure
+ if (!is_file_secure(fd, filename)) {
+ ::close(fd);
+ return -1;
+ }
+
+ return fd;
}
// create a named shared memory region. returns the address of the
@@ -734,13 +946,21 @@
char* dirname = get_user_tmp_dir(user_name);
char* filename = get_sharedmem_filename(dirname, vmid);
+ // get the short filename
+ char* short_filename = strrchr(filename, '/');
+ if (short_filename == NULL) {
+ short_filename = filename;
+ } else {
+ short_filename++;
+ }
+
// cleanup any stale shared memory files
cleanup_sharedmem_resources(dirname);
assert(((size > 0) && (size % os::vm_page_size() == 0)),
"unexpected PerfMemory region size");
- fd = create_sharedmem_resources(dirname, filename, size);
+ fd = create_sharedmem_resources(dirname, short_filename, size);
FREE_C_HEAP_ARRAY(char, user_name);
FREE_C_HEAP_ARRAY(char, dirname);
@@ -856,12 +1076,12 @@
// constructs for the file and the shared memory mapping.
if (mode == PerfMemory::PERF_MODE_RO) {
mmap_prot = PROT_READ;
- file_flags = O_RDONLY;
+ file_flags = O_RDONLY | O_NOFOLLOW;
}
else if (mode == PerfMemory::PERF_MODE_RW) {
#ifdef LATER
mmap_prot = PROT_READ | PROT_WRITE;
- file_flags = O_RDWR;
+ file_flags = O_RDWR | O_NOFOLLOW;
#else
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
"Unsupported access mode");
--- a/hotspot/src/os/windows/vm/os_windows.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -428,9 +428,9 @@
}
// Diagnostic code to investigate JDK-6573254
- int res = 50115; // non-java thread
+ int res = 30115; // non-java thread
if (thread->is_Java_thread()) {
- res = 40115; // java thread
+ res = 20115; // java thread
}
// Install a win32 structured exception handler around every thread created
@@ -3791,6 +3791,7 @@
static INIT_ONCE init_once_crit_sect = INIT_ONCE_STATIC_INIT;
static CRITICAL_SECTION crit_sect;
+ static volatile jint process_exiting = 0;
int i, j;
DWORD res;
HANDLE hproc, hthr;
@@ -3798,10 +3799,10 @@
// The first thread that reached this point, initializes the critical section.
if (!InitOnceExecuteOnce(&init_once_crit_sect, init_crit_sect_call, &crit_sect, NULL)) {
warning("crit_sect initialization failed in %s: %d\n", __FILE__, __LINE__);
- } else {
+ } else if (OrderAccess::load_acquire(&process_exiting) == 0) {
EnterCriticalSection(&crit_sect);
- if (what == EPT_THREAD) {
+ if (what == EPT_THREAD && OrderAccess::load_acquire(&process_exiting) == 0) {
// Remove from the array those handles of the threads that have completed exiting.
for (i = 0, j = 0; i < handle_count; ++i) {
res = WaitForSingleObject(handles[i], 0 /* don't wait */);
@@ -3856,7 +3857,7 @@
// The current exiting thread has stored its handle in the array, and now
// should leave the critical section before calling _endthreadex().
- } else { // what != EPT_THREAD
+ } else if (what != EPT_THREAD) {
if (handle_count > 0) {
// Before ending the process, make sure all the threads that had called
// _endthreadex() completed.
@@ -3882,24 +3883,28 @@
handle_count = 0;
}
- // End the process, not leaving critical section.
- // This makes sure no other thread executes exit-related code at the same
- // time, thus a race is avoided.
- if (what == EPT_PROCESS) {
- ::exit(exit_code);
- } else {
- _exit(exit_code);
- }
+ OrderAccess::release_store(&process_exiting, 1);
}
LeaveCriticalSection(&crit_sect);
}
+
+ if (what == EPT_THREAD) {
+ while (OrderAccess::load_acquire(&process_exiting) != 0) {
+ // Some other thread is about to call exit(), so we
+ // don't let the current thread proceed to _endthreadex()
+ SuspendThread(GetCurrentThread());
+ // Avoid busy-wait loop, if SuspendThread() failed.
+ Sleep(EXIT_TIMEOUT);
+ }
+ }
}
// We are here if either
// - there's no 'race at exit' bug on this OS release;
// - initialization of the critical section failed (unlikely);
- // - the current thread has stored its handle and left the critical section.
+ // - the current thread has stored its handle and left the critical section;
+ // - the process-exiting thread has raised the flag and left the critical section.
if (what == EPT_THREAD) {
_endthreadex((unsigned)exit_code);
} else if (what == EPT_PROCESS) {
--- a/hotspot/src/share/vm/c1/c1_CodeStubs.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/c1/c1_CodeStubs.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -601,15 +601,6 @@
LIR_Opr _addr;
LIR_Opr _new_val;
- static jbyte* _byte_map_base;
- static jbyte* byte_map_base_slow();
- static jbyte* byte_map_base() {
- if (_byte_map_base == NULL) {
- _byte_map_base = byte_map_base_slow();
- }
- return _byte_map_base;
- }
-
public:
// addr (the address of the object head) and new_val must be registers.
G1PostBarrierStub(LIR_Opr addr, LIR_Opr new_val): _addr(addr), _new_val(new_val) { }
--- a/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/ci/bcEscapeAnalyzer.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -89,8 +89,8 @@
public:
ArgumentMap *_vars;
ArgumentMap *_stack;
- short _stack_height;
- short _max_stack;
+ int _stack_height;
+ int _max_stack;
bool _initialized;
ArgumentMap empty_map;
--- a/hotspot/src/share/vm/classfile/compactHashtable.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/compactHashtable.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -221,6 +221,30 @@
return (const char*)end;
}
+template <class T, class N> void CompactHashtable<T, N>::symbols_do(SymbolClosure *cl) {
+ assert(!DumpSharedSpaces, "run-time only");
+ for (juint i = 0; i < _bucket_count; i ++) {
+ juint bucket_info = _buckets[i];
+ juint bucket_offset = BUCKET_OFFSET(bucket_info);
+ int bucket_type = BUCKET_TYPE(bucket_info);
+ juint* bucket = _buckets + bucket_offset;
+ juint* bucket_end = _buckets;
+
+ Symbol* sym;
+ if (bucket_type == COMPACT_BUCKET_TYPE) {
+ sym = (Symbol*)((void*)(_base_address + bucket[0]));
+ cl->do_symbol(&sym);
+ } else {
+ bucket_end += BUCKET_OFFSET(_buckets[i + 1]);
+ while (bucket < bucket_end) {
+ sym = (Symbol*)((void*)(_base_address + bucket[1]));
+ cl->do_symbol(&sym);
+ bucket += 2;
+ }
+ }
+ }
+}
+
// Explicitly instantiate these types
template class CompactHashtable<Symbol*, char>;
--- a/hotspot/src/share/vm/classfile/compactHashtable.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/compactHashtable.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -249,6 +249,9 @@
}
return NULL;
}
+
+ // iterate over symbols
+ void symbols_do(SymbolClosure *cl);
};
////////////////////////////////////////////////////////////////////////
--- a/hotspot/src/share/vm/classfile/symbolTable.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/symbolTable.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -82,6 +82,10 @@
// Call function for all symbols in the symbol table.
void SymbolTable::symbols_do(SymbolClosure *cl) {
+ // all symbols from shared table
+ _shared_table.symbols_do(cl);
+
+ // all symbols from the dynamic table
const int n = the_table()->table_size();
for (int i = 0; i < n; i++) {
for (HashtableEntry<Symbol*, mtSymbol>* p = the_table()->bucket(i);
--- a/hotspot/src/share/vm/classfile/systemDictionary.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/systemDictionary.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1905,11 +1905,12 @@
InstanceKlass::cast(WK_KLASS(Reference_klass))->set_reference_type(REF_OTHER);
InstanceRefKlass::update_nonstatic_oop_maps(WK_KLASS(Reference_klass));
- initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(PhantomReference_klass), scan, CHECK);
+ initialize_wk_klasses_through(WK_KLASS_ENUM_NAME(Cleaner_klass), scan, CHECK);
InstanceKlass::cast(WK_KLASS(SoftReference_klass))->set_reference_type(REF_SOFT);
InstanceKlass::cast(WK_KLASS(WeakReference_klass))->set_reference_type(REF_WEAK);
InstanceKlass::cast(WK_KLASS(FinalReference_klass))->set_reference_type(REF_FINAL);
InstanceKlass::cast(WK_KLASS(PhantomReference_klass))->set_reference_type(REF_PHANTOM);
+ InstanceKlass::cast(WK_KLASS(Cleaner_klass))->set_reference_type(REF_CLEANER);
// JSR 292 classes
WKID jsr292_group_start = WK_KLASS_ENUM_NAME(MethodHandle_klass);
--- a/hotspot/src/share/vm/classfile/systemDictionary.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -128,6 +128,7 @@
do_klass(WeakReference_klass, java_lang_ref_WeakReference, Pre ) \
do_klass(FinalReference_klass, java_lang_ref_FinalReference, Pre ) \
do_klass(PhantomReference_klass, java_lang_ref_PhantomReference, Pre ) \
+ do_klass(Cleaner_klass, sun_misc_Cleaner, Pre ) \
do_klass(Finalizer_klass, java_lang_ref_Finalizer, Pre ) \
\
do_klass(Thread_klass, java_lang_Thread, Pre ) \
--- a/hotspot/src/share/vm/classfile/verifier.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/verifier.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1546,23 +1546,28 @@
no_control_flow = true; break;
case Bytecodes::_getstatic :
case Bytecodes::_putstatic :
+ // pass TRUE, operand can be an array type for getstatic/putstatic.
+ verify_field_instructions(
+ &bcs, ¤t_frame, cp, true, CHECK_VERIFY(this));
+ no_control_flow = false; break;
case Bytecodes::_getfield :
case Bytecodes::_putfield :
+ // pass FALSE, operand can't be an array type for getfield/putfield.
verify_field_instructions(
- &bcs, ¤t_frame, cp, CHECK_VERIFY(this));
+ &bcs, ¤t_frame, cp, false, CHECK_VERIFY(this));
no_control_flow = false; break;
case Bytecodes::_invokevirtual :
case Bytecodes::_invokespecial :
case Bytecodes::_invokestatic :
verify_invoke_instructions(
- &bcs, code_length, ¤t_frame,
- &this_uninit, return_type, cp, CHECK_VERIFY(this));
+ &bcs, code_length, ¤t_frame, (bci >= ex_min && bci < ex_max),
+ &this_uninit, return_type, cp, &stackmap_table, CHECK_VERIFY(this));
no_control_flow = false; break;
case Bytecodes::_invokeinterface :
case Bytecodes::_invokedynamic :
verify_invoke_instructions(
- &bcs, code_length, ¤t_frame,
- &this_uninit, return_type, cp, CHECK_VERIFY(this));
+ &bcs, code_length, ¤t_frame, (bci >= ex_min && bci < ex_max),
+ &this_uninit, return_type, cp, &stackmap_table, CHECK_VERIFY(this));
no_control_flow = false; break;
case Bytecodes::_new :
{
@@ -2107,6 +2112,7 @@
void ClassVerifier::verify_field_instructions(RawBytecodeStream* bcs,
StackMapFrame* current_frame,
constantPoolHandle cp,
+ bool allow_arrays,
TRAPS) {
u2 index = bcs->get_index_u2();
verify_cp_type(bcs->bci(), index, cp,
@@ -2126,8 +2132,8 @@
// Get referenced class type
VerificationType ref_class_type = cp_ref_index_to_type(
index, cp, CHECK_VERIFY(this));
- if (!ref_class_type.is_object()) {
- /* Unreachable? Class file parser verifies Fieldref contents */
+ if (!ref_class_type.is_object() &&
+ (!allow_arrays || !ref_class_type.is_array())) {
verify_error(ErrorContext::bad_type(bcs->bci(),
TypeOrigin::cp(index, ref_class_type)),
"Expecting reference to class in class %s at constant pool index %d",
@@ -2406,8 +2412,9 @@
void ClassVerifier::verify_invoke_init(
RawBytecodeStream* bcs, u2 ref_class_index, VerificationType ref_class_type,
- StackMapFrame* current_frame, u4 code_length, bool *this_uninit,
- constantPoolHandle cp, TRAPS) {
+ StackMapFrame* current_frame, u4 code_length, bool in_try_block,
+ bool *this_uninit, constantPoolHandle cp, StackMapTable* stackmap_table,
+ TRAPS) {
u2 bci = bcs->bci();
VerificationType type = current_frame->pop_stack(
VerificationType::reference_check(), CHECK_VERIFY(this));
@@ -2423,28 +2430,36 @@
return;
}
- // Check if this call is done from inside of a TRY block. If so, make
- // sure that all catch clause paths end in a throw. Otherwise, this
- // can result in returning an incomplete object.
- ExceptionTable exhandlers(_method());
- int exlength = exhandlers.length();
- for(int i = 0; i < exlength; i++) {
- u2 start_pc = exhandlers.start_pc(i);
- u2 end_pc = exhandlers.end_pc(i);
+ // If this invokespecial call is done from inside of a TRY block then make
+ // sure that all catch clause paths end in a throw. Otherwise, this can
+ // result in returning an incomplete object.
+ if (in_try_block) {
+ ExceptionTable exhandlers(_method());
+ int exlength = exhandlers.length();
+ for(int i = 0; i < exlength; i++) {
+ u2 start_pc = exhandlers.start_pc(i);
+ u2 end_pc = exhandlers.end_pc(i);
- if (bci >= start_pc && bci < end_pc) {
- if (!ends_in_athrow(exhandlers.handler_pc(i))) {
- verify_error(ErrorContext::bad_code(bci),
- "Bad <init> method call from after the start of a try block");
- return;
- } else if (VerboseVerification) {
- ResourceMark rm;
- tty->print_cr(
- "Survived call to ends_in_athrow(): %s",
- current_class()->name()->as_C_string());
+ if (bci >= start_pc && bci < end_pc) {
+ if (!ends_in_athrow(exhandlers.handler_pc(i))) {
+ verify_error(ErrorContext::bad_code(bci),
+ "Bad <init> method call from after the start of a try block");
+ return;
+ } else if (VerboseVerification) {
+ ResourceMark rm;
+ tty->print_cr(
+ "Survived call to ends_in_athrow(): %s",
+ current_class()->name()->as_C_string());
+ }
}
}
- }
+
+ // Check the exception handler target stackmaps with the locals from the
+ // incoming stackmap (before initialize_object() changes them to outgoing
+ // state).
+ verify_exception_handler_targets(bci, true, current_frame,
+ stackmap_table, CHECK_VERIFY(this));
+ } // in_try_block
current_frame->initialize_object(type, current_type());
*this_uninit = true;
@@ -2498,6 +2513,13 @@
}
}
}
+ // Check the exception handler target stackmaps with the locals from the
+ // incoming stackmap (before initialize_object() changes them to outgoing
+ // state).
+ if (in_try_block) {
+ verify_exception_handler_targets(bci, *this_uninit, current_frame,
+ stackmap_table, CHECK_VERIFY(this));
+ }
current_frame->initialize_object(type, new_class_type);
} else {
verify_error(ErrorContext::bad_type(bci, current_frame->stack_top_ctx()),
@@ -2526,8 +2548,8 @@
void ClassVerifier::verify_invoke_instructions(
RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame,
- bool *this_uninit, VerificationType return_type,
- constantPoolHandle cp, TRAPS) {
+ bool in_try_block, bool *this_uninit, VerificationType return_type,
+ constantPoolHandle cp, StackMapTable* stackmap_table, TRAPS) {
// Make sure the constant pool item is the right type
u2 index = bcs->get_index_u2();
Bytecodes::Code opcode = bcs->raw_code();
@@ -2693,7 +2715,8 @@
opcode != Bytecodes::_invokedynamic) {
if (method_name == vmSymbols::object_initializer_name()) { // <init> method
verify_invoke_init(bcs, index, ref_class_type, current_frame,
- code_length, this_uninit, cp, CHECK_VERIFY(this));
+ code_length, in_try_block, this_uninit, cp, stackmap_table,
+ CHECK_VERIFY(this));
} else { // other methods
// Ensures that target class is assignable to method class.
if (opcode == Bytecodes::_invokespecial) {
--- a/hotspot/src/share/vm/classfile/verifier.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/verifier.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -297,12 +297,13 @@
void verify_field_instructions(
RawBytecodeStream* bcs, StackMapFrame* current_frame,
- constantPoolHandle cp, TRAPS);
+ constantPoolHandle cp, bool allow_arrays, TRAPS);
void verify_invoke_init(
RawBytecodeStream* bcs, u2 ref_index, VerificationType ref_class_type,
- StackMapFrame* current_frame, u4 code_length, bool* this_uninit,
- constantPoolHandle cp, TRAPS);
+ StackMapFrame* current_frame, u4 code_length, bool in_try_block,
+ bool* this_uninit, constantPoolHandle cp, StackMapTable* stackmap_table,
+ TRAPS);
// Used by ends_in_athrow() to push all handlers that contain bci onto
// the handler_stack, if the handler is not already on the stack.
@@ -316,8 +317,8 @@
void verify_invoke_instructions(
RawBytecodeStream* bcs, u4 code_length, StackMapFrame* current_frame,
- bool* this_uninit, VerificationType return_type,
- constantPoolHandle cp, TRAPS);
+ bool in_try_block, bool* this_uninit, VerificationType return_type,
+ constantPoolHandle cp, StackMapTable* stackmap_table, TRAPS);
VerificationType get_newarray_type(u2 index, u2 bci, TRAPS);
void verify_anewarray(u2 bci, u2 index, constantPoolHandle cp,
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -79,6 +79,7 @@
template(java_lang_ref_WeakReference, "java/lang/ref/WeakReference") \
template(java_lang_ref_FinalReference, "java/lang/ref/FinalReference") \
template(java_lang_ref_PhantomReference, "java/lang/ref/PhantomReference") \
+ template(sun_misc_Cleaner, "sun/misc/Cleaner") \
template(java_lang_ref_Finalizer, "java/lang/ref/Finalizer") \
template(java_lang_reflect_AccessibleObject, "java/lang/reflect/AccessibleObject") \
template(java_lang_reflect_Method, "java/lang/reflect/Method") \
--- a/hotspot/src/share/vm/code/codeCache.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/code/codeCache.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -233,8 +233,8 @@
ReservedCodeSpace CodeCache::reserve_heap_memory(size_t size) {
// Determine alignment
const size_t page_size = os::can_execute_large_page_memory() ?
- MIN2(os::page_size_for_region(InitialCodeCacheSize, 8),
- os::page_size_for_region(size, 8)) :
+ MIN2(os::page_size_for_region_aligned(InitialCodeCacheSize, 8),
+ os::page_size_for_region_aligned(size, 8)) :
os::vm_page_size();
const size_t granularity = os::vm_allocation_granularity();
const size_t r_align = MAX2(page_size, granularity);
--- a/hotspot/src/share/vm/code/dependencies.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/code/dependencies.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -560,7 +560,7 @@
put_star = !Dependencies::is_concrete_klass((Klass*)arg.metadata_value());
} else if (arg.is_method()) {
what = "method ";
- put_star = !Dependencies::is_concrete_method((Method*)arg.metadata_value());
+ put_star = !Dependencies::is_concrete_method((Method*)arg.metadata_value(), NULL);
} else if (arg.is_klass()) {
what = "class ";
} else {
@@ -878,8 +878,8 @@
// Static methods don't override non-static so punt
return true;
}
- if ( !Dependencies::is_concrete_method(lm)
- && !Dependencies::is_concrete_method(m)
+ if ( !Dependencies::is_concrete_method(lm, k)
+ && !Dependencies::is_concrete_method(m, ctxk)
&& lm->method_holder()->is_subtype_of(m->method_holder()))
// Method m is overridden by lm, but both are non-concrete.
return true;
@@ -915,8 +915,17 @@
} else if (!k->oop_is_instance()) {
return false; // no methods to find in an array type
} else {
- Method* m = InstanceKlass::cast(k)->find_method(_name, _signature);
- if (m == NULL || !Dependencies::is_concrete_method(m)) return false;
+ // Search class hierarchy first.
+ Method* m = InstanceKlass::cast(k)->find_instance_method(_name, _signature);
+ if (!Dependencies::is_concrete_method(m, k)) {
+ // Check interface defaults also, if any exist.
+ Array<Method*>* default_methods = InstanceKlass::cast(k)->default_methods();
+ if (default_methods == NULL)
+ return false;
+ m = InstanceKlass::cast(k)->find_method(default_methods, _name, _signature);
+ if (!Dependencies::is_concrete_method(m, NULL))
+ return false;
+ }
_found_methods[_num_participants] = m;
// Note: If add_participant(k) is called,
// the method m will already be memoized for it.
@@ -1209,15 +1218,17 @@
return true;
}
-bool Dependencies::is_concrete_method(Method* m) {
- // Statics are irrelevant to virtual call sites.
- if (m->is_static()) return false;
-
- // We could also return false if m does not yet appear to be
- // executed, if the VM version supports this distinction also.
- // Default methods are considered "concrete" as well.
- return !m->is_abstract() &&
- !m->is_overpass(); // error functions aren't concrete
+bool Dependencies::is_concrete_method(Method* m, Klass * k) {
+ // NULL is not a concrete method,
+ // statics are irrelevant to virtual call sites,
+ // abstract methods are not concrete,
+ // overpass (error) methods are not concrete if k is abstract
+ //
+ // note "true" is conservative answer --
+ // overpass clause is false if k == NULL, implies return true if
+ // answer depends on overpass clause.
+ return ! ( m == NULL || m -> is_static() || m -> is_abstract() ||
+ m->is_overpass() && k != NULL && k -> is_abstract() );
}
@@ -1242,16 +1253,6 @@
return true;
}
-bool Dependencies::is_concrete_method(ciMethod* m) {
- // Statics are irrelevant to virtual call sites.
- if (m->is_static()) return false;
-
- // We could also return false if m does not yet appear to be
- // executed, if the VM version supports this distinction also.
- return !m->is_abstract();
-}
-
-
bool Dependencies::has_finalizable_subclass(ciInstanceKlass* k) {
return k->has_finalizable_subclass();
}
@@ -1469,7 +1470,7 @@
Klass* wit = wf.find_witness_definer(ctxk);
if (wit != NULL) return NULL; // Too many witnesses.
Method* fm = wf.found_method(0); // Will be NULL if num_parts == 0.
- if (Dependencies::is_concrete_method(m)) {
+ if (Dependencies::is_concrete_method(m, ctxk)) {
if (fm == NULL) {
// It turns out that m was always the only implementation.
fm = m;
@@ -1499,61 +1500,6 @@
return wf.find_witness_definer(ctxk, changes);
}
-// Find the set of all non-abstract methods under ctxk that match m[0].
-// (The method m[0] must be defined or inherited in ctxk.)
-// Include m itself in the set, unless it is abstract.
-// Fill the given array m[0..(mlen-1)] with this set, and return the length.
-// (The length may be zero if no concrete methods are found anywhere.)
-// If there are too many concrete methods to fit in marray, return -1.
-int Dependencies::find_exclusive_concrete_methods(Klass* ctxk,
- int mlen,
- Method* marray[]) {
- Method* m0 = marray[0];
- ClassHierarchyWalker wf(m0);
- assert(wf.check_method_context(ctxk, m0), "proper context");
- wf.record_witnesses(mlen);
- bool participants_hide_witnesses = true;
- Klass* wit = wf.find_witness_definer(ctxk);
- if (wit != NULL) return -1; // Too many witnesses.
- int num = wf.num_participants();
- assert(num <= mlen, "oob");
- // Keep track of whether m is also part of the result set.
- int mfill = 0;
- assert(marray[mfill] == m0, "sanity");
- if (Dependencies::is_concrete_method(m0))
- mfill++; // keep m0 as marray[0], the first result
- for (int i = 0; i < num; i++) {
- Method* fm = wf.found_method(i);
- if (fm == m0) continue; // Already put this guy in the list.
- if (mfill == mlen) {
- return -1; // Oops. Too many methods after all!
- }
- marray[mfill++] = fm;
- }
-#ifndef PRODUCT
- // Make sure the dependency mechanism will pass this discovery:
- if (VerifyDependencies) {
- // Turn off dependency tracing while actually testing deps.
- FlagSetting fs(TraceDependencies, false);
- switch (mfill) {
- case 1:
- guarantee(NULL == (void *)check_unique_concrete_method(ctxk, marray[0]),
- "verify dep.");
- break;
- case 2:
- guarantee(NULL == (void *)
- check_exclusive_concrete_methods(ctxk, marray[0], marray[1]),
- "verify dep.");
- break;
- default:
- ShouldNotReachHere(); // mlen > 2 yet supported
- }
- }
-#endif //PRODUCT
- return mfill;
-}
-
-
Klass* Dependencies::check_has_no_finalizable_subclasses(Klass* ctxk, KlassDepChange* changes) {
Klass* search_at = ctxk;
if (changes != NULL)
@@ -1561,7 +1507,6 @@
return find_finalizable_subclass(search_at);
}
-
Klass* Dependencies::check_call_site_target_value(oop call_site, oop method_handle, CallSiteDepChange* changes) {
assert(call_site ->is_a(SystemDictionary::CallSite_klass()), "sanity");
assert(method_handle->is_a(SystemDictionary::MethodHandle_klass()), "sanity");
--- a/hotspot/src/share/vm/code/dependencies.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/code/dependencies.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -288,7 +288,7 @@
// In that case, there would be a middle ground between concrete
// and abstract (as defined by the Java language and VM).
static bool is_concrete_klass(Klass* k); // k is instantiable
- static bool is_concrete_method(Method* m); // m is invocable
+ static bool is_concrete_method(Method* m, Klass* k); // m is invocable
static Klass* find_finalizable_subclass(Klass* k);
// These versions of the concreteness queries work through the CI.
@@ -302,7 +302,6 @@
// not go back into the VM to get their value; they must cache the
// bit in the CI, either eagerly or lazily.)
static bool is_concrete_klass(ciInstanceKlass* k); // k appears instantiable
- static bool is_concrete_method(ciMethod* m); // m appears invocable
static bool has_finalizable_subclass(ciInstanceKlass* k);
// As a general rule, it is OK to compile under the assumption that
@@ -349,7 +348,6 @@
static Klass* find_unique_concrete_subtype(Klass* ctxk);
static Method* find_unique_concrete_method(Klass* ctxk, Method* m);
static int find_exclusive_concrete_subtypes(Klass* ctxk, int klen, Klass* k[]);
- static int find_exclusive_concrete_methods(Klass* ctxk, int mlen, Method* m[]);
// Create the encoding which will be stored in an nmethod.
void encode_content_bytes();
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -645,7 +645,7 @@
// Support for parallelizing survivor space rescan
if ((CMSParallelRemarkEnabled && CMSParallelSurvivorRemarkEnabled) || CMSParallelInitialMarkEnabled) {
const size_t max_plab_samples =
- ((DefNewGeneration*)_young_gen)->max_survivor_size()/MinTLABSize;
+ ((DefNewGeneration*)_young_gen)->max_survivor_size() / plab_sample_minimum_size();
_survivor_plab_array = NEW_C_HEAP_ARRAY(ChunkArray, ParallelGCThreads, mtGC);
_survivor_chunk_array = NEW_C_HEAP_ARRAY(HeapWord*, 2*max_plab_samples, mtGC);
@@ -703,6 +703,12 @@
_inter_sweep_timer.start(); // start of time
}
+size_t CMSCollector::plab_sample_minimum_size() {
+ // The default value of MinTLABSize is 2k, but there is
+ // no way to get the default value if the flag has been overridden.
+ return MAX2(ThreadLocalAllocBuffer::min_size() * HeapWordSize, 2 * K);
+}
+
const char* ConcurrentMarkSweepGeneration::name() const {
return "concurrent mark-sweep generation";
}
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -737,6 +737,10 @@
size_t* _cursor;
ChunkArray* _survivor_plab_array;
+ // A bounded minimum size of PLABs, should not return too small values since
+ // this will affect the size of the data structures used for parallel young gen rescan
+ size_t plab_sample_minimum_size();
+
// Support for marking stack overflow handling
bool take_from_overflow_list(size_t num, CMSMarkStack* to_stack);
bool par_take_from_overflow_list(size_t num,
--- a/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -47,6 +47,13 @@
// active field set to true.
PtrQueue(qset_, perm, true /* active */) { }
+ // Flush before destroying; queue may be used to capture pending work while
+ // doing something else, with auto-flush on completion.
+ ~DirtyCardQueue() { if (!is_permanent()) flush(); }
+
+ // Process queue entries and release resources.
+ void flush() { flush_impl(); }
+
// Apply the closure to all elements, and reset the index to make the
// buffer empty. If a closure application returns "false", return
// "false" immediately, halting the iteration. If "consume" is true,
--- a/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegion.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -162,8 +162,8 @@
"we should have already filtered out humongous regions");
assert(_end == orig_end(),
"we should have already filtered out humongous regions");
-
- _in_collection_set = false;
+ assert(!_in_collection_set,
+ err_msg("Should not clear heap region %u in the collection set", hrm_index()));
set_allocation_context(AllocationContext::system());
set_young_index_in_cset(-1);
--- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -31,11 +31,15 @@
#include "runtime/thread.inline.hpp"
PtrQueue::PtrQueue(PtrQueueSet* qset, bool perm, bool active) :
- _qset(qset), _buf(NULL), _index(0), _active(active),
+ _qset(qset), _buf(NULL), _index(0), _sz(0), _active(active),
_perm(perm), _lock(NULL)
{}
-void PtrQueue::flush() {
+PtrQueue::~PtrQueue() {
+ assert(_perm || (_buf == NULL), "queue must be flushed before delete");
+}
+
+void PtrQueue::flush_impl() {
if (!_perm && _buf != NULL) {
if (_index == _sz) {
// No work to do.
--- a/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/ptrQueue.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -65,15 +65,18 @@
Mutex* _lock;
PtrQueueSet* qset() { return _qset; }
+ bool is_permanent() const { return _perm; }
+
+ // Process queue entries and release resources, if not permanent.
+ void flush_impl();
public:
// Initialize this queue to contain a null buffer, and be part of the
// given PtrQueueSet.
PtrQueue(PtrQueueSet* qset, bool perm = false, bool active = false);
- // Release any contained resources.
- virtual void flush();
- // Calls flush() when destroyed.
- ~PtrQueue() { flush(); }
+
+ // Requires queue flushed or permanent.
+ ~PtrQueue();
// Associate a lock with a ptr queue.
void set_lock(Mutex* lock) { _lock = lock; }
--- a/hotspot/src/share/vm/gc_implementation/g1/satbQueue.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/satbQueue.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -39,7 +39,7 @@
// first before we flush it, otherwise we might end up with an
// enqueued buffer with refs into the CSet which breaks our invariants.
filter();
- PtrQueue::flush();
+ flush_impl();
}
// This method removes entries from an SATB buffer that will not be
--- a/hotspot/src/share/vm/gc_implementation/g1/satbQueue.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/g1/satbQueue.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -60,9 +60,8 @@
// field to true. This is done in JavaThread::initialize_queues().
PtrQueue(qset, perm, false /* active */) { }
- // Overrides PtrQueue::flush() so that it can filter the buffer
- // before it is flushed.
- virtual void flush();
+ // Process queue entries and free resources.
+ void flush();
// Overrides PtrQueue::should_enqueue_buffer(). See the method's
// definition for more information.
--- a/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/parNew/parNewGeneration.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1194,8 +1194,10 @@
return real_forwardee(old);
}
- new_obj = _next_gen->par_promote(par_scan_state->thread_num(),
- old, m, sz);
+ if (!_promotion_failed) {
+ new_obj = _next_gen->par_promote(par_scan_state->thread_num(),
+ old, m, sz);
+ }
if (new_obj == NULL) {
// promotion failed, forward to self
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/generationSizer.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -61,9 +61,9 @@
void GenerationSizer::initialize_size_info() {
trace_gen_sizes("ps heap raw");
- const size_t max_page_sz = os::page_size_for_region(_max_heap_byte_size, 8);
+ const size_t max_page_sz = os::page_size_for_region_aligned(_max_heap_byte_size, 8);
const size_t min_pages = 4; // 1 for eden + 1 for each survivor + 1 for old
- const size_t min_page_sz = os::page_size_for_region(_min_heap_byte_size, min_pages);
+ const size_t min_page_sz = os::page_size_for_region_aligned(_min_heap_byte_size, min_pages);
const size_t page_sz = MIN2(max_page_sz, min_page_sz);
// Can a page size be something else than a power of two?
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -41,7 +41,7 @@
const size_t words = bits / BitsPerWord;
const size_t raw_bytes = words * sizeof(idx_t);
- const size_t page_sz = os::page_size_for_region(raw_bytes, 10);
+ const size_t page_sz = os::page_size_for_region_aligned(raw_bytes, 10);
const size_t granularity = os::vm_allocation_granularity();
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
--- a/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -403,7 +403,7 @@
ParallelCompactData::create_vspace(size_t count, size_t element_size)
{
const size_t raw_bytes = count * element_size;
- const size_t page_sz = os::page_size_for_region(raw_bytes, 10);
+ const size_t page_sz = os::page_size_for_region_aligned(raw_bytes, 10);
const size_t granularity = os::vm_allocation_granularity();
_reserved_byte_size = align_size_up(raw_bytes, MAX2(page_sz, granularity));
--- a/hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/gc_implementation/shared/parGCAllocBuffer.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -63,7 +63,8 @@
virtual ~ParGCAllocBuffer() {}
static const size_t min_size() {
- return ThreadLocalAllocBuffer::min_size();
+ // Make sure that we return something that is larger than AlignmentReserve
+ return align_object_size(MAX2(MinTLABSize / HeapWordSize, (uintx)oopDesc::header_size())) + AlignmentReserve;
}
static const size_t max_size() {
--- a/hotspot/src/share/vm/interpreter/linkResolver.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -320,7 +320,7 @@
// First check in default method array
if (!resolved_method->is_abstract() &&
(InstanceKlass::cast(klass())->default_methods() != NULL)) {
- int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature, false);
+ int index = InstanceKlass::find_method_index(InstanceKlass::cast(klass())->default_methods(), name, signature, false, false);
if (index >= 0 ) {
vtable_index = InstanceKlass::cast(klass())->default_vtable_indices()->at(index);
}
--- a/hotspot/src/share/vm/memory/heap.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/memory/heap.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -104,8 +104,8 @@
size_t page_size = os::vm_page_size();
if (os::can_execute_large_page_memory()) {
const size_t min_pages = 8;
- page_size = MIN2(os::page_size_for_region(committed_size, min_pages),
- os::page_size_for_region(rs.size(), min_pages));
+ page_size = MIN2(os::page_size_for_region_aligned(committed_size, min_pages),
+ os::page_size_for_region_aligned(rs.size(), min_pages));
}
const size_t granularity = os::vm_allocation_granularity();
--- a/hotspot/src/share/vm/memory/referenceProcessor.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/memory/referenceProcessor.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -118,6 +118,7 @@
_discoveredWeakRefs = &_discoveredSoftRefs[_max_num_q];
_discoveredFinalRefs = &_discoveredWeakRefs[_max_num_q];
_discoveredPhantomRefs = &_discoveredFinalRefs[_max_num_q];
+ _discoveredCleanerRefs = &_discoveredPhantomRefs[_max_num_q];
// Initialize all entries to NULL
for (uint i = 0; i < _max_num_q * number_of_subclasses_of_ref(); i++) {
@@ -246,6 +247,13 @@
phantom_count =
process_discovered_reflist(_discoveredPhantomRefs, NULL, false,
is_alive, keep_alive, complete_gc, task_executor);
+
+ // Process cleaners, but include them in phantom statistics. We expect
+ // Cleaner references to be temporary, and don't want to deal with
+ // possible incompatibilities arising from making it more visible.
+ phantom_count +=
+ process_discovered_reflist(_discoveredCleanerRefs, NULL, false,
+ is_alive, keep_alive, complete_gc, task_executor);
}
// Weak global JNI references. It would make more sense (semantically) to
@@ -885,6 +893,7 @@
balance_queues(_discoveredWeakRefs);
balance_queues(_discoveredFinalRefs);
balance_queues(_discoveredPhantomRefs);
+ balance_queues(_discoveredCleanerRefs);
}
size_t
@@ -998,6 +1007,9 @@
case REF_PHANTOM:
list = &_discoveredPhantomRefs[id];
break;
+ case REF_CLEANER:
+ list = &_discoveredCleanerRefs[id];
+ break;
case REF_NONE:
// we should not reach here if we are an InstanceRefKlass
default:
@@ -1263,6 +1275,17 @@
preclean_discovered_reflist(_discoveredPhantomRefs[i], is_alive,
keep_alive, complete_gc, yield);
}
+
+ // Cleaner references. Included in timing for phantom references. We
+ // expect Cleaner references to be temporary, and don't want to deal with
+ // possible incompatibilities arising from making it more visible.
+ for (uint i = 0; i < _max_num_q; i++) {
+ if (yield->should_return()) {
+ return;
+ }
+ preclean_discovered_reflist(_discoveredCleanerRefs[i], is_alive,
+ keep_alive, complete_gc, yield);
+ }
}
}
@@ -1331,6 +1354,7 @@
case 1: return "WeakRef";
case 2: return "FinalRef";
case 3: return "PhantomRef";
+ case 4: return "CleanerRef";
}
ShouldNotReachHere();
return NULL;
--- a/hotspot/src/share/vm/memory/referenceProcessor.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/memory/referenceProcessor.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -264,9 +264,10 @@
DiscoveredList* _discoveredWeakRefs;
DiscoveredList* _discoveredFinalRefs;
DiscoveredList* _discoveredPhantomRefs;
+ DiscoveredList* _discoveredCleanerRefs;
public:
- static int number_of_subclasses_of_ref() { return (REF_PHANTOM - REF_OTHER); }
+ static int number_of_subclasses_of_ref() { return (REF_CLEANER - REF_OTHER); }
uint num_q() { return _num_q; }
uint max_num_q() { return _max_num_q; }
--- a/hotspot/src/share/vm/memory/referenceType.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/memory/referenceType.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -35,7 +35,8 @@
REF_SOFT, // Subclass of java/lang/ref/SoftReference
REF_WEAK, // Subclass of java/lang/ref/WeakReference
REF_FINAL, // Subclass of java/lang/ref/FinalReference
- REF_PHANTOM // Subclass of java/lang/ref/PhantomReference
+ REF_PHANTOM, // Subclass of java/lang/ref/PhantomReference
+ REF_CLEANER // Subclass of sun/misc/Cleaner
};
#endif // SHARE_VM_MEMORY_REFRERENCETYPE_HPP
--- a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -235,22 +235,19 @@
}
size_t ThreadLocalAllocBuffer::initial_desired_size() {
- size_t init_sz;
+ size_t init_sz = 0;
if (TLABSize > 0) {
- init_sz = MIN2(TLABSize / HeapWordSize, max_size());
- } else if (global_stats() == NULL) {
- // Startup issue - main thread initialized before heap initialized.
- init_sz = min_size();
- } else {
+ init_sz = TLABSize / HeapWordSize;
+ } else if (global_stats() != NULL) {
// Initial size is a function of the average number of allocating threads.
unsigned nof_threads = global_stats()->allocating_threads_avg();
init_sz = (Universe::heap()->tlab_capacity(myThread()) / HeapWordSize) /
(nof_threads * target_refills());
init_sz = align_object_size(init_sz);
- init_sz = MIN2(MAX2(init_sz, min_size()), max_size());
}
+ init_sz = MIN2(MAX2(init_sz, min_size()), max_size());
return init_sz;
}
--- a/hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/memory/threadLocalAllocBuffer.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -106,7 +106,7 @@
// do nothing. tlabs must be inited by initialize() calls
}
- static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize); }
+ static const size_t min_size() { return align_object_size(MinTLABSize / HeapWordSize) + alignment_reserve(); }
static const size_t max_size() { assert(_max_size != 0, "max_size not set up"); return _max_size; }
static void set_max_size(size_t max_size) { _max_size = max_size; }
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1420,32 +1420,41 @@
}
Method* InstanceKlass::find_method_impl(Symbol* name, Symbol* signature, bool skipping_overpass) const {
- return InstanceKlass::find_method_impl(methods(), name, signature, skipping_overpass);
+ return InstanceKlass::find_method_impl(methods(), name, signature, skipping_overpass, false);
}
// find_instance_method looks up the name/signature in the local methods array
// and skips over static methods
Method* InstanceKlass::find_instance_method(
Array<Method*>* methods, Symbol* name, Symbol* signature) {
- Method* meth = InstanceKlass::find_method(methods, name, signature);
- if (meth != NULL && meth->is_static()) {
- meth = NULL;
- }
+ Method* meth = InstanceKlass::find_method_impl(methods, name, signature, false, true);
return meth;
}
+// find_instance_method looks up the name/signature in the local methods array
+// and skips over static methods
+Method* InstanceKlass::find_instance_method(Symbol* name, Symbol* signature) {
+ return InstanceKlass::find_instance_method(methods(), name, signature);
+}
+
// find_method looks up the name/signature in the local methods array
Method* InstanceKlass::find_method(
Array<Method*>* methods, Symbol* name, Symbol* signature) {
- return InstanceKlass::find_method_impl(methods, name, signature, false);
+ return InstanceKlass::find_method_impl(methods, name, signature, false, false);
}
Method* InstanceKlass::find_method_impl(
- Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass) {
- int hit = find_method_index(methods, name, signature, skipping_overpass);
+ Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass, bool skipping_static) {
+ int hit = find_method_index(methods, name, signature, skipping_overpass, skipping_static);
return hit >= 0 ? methods->at(hit): NULL;
}
+bool InstanceKlass::method_matches(Method* m, Symbol* signature, bool skipping_overpass, bool skipping_static) {
+ return (m->signature() == signature) &&
+ (!skipping_overpass || !m->is_overpass()) &&
+ (!skipping_static || !m->is_static());
+}
+
// Used directly for default_methods to find the index into the
// default_vtable_indices, and indirectly by find_method
// find_method_index looks in the local methods array to return the index
@@ -1454,13 +1463,14 @@
// is important during method resolution to prefer a static method, for example,
// over an overpass method.
int InstanceKlass::find_method_index(
- Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass) {
+ Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass, bool skipping_static) {
int hit = binary_search(methods, name);
if (hit != -1) {
Method* m = methods->at(hit);
+
// Do linear search to find matching signature. First, quick check
// for common case, ignoring overpasses if requested.
- if ((m->signature() == signature) && (!skipping_overpass || !m->is_overpass())) return hit;
+ if (method_matches(m, signature, skipping_overpass, skipping_static)) return hit;
// search downwards through overloaded methods
int i;
@@ -1468,18 +1478,18 @@
Method* m = methods->at(i);
assert(m->is_method(), "must be method");
if (m->name() != name) break;
- if ((m->signature() == signature) && (!skipping_overpass || !m->is_overpass())) return i;
+ if (method_matches(m, signature, skipping_overpass, skipping_static)) return i;
}
// search upwards
for (i = hit + 1; i < methods->length(); ++i) {
Method* m = methods->at(i);
assert(m->is_method(), "must be method");
if (m->name() != name) break;
- if ((m->signature() == signature) && (!skipping_overpass || !m->is_overpass())) return i;
+ if (method_matches(m, signature, skipping_overpass, skipping_static)) return i;
}
// not found
#ifdef ASSERT
- int index = skipping_overpass ? -1 : linear_search(methods, name, signature);
+ int index = skipping_overpass || skipping_static ? -1 : linear_search(methods, name, signature);
assert(index == -1, err_msg("binary search should have found entry %d", index));
#endif
}
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -490,10 +490,16 @@
// find a local method (returns NULL if not found)
Method* find_method(Symbol* name, Symbol* signature) const;
static Method* find_method(Array<Method*>* methods, Symbol* name, Symbol* signature);
+
+ // find a local method, but skip static methods
+ Method* find_instance_method(Symbol* name, Symbol* signature);
static Method* find_instance_method(Array<Method*>* methods, Symbol* name, Symbol* signature);
+ // true if method matches signature and conforms to skipping_X conditions.
+ static bool method_matches(Method* m, Symbol* signature, bool skipping_overpass, bool skipping_static);
+
// find a local method index in default_methods (returns -1 if not found)
- static int find_method_index(Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass);
+ static int find_method_index(Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass, bool skipping_static);
// lookup operation (returns NULL if not found)
Method* uncached_lookup_method(Symbol* name, Symbol* signature, MethodLookupMode mode) const;
@@ -1053,7 +1059,7 @@
// find a local method (returns NULL if not found)
Method* find_method_impl(Symbol* name, Symbol* signature, bool skipping_overpass) const;
- static Method* find_method_impl(Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass);
+ static Method* find_method_impl(Array<Method*>* methods, Symbol* name, Symbol* signature, bool skipping_overpass, bool skipping_static);
// Free CHeap allocated fields.
void release_C_heap_structures();
--- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -68,11 +68,11 @@
~JvmtiConstantPoolReconstituter() {
if (_symmap != NULL) {
- os::free(_symmap);
+ delete _symmap;
_symmap = NULL;
}
if (_classmap != NULL) {
- os::free(_classmap);
+ delete _classmap;
_classmap = NULL;
}
}
--- a/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/prims/jvmtiTagMap.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1046,10 +1046,16 @@
{
assert(str->klass() == SystemDictionary::String_klass(), "not a string");
+ typeArrayOop s_value = java_lang_String::value(str);
+
+ // JDK-6584008: the value field may be null if a String instance is
+ // partially constructed.
+ if (s_value == NULL) {
+ return 0;
+ }
// get the string value and length
// (string value may be offset from the base)
int s_len = java_lang_String::length(str);
- typeArrayOop s_value = java_lang_String::value(str);
int s_offset = java_lang_String::offset(str);
jchar* value;
if (s_len > 0) {
--- a/hotspot/src/share/vm/prims/perf.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/prims/perf.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -100,6 +100,11 @@
PerfWrapper("Perf_Detach");
+ if (!UsePerfData) {
+ // With -XX:-UsePerfData, detach is just a NOP
+ return;
+ }
+
void* address = 0;
jlong capacity = 0;
--- a/hotspot/src/share/vm/prims/unsafe.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/prims/unsafe.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1104,43 +1104,6 @@
-UNSAFE_ENTRY(void, Unsafe_MonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
- UnsafeWrapper("Unsafe_MonitorEnter");
- {
- if (jobj == NULL) {
- THROW(vmSymbols::java_lang_NullPointerException());
- }
- Handle obj(thread, JNIHandles::resolve_non_null(jobj));
- ObjectSynchronizer::jni_enter(obj, CHECK);
- }
-UNSAFE_END
-
-
-UNSAFE_ENTRY(jboolean, Unsafe_TryMonitorEnter(JNIEnv *env, jobject unsafe, jobject jobj))
- UnsafeWrapper("Unsafe_TryMonitorEnter");
- {
- if (jobj == NULL) {
- THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE);
- }
- Handle obj(thread, JNIHandles::resolve_non_null(jobj));
- bool res = ObjectSynchronizer::jni_try_enter(obj, CHECK_0);
- return (res ? JNI_TRUE : JNI_FALSE);
- }
-UNSAFE_END
-
-
-UNSAFE_ENTRY(void, Unsafe_MonitorExit(JNIEnv *env, jobject unsafe, jobject jobj))
- UnsafeWrapper("Unsafe_MonitorExit");
- {
- if (jobj == NULL) {
- THROW(vmSymbols::java_lang_NullPointerException());
- }
- Handle obj(THREAD, JNIHandles::resolve_non_null(jobj));
- ObjectSynchronizer::jni_exit(obj(), CHECK);
- }
-UNSAFE_END
-
-
UNSAFE_ENTRY(void, Unsafe_ThrowException(JNIEnv *env, jobject unsafe, jthrowable thr))
UnsafeWrapper("Unsafe_ThrowException");
{
@@ -1365,8 +1328,6 @@
{CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
{CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
{CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
- {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
{CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)}
};
@@ -1411,8 +1372,6 @@
{CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
{CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
{CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
- {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
{CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)}
};
@@ -1461,8 +1420,6 @@
{CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
{CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
{CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
- {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
{CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)},
{CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
{CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
@@ -1515,9 +1472,6 @@
{CC"defineClass", CC"("DC0_Args")"CLS, FN_PTR(Unsafe_DefineClass0)},
{CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
{CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
- {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
- {CC"tryMonitorEnter", CC"("OBJ")Z", FN_PTR(Unsafe_TryMonitorEnter)},
{CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)},
{CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
{CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
@@ -1571,9 +1525,6 @@
{CC"defineClass", CC"("DC_Args")"CLS, FN_PTR(Unsafe_DefineClass)},
{CC"allocateInstance", CC"("CLS")"OBJ, FN_PTR(Unsafe_AllocateInstance)},
- {CC"monitorEnter", CC"("OBJ")V", FN_PTR(Unsafe_MonitorEnter)},
- {CC"monitorExit", CC"("OBJ")V", FN_PTR(Unsafe_MonitorExit)},
- {CC"tryMonitorEnter", CC"("OBJ")Z", FN_PTR(Unsafe_TryMonitorEnter)},
{CC"throwException", CC"("THR")V", FN_PTR(Unsafe_ThrowException)},
{CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
{CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
--- a/hotspot/src/share/vm/runtime/os.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/runtime/os.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1401,15 +1401,17 @@
return (sp > (stack_limit + reserved_area));
}
-size_t os::page_size_for_region(size_t region_size, size_t min_pages) {
+size_t os::page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned) {
assert(min_pages > 0, "sanity");
if (UseLargePages) {
const size_t max_page_size = region_size / min_pages;
for (size_t i = 0; _page_sizes[i] != 0; ++i) {
const size_t page_size = _page_sizes[i];
- if (page_size <= max_page_size && is_size_aligned(region_size, page_size)) {
- return page_size;
+ if (page_size <= max_page_size) {
+ if (!must_be_aligned || is_size_aligned(region_size, page_size)) {
+ return page_size;
+ }
}
}
}
@@ -1417,6 +1419,14 @@
return vm_page_size();
}
+size_t os::page_size_for_region_aligned(size_t region_size, size_t min_pages) {
+ return page_size_for_region(region_size, min_pages, true);
+}
+
+size_t os::page_size_for_region_unaligned(size_t region_size, size_t min_pages) {
+ return page_size_for_region(region_size, min_pages, false);
+}
+
#ifndef PRODUCT
void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count)
{
@@ -1665,17 +1675,17 @@
static size_t large_page_size() {
const size_t large_page_size_example = 4 * M;
- return os::page_size_for_region(large_page_size_example, 1);
+ return os::page_size_for_region_aligned(large_page_size_example, 1);
}
- static void test_page_size_for_region() {
+ static void test_page_size_for_region_aligned() {
if (UseLargePages) {
const size_t small_page = small_page_size();
const size_t large_page = large_page_size();
if (large_page > small_page) {
size_t num_small_pages_in_large = large_page / small_page;
- size_t page = os::page_size_for_region(large_page, num_small_pages_in_large);
+ size_t page = os::page_size_for_region_aligned(large_page, num_small_pages_in_large);
assert_eq(page, small_page);
}
@@ -1688,21 +1698,53 @@
const size_t large_page = large_page_size();
if (large_page > small_page) {
const size_t unaligned_region = large_page + 17;
- size_t page = os::page_size_for_region(unaligned_region, 1);
+ size_t page = os::page_size_for_region_aligned(unaligned_region, 1);
assert_eq(page, small_page);
const size_t num_pages = 5;
const size_t aligned_region = large_page * num_pages;
- page = os::page_size_for_region(aligned_region, num_pages);
+ page = os::page_size_for_region_aligned(aligned_region, num_pages);
assert_eq(page, large_page);
}
}
}
+ static void test_page_size_for_region_unaligned() {
+ if (UseLargePages) {
+ // Given exact page size, should return that page size.
+ for (size_t i = 0; os::_page_sizes[i] != 0; i++) {
+ size_t expected = os::_page_sizes[i];
+ size_t actual = os::page_size_for_region_unaligned(expected, 1);
+ assert_eq(expected, actual);
+ }
+
+ // Given slightly larger size than a page size, return the page size.
+ for (size_t i = 0; os::_page_sizes[i] != 0; i++) {
+ size_t expected = os::_page_sizes[i];
+ size_t actual = os::page_size_for_region_unaligned(expected + 17, 1);
+ assert_eq(expected, actual);
+ }
+
+ // Given a slightly smaller size than a page size,
+ // return the next smaller page size.
+ if (os::_page_sizes[1] > os::_page_sizes[0]) {
+ size_t expected = os::_page_sizes[0];
+ size_t actual = os::page_size_for_region_unaligned(os::_page_sizes[1] - 17, 1);
+ assert_eq(actual, expected);
+ }
+
+ // Return small page size for values less than a small page.
+ size_t small_page = small_page_size();
+ size_t actual = os::page_size_for_region_unaligned(small_page - 17, 1);
+ assert_eq(small_page, actual);
+ }
+ }
+
public:
static void run_tests() {
- test_page_size_for_region();
+ test_page_size_for_region_aligned();
test_page_size_for_region_alignment();
+ test_page_size_for_region_unaligned();
}
};
--- a/hotspot/src/share/vm/runtime/os.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/runtime/os.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -148,6 +148,7 @@
static void pd_free_memory(char *addr, size_t bytes, size_t alignment_hint);
static void pd_realign_memory(char *addr, size_t bytes, size_t alignment_hint);
+ static size_t page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned);
public:
static void init(void); // Called before command line parsing
@@ -267,8 +268,13 @@
// Returns the page size to use for a region of memory.
// region_size / min_pages will always be greater than or equal to the
- // returned value.
- static size_t page_size_for_region(size_t region_size, size_t min_pages);
+ // returned value. The returned value will divide region_size.
+ static size_t page_size_for_region_aligned(size_t region_size, size_t min_pages);
+
+ // Returns the page size to use for a region of memory.
+ // region_size / min_pages will always be greater than or equal to the
+ // returned value. The returned value might not divide region_size.
+ static size_t page_size_for_region_unaligned(size_t region_size, size_t min_pages);
// Return the largest page size that can be used
static size_t max_page_size() {
--- a/hotspot/src/share/vm/runtime/synchronizer.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/runtime/synchronizer.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -276,18 +276,6 @@
THREAD->set_current_pending_monitor_is_from_java(true);
}
-// NOTE: must use heavy weight monitor to handle jni monitor enter
-bool ObjectSynchronizer::jni_try_enter(Handle obj, Thread* THREAD) {
- if (UseBiasedLocking) {
- BiasedLocking::revoke_and_rebias(obj, false, THREAD);
- assert(!obj->mark()->has_bias_pattern(), "biases should be revoked by now");
- }
-
- ObjectMonitor* monitor = ObjectSynchronizer::inflate_helper(obj());
- return monitor->try_enter(THREAD);
-}
-
-
// NOTE: must use heavy weight monitor to handle jni monitor exit
void ObjectSynchronizer::jni_exit(oop obj, Thread* THREAD) {
TEVENT(jni_exit);
--- a/hotspot/src/share/vm/runtime/synchronizer.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/runtime/synchronizer.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -65,7 +65,6 @@
// Used only to handle jni locks or other unmatched monitor enter/exit
// Internally they will use heavy weight monitor.
static void jni_enter(Handle obj, TRAPS);
- static bool jni_try_enter(Handle obj, Thread* THREAD); // Implements Unsafe.tryMonitorEnter
static void jni_exit(oop obj, Thread* THREAD);
// Handle all interpreter, compiler and jni cases
--- a/hotspot/src/share/vm/runtime/virtualspace.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/runtime/virtualspace.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -38,7 +38,8 @@
}
ReservedSpace::ReservedSpace(size_t size) {
- size_t page_size = os::page_size_for_region(size, 1);
+ // Want to use large pages where possible and pad with small pages.
+ size_t page_size = os::page_size_for_region_unaligned(size, 1);
bool large_pages = page_size != (size_t)os::vm_page_size();
// Don't force the alignment to be large page aligned,
// since that will waste memory.
@@ -617,7 +618,7 @@
bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) {
- const size_t max_commit_granularity = os::page_size_for_region(rs.size(), 1);
+ const size_t max_commit_granularity = os::page_size_for_region_unaligned(rs.size(), 1);
return initialize_with_granularity(rs, committed_size, max_commit_granularity);
}
@@ -1239,7 +1240,7 @@
case Disable:
return vs.initialize_with_granularity(rs, 0, os::vm_page_size());
case Commit:
- return vs.initialize_with_granularity(rs, 0, os::page_size_for_region(rs.size(), 1));
+ return vs.initialize_with_granularity(rs, 0, os::page_size_for_region_unaligned(rs.size(), 1));
}
}
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -668,6 +668,7 @@
static_field(SystemDictionary, WK_KLASS(WeakReference_klass), Klass*) \
static_field(SystemDictionary, WK_KLASS(FinalReference_klass), Klass*) \
static_field(SystemDictionary, WK_KLASS(PhantomReference_klass), Klass*) \
+ static_field(SystemDictionary, WK_KLASS(Cleaner_klass), Klass*) \
static_field(SystemDictionary, WK_KLASS(Finalizer_klass), Klass*) \
static_field(SystemDictionary, WK_KLASS(Thread_klass), Klass*) \
static_field(SystemDictionary, WK_KLASS(ThreadGroup_klass), Klass*) \
--- a/hotspot/src/share/vm/utilities/defaultStream.hpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/utilities/defaultStream.hpp Tue Jan 27 13:58:55 2015 -0500
@@ -41,6 +41,8 @@
void init();
void init_log();
+ fileStream* open_file(const char* log_name);
+ void start_log();
void finish_log();
void finish_log_on_error(char *buf, int buflen);
public:
--- a/hotspot/src/share/vm/utilities/ostream.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/utilities/ostream.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -367,7 +367,6 @@
#define EXTRACHARLEN 32
#define CURRENTAPPX ".current"
-#define FILENAMEBUFLEN 1024
// convert YYYY-MM-DD HH:MM:SS to YYYY-MM-DD_HH-MM-SS
char* get_datetime_string(char *buf, size_t len) {
os::local_time_string(buf, len);
@@ -401,7 +400,6 @@
buffer_length = strlen(log_name) + 1;
}
- // const char* star = strchr(basename, '*');
const char* pts = strstr(basename, "%p");
int pid_pos = (pts == NULL) ? -1 : (pts - nametail);
@@ -416,6 +414,11 @@
buffer_length += strlen(tms);
}
+ // File name is too long.
+ if (buffer_length > JVM_MAXPATHLEN) {
+ return NULL;
+ }
+
// Create big enough buffer.
char *buf = NEW_C_HEAP_ARRAY(char, buffer_length, mtInternal);
@@ -489,46 +492,88 @@
void test_loggc_filename() {
int pid;
char tms[32];
- char i_result[FILENAMEBUFLEN];
+ char i_result[JVM_MAXPATHLEN];
const char* o_result;
get_datetime_string(tms, sizeof(tms));
pid = os::current_process_id();
// test.log
- jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "test.log", tms);
+ jio_snprintf(i_result, JVM_MAXPATHLEN, "test.log", tms);
o_result = make_log_name_internal("test.log", NULL, pid, tms);
assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"test.log\", NULL)");
FREE_C_HEAP_ARRAY(char, o_result);
// test-%t-%p.log
- jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "test-%s-pid%u.log", tms, pid);
+ jio_snprintf(i_result, JVM_MAXPATHLEN, "test-%s-pid%u.log", tms, pid);
o_result = make_log_name_internal("test-%t-%p.log", NULL, pid, tms);
assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"test-%%t-%%p.log\", NULL)");
FREE_C_HEAP_ARRAY(char, o_result);
// test-%t%p.log
- jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "test-%spid%u.log", tms, pid);
+ jio_snprintf(i_result, JVM_MAXPATHLEN, "test-%spid%u.log", tms, pid);
o_result = make_log_name_internal("test-%t%p.log", NULL, pid, tms);
assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"test-%%t%%p.log\", NULL)");
FREE_C_HEAP_ARRAY(char, o_result);
// %p%t.log
- jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "pid%u%s.log", pid, tms);
+ jio_snprintf(i_result, JVM_MAXPATHLEN, "pid%u%s.log", pid, tms);
o_result = make_log_name_internal("%p%t.log", NULL, pid, tms);
assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"%%p%%t.log\", NULL)");
FREE_C_HEAP_ARRAY(char, o_result);
// %p-test.log
- jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "pid%u-test.log", pid);
+ jio_snprintf(i_result, JVM_MAXPATHLEN, "pid%u-test.log", pid);
o_result = make_log_name_internal("%p-test.log", NULL, pid, tms);
assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"%%p-test.log\", NULL)");
FREE_C_HEAP_ARRAY(char, o_result);
// %t.log
- jio_snprintf(i_result, sizeof(char)*FILENAMEBUFLEN, "%s.log", tms);
+ jio_snprintf(i_result, JVM_MAXPATHLEN, "%s.log", tms);
o_result = make_log_name_internal("%t.log", NULL, pid, tms);
assert(strcmp(i_result, o_result) == 0, "failed on testing make_log_name(\"%%t.log\", NULL)");
FREE_C_HEAP_ARRAY(char, o_result);
+
+ {
+ // longest filename
+ char longest_name[JVM_MAXPATHLEN];
+ memset(longest_name, 'a', sizeof(longest_name));
+ longest_name[JVM_MAXPATHLEN - 1] = '\0';
+ o_result = make_log_name_internal((const char*)&longest_name, NULL, pid, tms);
+ assert(strcmp(longest_name, o_result) == 0, err_msg("longest name does not match. expected '%s' but got '%s'", longest_name, o_result));
+ FREE_C_HEAP_ARRAY(char, o_result);
+ }
+
+ {
+ // too long file name
+ char too_long_name[JVM_MAXPATHLEN + 100];
+ int too_long_length = sizeof(too_long_name);
+ memset(too_long_name, 'a', too_long_length);
+ too_long_name[too_long_length - 1] = '\0';
+ o_result = make_log_name_internal((const char*)&too_long_name, NULL, pid, tms);
+ assert(o_result == NULL, err_msg("Too long file name should return NULL, but got '%s'", o_result));
+ }
+
+ {
+ // too long with timestamp
+ char longest_name[JVM_MAXPATHLEN];
+ memset(longest_name, 'a', JVM_MAXPATHLEN);
+ longest_name[JVM_MAXPATHLEN - 3] = '%';
+ longest_name[JVM_MAXPATHLEN - 2] = 't';
+ longest_name[JVM_MAXPATHLEN - 1] = '\0';
+ o_result = make_log_name_internal((const char*)&longest_name, NULL, pid, tms);
+ assert(o_result == NULL, err_msg("Too long file name after timestamp expansion should return NULL, but got '%s'", o_result));
+ }
+
+ {
+ // too long with pid
+ char longest_name[JVM_MAXPATHLEN];
+ memset(longest_name, 'a', JVM_MAXPATHLEN);
+ longest_name[JVM_MAXPATHLEN - 3] = '%';
+ longest_name[JVM_MAXPATHLEN - 2] = 'p';
+ longest_name[JVM_MAXPATHLEN - 1] = '\0';
+ o_result = make_log_name_internal((const char*)&longest_name, NULL, pid, tms);
+ assert(o_result == NULL, err_msg("Too long file name after pid expansion should return NULL, but got '%s'", o_result));
+ }
}
#endif // PRODUCT
@@ -637,9 +682,16 @@
_bytes_written = 0L;
_file_name = make_log_name(file_name, NULL);
+ if (_file_name == NULL) {
+ warning("Cannot open file %s: file name is too long.\n", file_name);
+ _need_close = false;
+ UseGCLogFileRotation = false;
+ return;
+ }
+
// gc log file rotation
if (UseGCLogFileRotation && NumberOfGCLogFiles > 1) {
- char tempbuf[FILENAMEBUFLEN];
+ char tempbuf[JVM_MAXPATHLEN];
jio_snprintf(tempbuf, sizeof(tempbuf), "%s.%d" CURRENTAPPX, _file_name, _cur_file_num);
_file = fopen(tempbuf, "w");
} else {
@@ -671,10 +723,10 @@
// concurrent GC threads to run parallel with VMThread at safepoint, write and rotate_log
// must be synchronized.
void gcLogFileStream::rotate_log(bool force, outputStream* out) {
- char time_msg[FILENAMEBUFLEN];
+ char time_msg[O_BUFLEN];
char time_str[EXTRACHARLEN];
- char current_file_name[FILENAMEBUFLEN];
- char renamed_file_name[FILENAMEBUFLEN];
+ char current_file_name[JVM_MAXPATHLEN];
+ char renamed_file_name[JVM_MAXPATHLEN];
if (!should_rotate(force)) {
return;
@@ -713,12 +765,15 @@
// have a form of extended_filename.<i>.current where i is the current rotation
// file number. After it reaches max file size, the file will be saved and renamed
// with .current removed from its tail.
- size_t filename_len = strlen(_file_name);
if (_file != NULL) {
- jio_snprintf(renamed_file_name, filename_len + EXTRACHARLEN, "%s.%d",
+ jio_snprintf(renamed_file_name, JVM_MAXPATHLEN, "%s.%d",
_file_name, _cur_file_num);
- jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX,
- _file_name, _cur_file_num);
+ int result = jio_snprintf(current_file_name, JVM_MAXPATHLEN,
+ "%s.%d" CURRENTAPPX, _file_name, _cur_file_num);
+ if (result >= JVM_MAXPATHLEN) {
+ warning("Cannot create new log file name: %s: file name is too long.\n", current_file_name);
+ return;
+ }
const char* msg = force ? "GC log rotation request has been received."
: "GC log file has reached the maximum size.";
@@ -757,19 +812,23 @@
_cur_file_num++;
if (_cur_file_num > NumberOfGCLogFiles - 1) _cur_file_num = 0;
- jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX,
+ int result = jio_snprintf(current_file_name, JVM_MAXPATHLEN, "%s.%d" CURRENTAPPX,
_file_name, _cur_file_num);
+ if (result >= JVM_MAXPATHLEN) {
+ warning("Cannot create new log file name: %s: file name is too long.\n", current_file_name);
+ return;
+ }
+
_file = fopen(current_file_name, "w");
if (_file != NULL) {
_bytes_written = 0L;
_need_close = true;
// reuse current_file_name for time_msg
- jio_snprintf(current_file_name, filename_len + EXTRACHARLEN,
+ jio_snprintf(current_file_name, JVM_MAXPATHLEN,
"%s.%d", _file_name, _cur_file_num);
jio_snprintf(time_msg, sizeof(time_msg), "%s GC log file created %s\n",
- os::local_time_string((char *)time_str, sizeof(time_str)),
- current_file_name);
+ os::local_time_string((char *)time_str, sizeof(time_str)), current_file_name);
write(time_msg, strlen(time_msg));
if (out != NULL) {
@@ -817,32 +876,64 @@
return _log_file != NULL;
}
+fileStream* defaultStream::open_file(const char* log_name) {
+ const char* try_name = make_log_name(log_name, NULL);
+ if (try_name == NULL) {
+ warning("Cannot open file %s: file name is too long.\n", log_name);
+ return NULL;
+ }
+
+ fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
+ FREE_C_HEAP_ARRAY(char, try_name);
+ if (file->is_open()) {
+ return file;
+ }
+
+ // Try again to open the file in the temp directory.
+ delete file;
+ char warnbuf[O_BUFLEN*2];
+ jio_snprintf(warnbuf, sizeof(warnbuf), "Warning: Cannot open log file: %s\n", log_name);
+ // Note: This feature is for maintainer use only. No need for L10N.
+ jio_print(warnbuf);
+ try_name = make_log_name(log_name, os::get_temp_directory());
+ if (try_name == NULL) {
+ warning("Cannot open file %s: file name is too long for directory %s.\n", log_name, os::get_temp_directory());
+ return NULL;
+ }
+
+ jio_snprintf(warnbuf, sizeof(warnbuf),
+ "Warning: Forcing option -XX:LogFile=%s\n", try_name);
+ jio_print(warnbuf);
+
+ file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
+ FREE_C_HEAP_ARRAY(char, try_name);
+ if (file->is_open()) {
+ return file;
+ }
+
+ delete file;
+ return NULL;
+}
+
void defaultStream::init_log() {
// %%% Need a MutexLocker?
const char* log_name = LogFile != NULL ? LogFile : "hotspot_%p.log";
- const char* try_name = make_log_name(log_name, NULL);
- fileStream* file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
- if (!file->is_open()) {
- // Try again to open the file.
- char warnbuf[O_BUFLEN*2];
- jio_snprintf(warnbuf, sizeof(warnbuf),
- "Warning: Cannot open log file: %s\n", try_name);
- // Note: This feature is for maintainer use only. No need for L10N.
- jio_print(warnbuf);
- FREE_C_HEAP_ARRAY(char, try_name);
- try_name = make_log_name(log_name, os::get_temp_directory());
- jio_snprintf(warnbuf, sizeof(warnbuf),
- "Warning: Forcing option -XX:LogFile=%s\n", try_name);
- jio_print(warnbuf);
- delete file;
- file = new(ResourceObj::C_HEAP, mtInternal) fileStream(try_name);
+ fileStream* file = open_file(log_name);
+
+ if (file != NULL) {
+ _log_file = file;
+ _outer_xmlStream = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file);
+ start_log();
+ } else {
+ // and leave xtty as NULL
+ LogVMOutput = false;
+ DisplayVMOutput = true;
+ LogCompilation = false;
}
- FREE_C_HEAP_ARRAY(char, try_name);
+}
- if (file->is_open()) {
- _log_file = file;
- xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file);
- _outer_xmlStream = xs;
+void defaultStream::start_log() {
+ xmlStream*xs = _outer_xmlStream;
if (this == tty) xtty = xs;
// Write XML header.
xs->print_cr("<?xml version='1.0' encoding='UTF-8'?>");
@@ -897,13 +988,6 @@
xs->head("tty");
// All further non-markup text gets copied to the tty:
xs->_text = this; // requires friend declaration!
- } else {
- delete(file);
- // and leave xtty as NULL
- LogVMOutput = false;
- DisplayVMOutput = true;
- LogCompilation = false;
- }
}
// finish_log() is called during normal VM shutdown. finish_log_on_error() is
--- a/hotspot/src/share/vm/utilities/vmError.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/src/share/vm/utilities/vmError.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -22,6 +22,7 @@
*
*/
+#include <fcntl.h>
#include "precompiled.hpp"
#include "code/codeCache.hpp"
#include "compiler/compileBroker.hpp"
@@ -807,7 +808,8 @@
static int expand_and_open(const char* pattern, char* buf, size_t buflen, size_t pos) {
int fd = -1;
if (Arguments::copy_expand_pid(pattern, strlen(pattern), &buf[pos], buflen - pos)) {
- fd = open(buf, O_RDWR | O_CREAT | O_TRUNC, 0666);
+ // the O_EXCL flag will cause the open to fail if the file exists
+ fd = open(buf, O_RDWR | O_CREAT | O_EXCL, 0666);
}
return fd;
}
--- a/hotspot/test/compiler/testlibrary/rtm/BusyLock.java Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/test/compiler/testlibrary/rtm/BusyLock.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,9 +24,6 @@
package rtm;
-import com.oracle.java.testlibrary.Utils;
-import sun.misc.Unsafe;
-
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
@@ -42,7 +39,6 @@
// Following field have to be static in order to avoid escape analysis.
@SuppressWarnings("UnsuedDeclaration")
private static int field = 0;
- private static final Unsafe UNSAFE = Utils.getUnsafe();
protected final Object monitor;
protected final int timeout;
@@ -59,18 +55,9 @@
@Override
public void run() {
try {
- // wait until forceAbort leave monitor
- barrier.await();
- if (UNSAFE.tryMonitorEnter(monitor)) {
- try {
- barrier.await();
- Thread.sleep(timeout);
- } finally {
- UNSAFE.monitorExit(monitor);
- }
- } else {
- throw new RuntimeException("Monitor should be entered by " +
- "::run() first.");
+ synchronized (monitor) {
+ barrier.await();
+ Thread.sleep(timeout);
}
} catch (InterruptedException | BrokenBarrierException e) {
throw new RuntimeException("Synchronization error happened.", e);
@@ -79,7 +66,6 @@
public void syncAndTest() {
try {
- barrier.await();
// wait until monitor is locked by a ::run method
barrier.await();
} catch (InterruptedException | BrokenBarrierException e) {
--- a/hotspot/test/gc/TestNUMAPageSize.java Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/test/gc/TestNUMAPageSize.java Tue Jan 27 13:58:55 2015 -0500
@@ -25,6 +25,7 @@
* @test TestNUMAPageSize
* @summary Make sure that start up with NUMA support does not cause problems.
* @bug 8061467
+ * @requires (vm.opt.AggressiveOpts == null) | (vm.opt.AggressiveOpts == false)
* @key gc
* @key regression
* @run main/othervm -Xmx8M -XX:+UseNUMA TestNUMAPageSize
--- a/hotspot/test/gc/TestSmallHeap.java Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/test/gc/TestSmallHeap.java Tue Jan 27 13:58:55 2015 -0500
@@ -25,6 +25,7 @@
* @test TestSmallHeap
* @bug 8067438
* @requires vm.gc=="null"
+ * @requires (vm.opt.AggressiveOpts=="null") | (vm.opt.AggressiveOpts=="false")
* @summary Verify that starting the VM with a small heap works
* @library /testlibrary /../../test/lib
* @build TestSmallHeap
@@ -33,8 +34,9 @@
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx2m -XX:+UseSerialGC TestSmallHeap
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx2m -XX:+UseG1GC TestSmallHeap
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -Xmx2m -XX:+UseConcMarkSweepGC TestSmallHeap
- *
- * Note: It would be nice to verify the minimal supported heap size (2m) here,
+ */
+
+/* Note: It would be nice to verify the minimal supported heap size (2m) here,
* but we align the heap size based on the card table size. And the card table
* size is aligned based on the minimal pages size provided by the os. This
* means that on most platforms, where the minimal page size is 4k, we get a
--- a/hotspot/test/gc/g1/TestHumongousCodeCacheRoots.java Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/test/gc/g1/TestHumongousCodeCacheRoots.java Tue Jan 27 13:58:55 2015 -0500
@@ -116,7 +116,14 @@
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(finalargs.toArray(new String[0]));
OutputAnalyzer output = new OutputAnalyzer(pb.start());
- output.shouldHaveExitValue(0);
+ try {
+ output.shouldHaveExitValue(0);
+ } catch (RuntimeException e) {
+ // It's ok if there is no client vm in the jdk.
+ if (output.firstMatch("Unrecognized option: -client") == null) {
+ throw e;
+ }
+ }
return output;
}
--- a/hotspot/test/runtime/ErrorHandling/ProblematicFrameTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/hotspot/test/runtime/ErrorHandling/ProblematicFrameTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,7 +44,7 @@
public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
- "-Xmx64m", "-XX:-TransmitErrorReport", Crasher.class.getName());
+ "-Xmx64m", "-XX:-TransmitErrorReport", "-XX:-CreateMinidumpOnCrash", Crasher.class.getName());
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldNotMatch("error occurred during error reporting \\(printing problematic frame\\)");
}
--- a/jaxp/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -288,3 +288,5 @@
40b242363040229a05224fbc5dc203a3f46a8f8f jdk9-b43
0cb0844b58924d6086d2850c22087d06679d5eef jdk9-b44
0dab3e848229127c7aca4c58b98e2d90ba70372f jdk9-b45
+74eaf7ad986576c792df4dbff05eed63e5727695 jdk9-b46
+e391de88e69b59d7c618387e3cf91032f6991ce9 jdk9-b47
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DBFNamespaceTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DBFNamespaceTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,64 +23,59 @@
package javax.xml.parsers.ptests;
-import static jaxp.library.JAXPTestUtilities.FILE_SEP;
import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
-
import java.io.File;
-import java.io.IOException;
-
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
+import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR;
+import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
-
+import jaxp.library.JAXPFileBaseTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
/**
* This tests DocumentBuilderFactory for namespace processing and no-namespace
* processing.
*/
-public class DBFNamespaceTest {
+public class DBFNamespaceTest extends JAXPFileBaseTest {
/**
* Provide input for the cases that supporting namespace or not.
+ * @return a two-dimensional array contains factory, output file name and
+ * golden validate file name.
*/
@DataProvider(name = "input-provider")
public Object[][] getInput() {
DocumentBuilderFactory dbf1 = DocumentBuilderFactory.newInstance();
- String outputfile1 = USER_DIR + FILE_SEP + "dbfnstest01.out";
- String goldfile1 = TestUtils.GOLDEN_DIR + FILE_SEP + "dbfnstest01GF.out";
+ String outputfile1 = USER_DIR + "dbfnstest01.out";
+ String goldfile1 = GOLDEN_DIR + "dbfnstest01GF.out";
DocumentBuilderFactory dbf2 = DocumentBuilderFactory.newInstance();
dbf2.setNamespaceAware(true);
- String outputfile2 = USER_DIR + FILE_SEP + "dbfnstest02.out";
- String goldfile2 = TestUtils.GOLDEN_DIR + FILE_SEP + "dbfnstest02GF.out";
+ String outputfile2 = USER_DIR + "dbfnstest02.out";
+ String goldfile2 = GOLDEN_DIR + "dbfnstest02GF.out";
return new Object[][] { { dbf1, outputfile1, goldfile1 }, { dbf2, outputfile2, goldfile2 } };
}
/**
* Test to parse and transform a document without supporting namespace and
* with supporting namespace.
+ * @param dbf a Document Builder factory for creating document object.
+ * @param outputfile output file name.
+ * @param goldfile golden validate file name.
+ * @throws Exception If any errors occur.
*/
@Test(dataProvider = "input-provider")
- public void testNamespaceTest(DocumentBuilderFactory dbf, String outputfile, String goldfile) {
- try {
- Document doc = dbf.newDocumentBuilder().parse(new File(TestUtils.XML_DIR, "namespace1.xml"));
- dummyTransform(doc, outputfile);
- assertTrue(compareWithGold(goldfile, outputfile));
- } catch (SAXException | IOException | ParserConfigurationException | TransformerFactoryConfigurationError | TransformerException e) {
- failUnexpected(e);
- }
+ public void testNamespaceTest(DocumentBuilderFactory dbf, String outputfile,
+ String goldfile) throws Exception {
+ Document doc = dbf.newDocumentBuilder().parse(new File(XML_DIR, "namespace1.xml"));
+ dummyTransform(doc, outputfile);
+ assertTrue(compareWithGold(goldfile, outputfile));
}
/**
@@ -89,16 +84,14 @@
* not chosen, namespaceURI in callbacks should be an empty string otherwise
* it should be namespaceURI.
*
- * @throws TransformerFactoryConfigurationError
- * @throws TransformerException
- * @throws IOException
+ * @throws Exception If any errors occur.
*/
- private void dummyTransform(Document document, String fileName) throws TransformerFactoryConfigurationError, TransformerException, IOException {
+ private void dummyTransform(Document document, String fileName)
+ throws Exception {
DOMSource domSource = new DOMSource(document);
- Transformer transformer = TransformerFactory.newInstance().newTransformer();
- File file = new File(fileName);
- System.out.println("The fileName is " + file.getAbsolutePath());
- transformer.transform(domSource, new SAXResult(MyCHandler.newInstance(file)));
+ try(MyCHandler chandler = MyCHandler.newInstance(new File(fileName))) {
+ TransformerFactory.newInstance().newTransformer().
+ transform(domSource, new SAXResult(chandler));
+ }
}
-
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory01.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,451 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package javax.xml.parsers.ptests;
-
-import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileReader;
-import java.io.IOException;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * This checks the methods of DocumentBuilderFactoryImpl
- */
-public class DocumentBuilderFactory01 {
- /**
- * Testcase to test the default functionality of schema support method.
- */
- @Test
- public void testCheckSchemaSupport1() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setValidating(true);
- dbf.setNamespaceAware(true);
- dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
- MyErrorHandler eh = MyErrorHandler.newInstance();
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(eh);
- Document doc = db.parse(new File(TestUtils.XML_DIR, "test.xml"));
- assertFalse(eh.errorOccured);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the default functionality of schema support method. In
- * this case the schema source property is set.
- */
- @Test
- public void testCheckSchemaSupport2() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setValidating(true);
- dbf.setNamespaceAware(true);
- dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
- dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", new InputSource(new FileInputStream(
- new File(TestUtils.XML_DIR, "test.xsd"))));
- MyErrorHandler eh = MyErrorHandler.newInstance();
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(eh);
- Document doc = db.parse(new File(TestUtils.XML_DIR, "test1.xml"));
- assertFalse(eh.errorOccured);
- } catch (IllegalArgumentException | ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
-
- }
-
- /**
- * Testcase to test the default functionality of schema support method. In
- * this case the schema source property is set.
- */
- @Test
- public void testCheckSchemaSupport3() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- spf.setValidating(true);
- spf.setNamespaceAware(true);
- SAXParser sp = spf.newSAXParser();
- sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");
- sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource",
- new InputSource(new FileInputStream(new File(TestUtils.XML_DIR, "test.xsd"))));
- DefaultHandler dh = new DefaultHandler();
- sp.parse(new File(TestUtils.XML_DIR, "test1.xml"), dh);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the default functionality of newInstance method. To test
- * the isCoalescing method and setCoalescing This checks to see if the CDATA
- * and text nodes got combined In that case it will print "<xml>This
- * is not parsed</xml> yet".
- */
- @Test
- public void testCheckDocumentBuilderFactory02() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setCoalescing(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory01.xml"));
- Element e = (Element) doc.getElementsByTagName("html").item(0);
- NodeList nl = e.getChildNodes();
- assertEquals(nl.item(0).getNodeValue().trim(), "<xml>This is not parsed</xml> yet");
- } catch (IOException | SAXException | ParserConfigurationException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the isIgnoringComments. By default it is false.
- */
- @Test
- public void testCheckDocumentBuilderFactory03() {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- assertFalse(dbf.isIgnoringComments());
- }
-
- /**
- * Testcase to test the isValidating. By default it is false, set it to true
- * and then use a document which is not valid. It should throw a warning or
- * an error at least. The test passes in case retval 0 is set in the error
- * method .
- */
- @Test
- public void testCheckDocumentBuilderFactory04() {
- try {
- MyErrorHandler eh = MyErrorHandler.newInstance();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setValidating(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(eh);
- Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory05.xml"));
- assertTrue(eh.errorOccured);
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the setValidating. By default it is false, use a
- * document which is not valid. It should not throw a warning or an error.
- * The test passes in case the retval equals 1 .
- */
- @Test
- public void testCheckDocumentBuilderFactory16() {
- try {
- MyErrorHandler eh = MyErrorHandler.newInstance();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(eh);
- Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory05.xml"));
- assertFalse(eh.errorOccured);
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
-
- }
-
- /**
- * Testcase to test the setValidating. By default it is false, use a
- * document which is valid. It should not throw a warning or an error. The
- * test passes in case the retval equals 1.
- */
- @Test
- public void testCheckDocumentBuilderFactory17() {
- try {
- MyErrorHandler eh = MyErrorHandler.newInstance();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(eh);
- Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory04.xml"));
- assertFalse(eh.errorOccured);
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
-
- }
-
- /**
- * To test the isExpandEntityReferences. By default it is true.
- */
- @Test
- public void testCheckDocumentBuilderFactory05() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml")));
- Element e = (Element) doc.getElementsByTagName("title").item(0);
- NodeList nl = e.getChildNodes();
- assertTrue(dbf.isExpandEntityReferences());
- assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W');
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the default functionality of setValidating method. The
- * xml file has a DTD which has namespaces defined. The parser takes care to
- * check if the namespaces using elements and defined attributes are there
- * or not.
- */
- @Test
- public void testCheckDocumentBuilderFactory06() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setValidating(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- MyErrorHandler eh = MyErrorHandler.newInstance();
- db.setErrorHandler(eh);
- Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory04.xml"));
- assertTrue(doc instanceof Document);
- assertFalse(eh.errorOccured);
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
-
- }
-
- /**
- * Testcase to test the setExpandEntityReferences.
- */
- @Test
- public void testCheckDocumentBuilderFactory07() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setExpandEntityReferences(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml")));
- Element e = (Element) doc.getElementsByTagName("title").item(0);
- NodeList nl = e.getChildNodes();
- assertTrue(dbf.isExpandEntityReferences());
- assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W');
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the setExpandEntityReferences.
- */
- @Test
- public void testCheckDocumentBuilderFactory08() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setExpandEntityReferences(false);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml")));
- Element e = (Element) doc.getElementsByTagName("title").item(0);
- NodeList nl = e.getChildNodes();
- assertNull(nl.item(0).getNodeValue());
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the setIgnoringComments. By default it is set to false.
- * explicitly setting it to false, it recognizes the comment which is in
- * Element Node Hence the Element's child node is not null.
- */
- @Test
- public void testCheckDocumentBuilderFactory09() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setIgnoringComments(false);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml")));
- Element e = (Element) doc.getElementsByTagName("body").item(0);
- NodeList nl = e.getChildNodes();
- assertNotNull(nl.item(0).getNodeValue());
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
-
- }
-
- /**
- * This tests for the parse(InputSource).
- */
- @Test
- public void testCheckDocumentBuilderFactory10() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new InputSource(new BufferedReader(new FileReader(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml")))));
- assertTrue(doc instanceof Document);
- } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * This tests for the parse InputStream with SystemID as a second parameter.
- */
- @Test
- public void testCheckDocumentBuilderFactory11() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "dbf10import.xsl")), new File(TestUtils.XML_DIR).toURI()
- .toASCIIString());
- assertTrue(doc instanceof Document);
- } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * This tests for the parse InputStream with empty SystemID as a second
- * parameter.
- */
- @Test
- public void testCheckDocumentBuilderFactory12() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "dbf10import.xsl")), " ");
- assertTrue(doc instanceof Document);
- } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * This tests for the parse(uri).
- */
- @Test
- public void testCheckDocumentBuilderFactory13() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new File(TestUtils.XML_DIR + FILE_SEP + "dbf10import.xsl").toURI().toASCIIString());
- assertTrue(doc instanceof Document);
- } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * This tests for the parse (uri) with empty string as parameter should
- * throw Sax Exception.
- *
- * @throws SAXException
- * If any parse errors occur.
- */
- @Test(expectedExceptions = SAXException.class)
- public void testCheckDocumentBuilderFactory14() throws SAXException {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- docBuilder.parse("");
- } catch (ParserConfigurationException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * This tests for the parse (uri) with null uri as parameter should throw
- * IllegalArgumentException.
- *
- */
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testCheckDocumentBuilderFactory15() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- String uri = null;
- docBuilder.parse(uri);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the setIgnoringComments. By default it is set to false,
- * setting this to true, It does not recognize the comment, Here the
- * nodelist has a length 0 because the ignoring comments is true.
- */
- @Test
- public void testCheckIgnoringComments() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setIgnoringComments(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory08.xml")));
- Element e = (Element) doc.getElementsByTagName("body").item(0);
- NodeList nl = e.getChildNodes();
- assertEquals(nl.getLength(), 0);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
-
- }
-
- /**
- * Testcase to test the default behaviour of setIgnoringComments. By default
- * it is set to false, this is similar to case 9 but not setIgnoringComments
- * explicitly, it does not recognize the comment.
- */
- @Test
- public void testCheckIgnoringComments1() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml")));
- Element e = (Element) doc.getElementsByTagName("body").item(0);
- NodeList nl = e.getChildNodes();
- assertFalse(dbf.isIgnoringComments());
- assertNotNull(nl.item(0).getNodeValue());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory02.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package javax.xml.parsers.ptests;
-
-import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.USER_DIR;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-
-import java.io.File;
-import java.io.IOException;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXResult;
-
-import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
-
-/**
- * This tests the setIgnoringElementWhitespace and setIgnoringComments of
- * DocumentBuilderFactory
- */
-public class DocumentBuilderFactory02 {
-
- /**
- * This testcase tests for the isIgnoringElementContentWhitespace and the
- * setIgnoringElementContentWhitespace. The xml file has all kinds of
- * whitespace,tab and newline characters, it uses the MyNSContentHandler
- * which does not invoke the characters callback when this
- * setIgnoringElementContentWhitespace is set to true.
- */
- @Test
- public void testCheckElementContentWhitespace() {
- try {
- String goldFile = TestUtils.GOLDEN_DIR + FILE_SEP + "dbfactory02GF.out";
- String outputFile = USER_DIR + FILE_SEP + "dbfactory02.out";
- MyErrorHandler eh = MyErrorHandler.newInstance();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setValidating(true);
- assertFalse(dbf.isIgnoringElementContentWhitespace());
- dbf.setIgnoringElementContentWhitespace(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- db.setErrorHandler(eh);
- Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory06.xml"));
- assertFalse(eh.errorOccured);
- DOMSource domSource = new DOMSource(doc);
- TransformerFactory tfactory = TransformerFactory.newInstance();
- Transformer transformer = tfactory.newTransformer();
- SAXResult saxResult = new SAXResult();
- saxResult.setHandler(MyCHandler.newInstance(new File(outputFile)));
- transformer.transform(domSource, saxResult);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException | IOException | TransformerException e) {
- failUnexpected(e);
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactoryTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,462 @@
+/*
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.xml.parsers.ptests;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilePermission;
+import java.io.FileReader;
+import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR;
+import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXResult;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.compareWithGold;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * This checks the methods of DocumentBuilderFactoryImpl.
+ */
+public class DocumentBuilderFactoryTest extends JAXPFileBaseTest {
+ /**
+ * Test the default functionality of schema support method.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckSchemaSupport1() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setValidating(true);
+ dbf.setNamespaceAware(true);
+ dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
+ W3C_XML_SCHEMA_NS_URI);
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ db.setErrorHandler(eh);
+ db.parse(new File(XML_DIR, "test.xml"));
+ assertFalse(eh.isErrorOccured());
+ }
+
+ /**
+ * Test the default functionality of schema support method. In
+ * this case the schema source property is set.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckSchemaSupport2() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "test.xsd"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setValidating(true);
+ dbf.setNamespaceAware(true);
+ dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
+ W3C_XML_SCHEMA_NS_URI);
+ dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
+ new InputSource(fis));
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ db.setErrorHandler(eh);
+ db.parse(new File(XML_DIR, "test1.xml"));
+ assertFalse(eh.isErrorOccured());
+ }
+ }
+
+ /**
+ * Test the default functionality of schema support method. In
+ * this case the schema source property is set.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckSchemaSupport3() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "test.xsd"))) {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.setValidating(true);
+ spf.setNamespaceAware(true);
+ SAXParser sp = spf.newSAXParser();
+ sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
+ W3C_XML_SCHEMA_NS_URI);
+ sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource",
+ new InputSource(fis));
+ DefaultHandler dh = new DefaultHandler();
+ // Not expect any unrecoverable error here.
+ sp.parse(new File(XML_DIR, "test1.xml"), dh);
+ }
+ }
+
+ /**
+ * Test the default functionality of newInstance method. To test
+ * the isCoalescing method and setCoalescing This checks to see if the CDATA
+ * and text nodes got combined In that case it will print "<xml>This
+ * is not parsed</xml> yet".
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory02() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setCoalescing(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(new File(XML_DIR, "DocumentBuilderFactory01.xml"));
+ Element e = (Element) doc.getElementsByTagName("html").item(0);
+ NodeList nl = e.getChildNodes();
+ assertEquals(nl.getLength(), 1);
+ }
+
+ /**
+ * Test the isIgnoringComments. By default it is false.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory03() {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ assertFalse(dbf.isIgnoringComments());
+ }
+
+ /**
+ * Test the isValidating. By default it is false, set it to true and then
+ * use a document which is not valid. It should throw a warning or
+ * an error at least. The test passes in case retval 0 is set in the error
+ * method .
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory04() throws Exception {
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setValidating(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ db.setErrorHandler(eh);
+ db.parse(new File(XML_DIR, "DocumentBuilderFactory05.xml"));
+ assertTrue(eh.isErrorOccured());
+ }
+
+ /**
+ * Test the setValidating. By default it is false, use a
+ * document which is not valid. It should not throw a warning or an error.
+ * The test passes in case the return value equals 1.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory16() throws Exception {
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ db.setErrorHandler(eh);
+ db.parse(new File(XML_DIR, "DocumentBuilderFactory05.xml"));
+ assertFalse(eh.isErrorOccured());
+ }
+
+ /**
+ * Test the setValidating. By default it is false, use a
+ * document which is valid. It should not throw a warning or an error. The
+ * test passes in case the return value equals 1.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory17() throws Exception {
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ db.setErrorHandler(eh);
+ db.parse(new File(XML_DIR, "DocumentBuilderFactory04.xml"));
+ assertFalse(eh.isErrorOccured());
+ }
+
+ /**
+ * Test the isExpandEntityReferences. By default it is true.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory05() throws Exception {
+ try(FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "DocumentBuilderFactory02.xml"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis);
+ Element e = (Element) doc.getElementsByTagName("title").item(0);
+ NodeList nl = e.getChildNodes();
+ assertTrue(dbf.isExpandEntityReferences());
+ assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W');
+ }
+ }
+
+ /**
+ * Test the default functionality of setValidating method. The
+ * XML file has a DTD which has namespaces defined. The parser takes care to
+ * check if the namespaces using elements and defined attributes are there
+ * or not.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory06() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setValidating(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ db.setErrorHandler(eh);
+ Document doc = db.parse(new File(XML_DIR, "DocumentBuilderFactory04.xml"));
+ assertTrue(doc instanceof Document);
+ assertFalse(eh.isErrorOccured());
+ }
+
+ /**
+ * Test the setExpandEntityReferences.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory07() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "DocumentBuilderFactory02.xml"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setExpandEntityReferences(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis);
+ Element e = (Element) doc.getElementsByTagName("title").item(0);
+ NodeList nl = e.getChildNodes();
+ assertTrue(dbf.isExpandEntityReferences());
+ assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W');
+ }
+ }
+
+ /**
+ * Test the setExpandEntityReferences.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory08() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "DocumentBuilderFactory02.xml"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setExpandEntityReferences(false);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis);
+ Element e = (Element) doc.getElementsByTagName("title").item(0);
+ NodeList nl = e.getChildNodes();
+ assertNull(nl.item(0).getNodeValue());
+ }
+ }
+
+ /**
+ * Test the setIgnoringComments. By default it is set to false.
+ * explicitly setting it to false, it recognizes the comment which is in
+ * Element Node Hence the Element's child node is not null.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory09() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "DocumentBuilderFactory07.xml"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setIgnoringComments(false);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis);
+ Element e = (Element) doc.getElementsByTagName("body").item(0);
+ NodeList nl = e.getChildNodes();
+ assertNotNull(nl.item(0).getNodeValue());
+ }
+ }
+
+ /**
+ * This tests for the parse(InputSource).
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory10() throws Exception {
+ try (BufferedReader br = new BufferedReader(new FileReader(new File(
+ XML_DIR, "DocumentBuilderFactory07.xml")))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(new InputSource(br));
+ assertNotNull(doc);
+ }
+ }
+
+ /**
+ * This tests for the parse InputStream with SystemID as a second parameter.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory11() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "dbf10import.xsl"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis, new File(XML_DIR).toURI()
+ .toASCIIString());
+ assertNotNull(doc);
+ }
+ }
+
+ /**
+ * This tests for the parse InputStream with empty SystemID as a second
+ * parameter.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory12() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "dbf10import.xsl"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis, " ");
+ assertNotNull(doc);
+ }
+ }
+
+ /**
+ * This tests for the parse(uri).
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckDocumentBuilderFactory13() throws Exception {
+ // Accesing default working directory.
+ String workingDir = getSystemProperty("user.dir");
+ setPermissions(new FilePermission(workingDir + "/*", "read"));
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(new File(XML_DIR + "dbf10import.xsl")
+ .toURI().toASCIIString());
+ assertNotNull(doc);
+ }
+
+ /**
+ * This tests for the parse(uri) with empty string as parameter should
+ * throw Sax Exception.
+ * @throws Exception If any errors occur.
+ */
+ @Test(expectedExceptions = SAXException.class)
+ public void testCheckDocumentBuilderFactory14() throws Exception {
+ // Accesing default working directory.
+ String workingDir = getSystemProperty("user.dir");
+ setPermissions(new FilePermission(workingDir, "read"));
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ docBuilder.parse("");
+ }
+
+ /**
+ * This tests for the parse (uri) with null uri as parameter should throw
+ * IllegalArgumentException.
+ * @throws Exception If any errors occur.
+ *
+ */
+ @Test(expectedExceptions = IllegalArgumentException.class)
+ public void testCheckDocumentBuilderFactory15() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ String uri = null;
+ docBuilder.parse(uri);
+ }
+
+ /**
+ * Test the setIgnoringComments. By default it is set to false,
+ * setting this to true, It does not recognize the comment, Here the
+ * nodelist has a length 0 because the ignoring comments is true.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckIgnoringComments() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "DocumentBuilderFactory08.xml"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setIgnoringComments(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis);
+ Element e = (Element) doc.getElementsByTagName("body").item(0);
+ NodeList nl = e.getChildNodes();
+ assertEquals(nl.getLength(), 0);
+ }
+ }
+
+ /**
+ * Test the default behaviour of setIgnoringComments. By default
+ * it is set to false, this is similar to case 9 but not setIgnoringComments
+ * explicitly, it does not recognize the comment.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckIgnoringComments1() throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(
+ XML_DIR, "DocumentBuilderFactory07.xml"))) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document doc = docBuilder.parse(fis);
+ Element e = (Element) doc.getElementsByTagName("body").item(0);
+ NodeList nl = e.getChildNodes();
+ assertFalse(dbf.isIgnoringComments());
+ assertNotNull(nl.item(0).getNodeValue());
+ }
+ }
+
+ /**
+ * Test for the isIgnoringElementContentWhitespace and the
+ * setIgnoringElementContentWhitespace. The xml file has all kinds of
+ * whitespace,tab and newline characters, it uses the MyNSContentHandler
+ * which does not invoke the characters callback when this
+ * setIgnoringElementContentWhitespace is set to true.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testCheckElementContentWhitespace() throws Exception {
+ String goldFile = GOLDEN_DIR + "dbfactory02GF.out";
+ String outputFile = USER_DIR + "dbfactory02.out";
+ MyErrorHandler eh = MyErrorHandler.newInstance();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setValidating(true);
+ assertFalse(dbf.isIgnoringElementContentWhitespace());
+ dbf.setIgnoringElementContentWhitespace(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ db.setErrorHandler(eh);
+ Document doc = db.parse(new File(XML_DIR, "DocumentBuilderFactory06.xml"));
+ assertFalse(eh.isErrorOccured());
+ DOMSource domSource = new DOMSource(doc);
+ TransformerFactory tfactory = TransformerFactory.newInstance();
+ Transformer transformer = tfactory.newTransformer();
+ SAXResult saxResult = new SAXResult();
+ try(MyCHandler handler = MyCHandler.newInstance(new File(outputFile))) {
+ saxResult.setHandler(handler);
+ transformer.transform(domSource, saxResult);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderImpl01.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderImpl01.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,33 +24,32 @@
package javax.xml.parsers.ptests;
import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertFalse;
-
import java.io.File;
import java.io.FileInputStream;
-import java.io.IOException;
-
+import java.io.FilePermission;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
-
+import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
+import static org.testng.Assert.assertNotNull;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
-import org.w3c.dom.Document;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* This checks for the methods of DocumentBuilder
*/
-public class DocumentBuilderImpl01 implements EntityResolver {
-
+public class DocumentBuilderImpl01 extends JAXPFileReadOnlyBaseTest
+ implements EntityResolver {
/**
* Provide DocumentBuilder.
*
- * @throws ParserConfigurationException
+ * @return data provider has single DocumentBuilder.
+ * @throws ParserConfigurationException if a DocumentBuilder cannot be
+ * created which satisfies the configuration requested.
*/
@DataProvider(name = "builder-provider")
public Object[][] getBuilder() throws ParserConfigurationException {
@@ -60,17 +59,18 @@
}
/**
- * Testcase to test the default functionality of isValidation method. Expect
+ * Test the default functionality of isValidation method. Expect
* to return false because not setting the validation.
+ * @param docBuilder document builder instance.
*/
@Test(dataProvider = "builder-provider")
public void testCheckDocumentBuilderImpl01(DocumentBuilder docBuilder) {
assertFalse(docBuilder.isValidating());
-
}
/**
- * Testcase to test the default functionality of isNamespaceAware method.
+ * Test the default functionality of isNamespaceAware method.
+ * @param docBuilder document builder instance.
*/
@Test(dataProvider = "builder-provider")
public void testCheckDocumentBuilderImpl02(DocumentBuilder docBuilder) {
@@ -78,51 +78,71 @@
}
/**
- * Testcase to test the parse(InputStream).
+ * Test the parse(InputStream).
+ * @param docBuilder document builder instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "builder-provider")
- public void testCheckDocumentBuilderImpl04(DocumentBuilder docBuilder) {
- try {
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderImpl01.xml")));
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, dataProvider = "builder-provider")
+ public void testCheckDocumentBuilderImpl04(DocumentBuilder docBuilder)
+ throws Exception {
+ try (FileInputStream fis = new FileInputStream(new File(XML_DIR,
+ "DocumentBuilderImpl01.xml"))) {
+ assertNotNull(docBuilder.parse(fis));
}
}
/**
- * Testcase to test the parse(File).
+ * Test the parse(File).
+ *
+ * @param docBuilder document builder instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "builder-provider")
- public void testCheckDocumentBuilderImpl05(DocumentBuilder docBuilder) {
- try {
- Document doc = docBuilder.parse(new File(TestUtils.XML_DIR, "DocumentBuilderImpl01.xml"));
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, dataProvider = "builder-provider")
+ public void testCheckDocumentBuilderImpl05(DocumentBuilder docBuilder)
+ throws Exception {
+ assertNotNull(docBuilder.parse(new File(XML_DIR,
+ "DocumentBuilderImpl01.xml")));
+ }
+
+ /**
+ * Test the parse(InputStream,systemId).
+ * @param docBuilder document builder instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, dataProvider = "builder-provider")
+ public void testCheckDocumentBuilderImpl06(DocumentBuilder docBuilder)
+ throws Exception {
+ setPermissions(new FilePermission(XML_DIR + "../-",
+ "read"));
+ try (FileInputStream fis = new FileInputStream(new File(XML_DIR,
+ "DocumentBuilderImpl02.xml"))) {
+ assertNotNull(docBuilder.parse(fis, new File(XML_DIR).toURI()
+ .toASCIIString() + FILE_SEP));
}
}
/**
- * Testcase to test the parse(InputStream,systemId).
- */
- @Test(dataProvider = "builder-provider")
- public void testCheckDocumentBuilderImpl06(DocumentBuilder docBuilder) {
- try {
- Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderImpl02.xml")), new File(TestUtils.XML_DIR).toURI()
- .toASCIIString() + FILE_SEP);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the setEntityResolver.
+ * Test the setEntityResolver.
+ * @param docBuilder document builder instance.
*/
@Test(dataProvider = "builder-provider")
public void testCheckDocumentBuilderImpl07(DocumentBuilder docBuilder) {
docBuilder.setEntityResolver(this);
- resolveEntity("publicId", "http://www.myhost.com/today");
+ assertNotNull(resolveEntity("publicId", "http://www.myhost.com/today"));
}
+ /**
+ * Allow the application to resolve external entities.
+ *
+ * @param publicId The public identifier of the external entity
+ * being referenced, or null if none was supplied.
+ * @param systemId The system identifier of the external entity
+ * being referenced.
+ * @return An InputSource object describing the new input source,
+ * or null to request that the parser open a regular
+ * URI connection to the system identifier.
+ */
+ @Override
public InputSource resolveEntity(String publicId, String systemId) {
if (systemId.equals("http://www.myhost.com/today"))
return new InputSource(systemId);
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/FactoryConfErrorTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/FactoryConfErrorTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPBaseTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
@@ -35,7 +36,7 @@
* Class containing the test cases for SAXParserFactory/DocumentBuilderFactory
* newInstance methods.
*/
-public class FactoryConfErrorTest {
+public class FactoryConfErrorTest extends JAXPBaseTest {
/**
* Set properties DocumentBuilderFactory and SAXParserFactory to invalid
@@ -43,8 +44,8 @@
*/
@BeforeTest
public void setup() {
- System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "xx");
- System.setProperty("javax.xml.parsers.SAXParserFactory", "xx");
+ setSystemProperty("javax.xml.parsers.DocumentBuilderFactory", "xx");
+ setSystemProperty("javax.xml.parsers.SAXParserFactory", "xx");
}
/**
@@ -53,8 +54,8 @@
*/
@AfterTest
public void cleanup() {
- System.clearProperty("javax.xml.parsers.DocumentBuilderFactory");
- System.clearProperty("javax.xml.parsers.SAXParserFactory");
+ setSystemProperty("javax.xml.parsers.DocumentBuilderFactory", null);
+ setSystemProperty("javax.xml.parsers.SAXParserFactory", null);
}
/**
@@ -67,7 +68,7 @@
}
/**
- * To test exeception thrown if javax.xml.parsers.DocumentBuilderFactory is
+ * To test exception thrown if javax.xml.parsers.DocumentBuilderFactory is
* invalid.
*/
@Test(expectedExceptions = FactoryConfigurationError.class)
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserFactTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserFactTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,24 +22,16 @@
*/
package javax.xml.parsers.ptests;
-
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
-
+import jaxp.library.JAXPBaseTest;
import org.testng.annotations.Test;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
/**
- * Class containing the test cases for SAXParserFactory API
+ * Class containing the test cases for SAXParserFactory API.
*/
-public class SAXParserFactTest {
+public class SAXParserFactTest extends JAXPBaseTest {
private static final String NAMESPACES = "http://xml.org/sax/features/namespaces";
private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes";
@@ -49,20 +41,17 @@
private static final String EXTERNAL_P_ENTITIES = "http://xml.org/sax/features/external-parameter-entities";
/**
- * Testcase to test if newSAXParser() method returns SAXParser.
+ * Test if newSAXParser() method returns SAXParser.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testParser01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- SAXParser saxparser = spf.newSAXParser();
- } catch (ParserConfigurationException | SAXException e) {
- failUnexpected(e);
- }
+ public void testParser01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.newSAXParser();
}
/**
- * Testcase to test the default functionality (No validation) of the parser.
+ * Test the default functionality (No validation) of the parser.
*/
@Test
public void testValidate01() {
@@ -71,7 +60,7 @@
}
/**
- * Testcase to test the functionality of setValidating and isvalidating
+ * Test the functionality of setValidating and isvalidating
* methods.
*/
@Test
@@ -82,7 +71,7 @@
}
/**
- * Parser should not be namespaceaware by default.
+ * Parser should not be namespace-aware by default.
*/
@Test
public void testNamespace01() {
@@ -91,7 +80,7 @@
}
/**
- * Testcase to test the functionality of setNamespaceAware and
+ * Test the functionality of setNamespaceAware and
* isNamespaceAware methods.
*/
@Test
@@ -102,167 +91,132 @@
}
/**
- * Testcase to test the functionality of setNamespaceAware and getFeature()
+ * Test the functionality of setNamespaceAware and getFeature()
* methods for namespaces property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- assertFalse(spf.getFeature(NAMESPACES));
+ public void testFeature01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ assertFalse(spf.getFeature(NAMESPACES));
- spf.setNamespaceAware(true);
- assertTrue(spf.getFeature(NAMESPACES));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
+ spf.setNamespaceAware(true);
+ assertTrue(spf.getFeature(NAMESPACES));
}
/**
- * Testcase to test the functionality of setFeature and getFeature methods
+ * Test the functionality of setFeature and getFeature methods
* for namespaces property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
+ public void testFeature02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setFeature(NAMESPACES, true);
- assertTrue(spf.getFeature(NAMESPACES));
+ spf.setFeature(NAMESPACES, true);
+ assertTrue(spf.getFeature(NAMESPACES));
- spf.setFeature(NAMESPACES, false);
- assertFalse(spf.getFeature(NAMESPACES));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
+ spf.setFeature(NAMESPACES, false);
+ assertFalse(spf.getFeature(NAMESPACES));
}
/**
- * Testcase to test the functionality of setFeature and getFeature methods
+ * Test the functionality of setFeature and getFeature methods
* for namespace-prefixes property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature03() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
+ public void testFeature03() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setFeature(NAMESPACE_PREFIXES, true);
- assertTrue(spf.getFeature(NAMESPACE_PREFIXES));
+ spf.setFeature(NAMESPACE_PREFIXES, true);
+ assertTrue(spf.getFeature(NAMESPACE_PREFIXES));
- spf.setFeature(NAMESPACE_PREFIXES, false);
- assertFalse(spf.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
+ spf.setFeature(NAMESPACE_PREFIXES, false);
+ assertFalse(spf.getFeature(NAMESPACE_PREFIXES));
}
/**
- * Testcase to test the functionality of getFeature method for
+ * Test the functionality of getFeature method for
* string-interning property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature04() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- assertTrue(spf.getFeature(STRING_INTERNING));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
+ public void testFeature04() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ assertTrue(spf.getFeature(STRING_INTERNING));
}
/**
- * Testcase to test the functionality of getFeature and setValidating
+ * Test the functionality of getFeature and setValidating
* methods for validation property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature05() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- assertFalse(spf.getFeature(VALIDATION));
- spf.setValidating(true);
- assertTrue(spf.getFeature(VALIDATION));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
-
+ public void testFeature05() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ assertFalse(spf.getFeature(VALIDATION));
+ spf.setValidating(true);
+ assertTrue(spf.getFeature(VALIDATION));
}
/**
- * Testcase to test the functionality of setFeature and getFeature methods
+ * Test the functionality of setFeature and getFeature methods
* for validation property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature06() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
-
- spf.setFeature(VALIDATION, true);
- assertTrue(spf.getFeature(VALIDATION));
-
- spf.setFeature(VALIDATION, false);
- assertFalse(spf.getFeature(VALIDATION));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
-
+ public void testFeature06() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setFeature(VALIDATION, true);
+ assertTrue(spf.getFeature(VALIDATION));
+ spf.setFeature(VALIDATION, false);
+ assertFalse(spf.getFeature(VALIDATION));
}
/**
- * Testcase to test the functionality of getFeature method for
+ * Test the functionality of getFeature method for
* external-general-entities property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature07() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- assertTrue(spf.getFeature(EXTERNAL_G_ENTITIES));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
+ public void testFeature07() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ assertTrue(spf.getFeature(EXTERNAL_G_ENTITIES));
+ }
+ /**
+ * Test the functionality of setFeature and getFeature methods
+ * for external-general-entities property.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testFeature08() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setFeature(EXTERNAL_G_ENTITIES, false);
+ assertFalse(spf.getFeature(EXTERNAL_G_ENTITIES));
}
/**
- * Testcase to test the functionality of setFeature and getFeature methods
- * for external-general-entities property.
+ * Test the functionality of getFeature method for
+ * external-parameter-entities property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature08() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setFeature(EXTERNAL_G_ENTITIES, false);
- assertFalse(spf.getFeature(EXTERNAL_G_ENTITIES));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
+ public void testFeature09() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ assertTrue(spf.getFeature(EXTERNAL_P_ENTITIES));
}
/**
- * Testcase to test the functionality of getFeature method for
- * external-parameter-entities property.
+ * Test the functionality of setFeature method for
+ * external-parameter-entitie property.
+ * @throws Exception If any errors occur.
*/
@Test
- public void testFeature09() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- assertTrue(spf.getFeature(EXTERNAL_P_ENTITIES));
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase to test the functionality of setFeature method for
- * external-parameter-entitie property.
- */
- @Test
- public void testFeature10() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setFeature(EXTERNAL_P_ENTITIES, false);
- } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) {
- failUnexpected(e);
- }
-
+ public void testFeature10() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setFeature(EXTERNAL_P_ENTITIES, false);
+ assertFalse(spf.getFeature(EXTERNAL_P_ENTITIES));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,16 +23,14 @@
package javax.xml.parsers.ptests;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-
import java.io.File;
import java.io.FileInputStream;
+import java.io.FilePermission;
import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
-
+import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.xml.sax.HandlerBase;
@@ -43,16 +41,15 @@
/**
* Class contains the test cases for SAXParser API
*/
-public class SAXParserTest {
-
+public class SAXParserTest extends JAXPFileReadOnlyBaseTest {
/**
* Provide SAXParser.
*
- * @throws SAXException
- * @throws ParserConfigurationException
+ * @return a data provider contains a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
@DataProvider(name = "parser-provider")
- public Object[][] getParser() throws ParserConfigurationException, SAXException {
+ public Object[][] getParser() throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxparser = spf.newSAXParser();
return new Object[][] { { saxparser } };
@@ -62,498 +59,454 @@
* Test case with FileInputStream null, parsing should fail and throw
* IllegalArgumentException.
*
- * @throws IllegalArgumentException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse01(SAXParser saxparser) throws IllegalArgumentException {
- try {
- FileInputStream instream = null;
- HandlerBase handler = new HandlerBase();
- saxparser.parse(instream, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse01(SAXParser saxparser) throws Exception {
+ FileInputStream instream = null;
+ saxparser.parse(instream, new HandlerBase());
}
/**
- * Testcase with an error in xml file, parsing should fail and throw
- * SAXException.
+ * Test with by setting URI as null, parsing should fail and throw
+ * IllegalArgumentException.
*
- * @throws SAXException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse02(SAXParser saxparser) throws SAXException {
- try {
- HandlerBase handler = new HandlerBase();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml"));
- saxparser.parse(instream, handler);
- } catch (IOException e) {
- failUnexpected(e);
- }
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse02(SAXParser saxparser) throws Exception {
+ String uri = null;
+ saxparser.parse(uri, new HandlerBase());
}
/**
- * Testcase with a valid in xml file, parser should parse the xml document.
+ * Test with non-existence URI, parsing should fail and throw IOException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse03(SAXParser saxparser) {
+ @Test(expectedExceptions = { SAXException.class },
+ dataProvider = "parser-provider")
+ public void testParse03(SAXParser saxparser) throws Exception {
+ String workingDir = getSystemProperty("user.dir");
+ setPermissions(new FilePermission(workingDir, "read"));
try {
- HandlerBase handler = new HandlerBase();
- saxparser.parse(new File(TestUtils.XML_DIR, "parsertest.xml"), handler);
- } catch (IOException | SAXException e) {
- failUnexpected(e);
+ saxparser.parse("", new HandlerBase());
+ } finally {
+ setPermissions();
}
}
/**
- * Testcase with valid input stream, parser should parse the xml document
- * successfully.
+ * Test with File null, parsing should fail and throw
+ * IllegalArgumentException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse04(SAXParser saxparser) {
- try {
- HandlerBase handler = new HandlerBase();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml"));
- saxparser.parse(instream, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse04(SAXParser saxparser) throws Exception {
+ File file = null;
+ saxparser.parse(file, new HandlerBase());
}
/**
- * Testcase with valid input source, parser should parse the xml document
- * successfully.
+ * Test with empty string as File, parsing should fail and throw
+ * SAXException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse05(SAXParser saxparser) {
+ @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
+ public void testParse05(SAXParser saxparser) throws Exception {
+ String workingDir = getSystemProperty("user.dir");
+ setPermissions(new FilePermission(workingDir, "read"));
try {
- HandlerBase handler = new HandlerBase();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "parsertest.xml"));
- saxparser.parse(instream, handler, new File(TestUtils.XML_DIR).toURI().toASCIIString());
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase with uri null, parsing should fail and throw
- * IllegalArgumentException.
- *
- * @throws IllegalArgumentException
- */
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse07(SAXParser saxparser) throws IllegalArgumentException {
- try {
- String uri = null;
- HandlerBase handler = new HandlerBase();
- saxparser.parse(uri, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ saxparser.parse(new File(""), new HandlerBase());
+ } finally {
+ setPermissions();
}
}
/**
- * Testcase with non-existant uri, parsing should fail and throw
- * IOException.
+ * Test with input source null, parsing should fail and throw
+ * IllegalArgumentException.
*
- * @throws SAXException
- * @throws IOException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = { SAXException.class, IOException.class }, dataProvider = "parser-provider")
- public void testParse08(SAXParser saxparser) throws SAXException, IOException {
- String uri = " ";
-
- HandlerBase handler = new HandlerBase();
- saxparser.parse(uri, handler);
-
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse06(SAXParser saxparser) throws Exception {
+ InputSource is = null;
+ saxparser.parse(is, new HandlerBase());
}
/**
- * Testcase with proper uri, parser should parse successfully.
+ * Test with FileInputStream null, parsing should fail and throw
+ * IllegalArgumentException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse09(SAXParser saxparser) {
- try {
- File file = new File(TestUtils.XML_DIR, "correct.xml");
- HandlerBase handler = new HandlerBase();
- saxparser.parse(file.toURI().toASCIIString(), handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse07(SAXParser saxparser) throws Exception {
+ FileInputStream instream = null;
+ saxparser.parse(instream, new DefaultHandler());
}
/**
- * Testcase with File null, parsing should fail and throw
+ * Test with URI null, parsing should fail and throw
* IllegalArgumentException.
*
- * @throws IllegalArgumentException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse10(SAXParser saxparser) throws IllegalArgumentException {
- try {
- File file = null;
- HandlerBase handler = new HandlerBase();
- saxparser.parse(file, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse08(SAXParser saxparser) throws Exception {
+ String uri = null;
+ saxparser.parse(uri, new DefaultHandler());
}
/**
- * Testcase with empty string as File, parsing should fail and throw
- * SAXException.
+ * Test with non-existence URI, parsing should fail and throw
+ * SAXException or IOException.
*
- * @throws SAXException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse11(SAXParser saxparser) throws SAXException {
+ @Test(expectedExceptions = { SAXException.class, IOException.class },
+ dataProvider = "parser-provider")
+ public void testParse09(SAXParser saxparser) throws Exception {
+ String workingDir = getSystemProperty("user.dir");
+ setPermissions(new FilePermission(workingDir + "/../-", "read"));
+ String uri = " ";
try {
- HandlerBase handler = new HandlerBase();
- File file = new File("");
- saxparser.parse(file, handler);
- } catch (IOException e) {
- failUnexpected(e);
+ saxparser.parse(uri, new DefaultHandler());
+ } finally {
+ setPermissions();
}
}
/**
- * Testcase with xml file that has errors parsing should fail and throw
+ * Test with empty string as File, parsing should fail and throw
* SAXException.
*
- * @throws SAXException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse12(SAXParser saxparser) throws SAXException {
+ public void testParse10(SAXParser saxparser) throws Exception {
+ String workingDir = getSystemProperty("user.dir");
+ setPermissions(new FilePermission(workingDir, "read"));
+ File file = new File("");
try {
- HandlerBase handler = new HandlerBase();
- File file = new File(TestUtils.XML_DIR, "valid.xml");
- saxparser.parse(file, handler);
- } catch (IOException e) {
- failUnexpected(e);
+ saxparser.parse(file, new DefaultHandler());
+ } finally {
+ setPermissions();
}
}
/**
- * Testcase with xml file that has no errors Parser should successfully
- * parse the xml document.
+ * Test with File null, parsing should fail and throw
+ * IllegalArgumentException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse13(SAXParser saxparser) {
- try {
- HandlerBase handler = new HandlerBase();
- File file = new File(TestUtils.XML_DIR, "correct.xml");
- saxparser.parse(file, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
-
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse11(SAXParser saxparser) throws Exception {
+ saxparser.parse((File) null, new DefaultHandler());
}
/**
- * Testcase with input source null, parsing should fail and throw
+ * Test with input source null, parsing should fail and throw
* IllegalArgumentException.
*
- * @throws IllegalArgumentException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse14(SAXParser saxparser) throws IllegalArgumentException {
- try {
- InputSource is = null;
- HandlerBase handler = new HandlerBase();
- saxparser.parse(is, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(expectedExceptions = IllegalArgumentException.class,
+ dataProvider = "parser-provider")
+ public void testParse12(SAXParser saxparser) throws Exception {
+ InputSource is = null;
+ saxparser.parse(is, new DefaultHandler());
+ }
+
+ /**
+ * Test with an error in XML file, parsing should fail and throw
+ * SAXException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class,
+ dataProvider = "parser-provider")
+ public void testParse13(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(new File(
+ XML_DIR, "invalid.xml"))) {
+ saxparser.parse(instream, new HandlerBase());
}
}
/**
- * Testcase with input source attached an invaild xml, parsing should fail
- * and throw SAXException.
+ * Test with a valid in XML file, parser should parse the XML document.
*
- * @throws SAXException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse15(SAXParser saxparser) throws SAXException {
- try {
- HandlerBase handler = new HandlerBase();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml"));
- InputSource is = new InputSource(instream);
- saxparser.parse(is, handler);
- } catch (IOException e) {
- failUnexpected(e);
- }
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse14(SAXParser saxparser) throws Exception {
+ saxparser.parse(new File(XML_DIR, "parsertest.xml"),
+ new HandlerBase());
}
/**
- * Testcase with input source attached an vaild xml, parser should
- * successfully parse the xml document.
+ * Test with valid input stream, parser should parse the XML document
+ * successfully.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse16(SAXParser saxparser) {
- try {
- HandlerBase handler = new HandlerBase();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml"));
- InputSource is = new InputSource(instream);
- saxparser.parse(is, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse15(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(new File(XML_DIR,
+ "correct.xml"))) {
+ saxparser.parse(instream, new HandlerBase());
}
}
/**
- * Testcase with FileInputStream null, parsing should fail and throw
- * IllegalArgumentException.
+ * Test with valid input source, parser should parse the XML document
+ * successfully.
*
- * @throws IllegalArgumentException
- */
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse17(SAXParser saxparser) throws IllegalArgumentException {
- try {
- FileInputStream instream = null;
- DefaultHandler handler = new DefaultHandler();
- saxparser.parse(instream, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase with an error in xml file, parsing should fail and throw
- * SAXException.
- *
- * @throws SAXException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse18(SAXParser saxparser) throws SAXException {
- try {
- DefaultHandler handler = new DefaultHandler();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml"));
- saxparser.parse(instream, handler);
- } catch (IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase with valid input stream, parser should parse the xml document
- * successfully.
- */
- @Test(dataProvider = "parser-provider")
- public void testParse19(SAXParser saxparser) {
- try {
- DefaultHandler handler = new DefaultHandler();
- saxparser.parse(new File(TestUtils.XML_DIR, "parsertest.xml"), handler);
- } catch (IOException | SAXException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse16(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(
+ new File(XML_DIR, "parsertest.xml"))) {
+ saxparser.parse(instream, new HandlerBase(),
+ new File(XML_DIR).toURI().toASCIIString());
}
}
/**
- * Testcase with valid input stream, parser should parse the xml document
- * successfully.
+ * Test with proper URI, parser should parse successfully.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse17(SAXParser saxparser) throws Exception {
+ File file = new File(XML_DIR, "correct.xml");
+ saxparser.parse(file.toURI().toASCIIString(), new HandlerBase());
+ }
+
+ /**
+ * Test with XML file that has errors parsing should fail and throw
+ * SAXException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse20(SAXParser saxparser) {
- try {
- DefaultHandler handler = new DefaultHandler();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml"));
- saxparser.parse(instream, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class,
+ dataProvider = "parser-provider")
+ public void testParse18(SAXParser saxparser) throws Exception {
+ saxparser.parse(new File(XML_DIR, "valid.xml"), new HandlerBase());
+ }
+
+ /**
+ * Test with XML file that has no errors Parser should successfully
+ * parse the XML document.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse19(SAXParser saxparser) throws Exception {
+ saxparser.parse(new File(XML_DIR, "correct.xml"), new HandlerBase());
+ }
+
+ /**
+ * Test with input source attached an invalid XML, parsing should fail
+ * and throw SAXException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class,
+ dataProvider = "parser-provider")
+ public void testParse20(SAXParser saxparser) throws Exception {
+ try(FileInputStream instream = new FileInputStream(new File(XML_DIR,
+ "invalid.xml"))) {
+ saxparser.parse(new InputSource(instream), new HandlerBase());
}
}
/**
- * Testcase with valid input source, parser should parse the xml document
- * successfully.
+ * Test with input source attached an valid XML, parser should
+ * successfully parse the XML document.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse21(SAXParser saxparser) {
- try {
- DefaultHandler handler = new DefaultHandler();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "parsertest.xml"));
- saxparser.parse(instream, handler, new File(TestUtils.XML_DIR).toURI().toASCIIString());
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
-
- }
-
- /**
- * Testcase with uri null, parsing should fail and throw
- * IllegalArgumentException.
- *
- * @throws IllegalArgumentException
- */
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse23(SAXParser saxparser) throws IllegalArgumentException {
- try {
- String uri = null;
- DefaultHandler handler = new DefaultHandler();
- saxparser.parse(uri, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse21(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(new File(XML_DIR,
+ "correct.xml"))) {
+ saxparser.parse(new InputSource(instream), new HandlerBase());
}
}
/**
- * Testcase with non-existant uri, parsing should fail and throw
- * SAXException or IOException.
+ * Test with an error in xml file, parsing should fail and throw
+ * SAXException.
*
- * @throws SAXException
- * @throws IOException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = { SAXException.class, IOException.class }, dataProvider = "parser-provider")
- public void testParse24(SAXParser saxparser) throws SAXException, IOException {
- String uri = " ";
- DefaultHandler handler = new DefaultHandler();
- saxparser.parse(uri, handler);
-
- }
-
- /**
- * Testcase with proper uri, parser should parse successfully.
- */
- @Test(dataProvider = "parser-provider")
- public void testParse25(SAXParser saxparser) {
- try {
- File file = new File(TestUtils.XML_DIR, "correct.xml");
-
- DefaultHandler handler = new DefaultHandler();
- saxparser.parse(file.toURI().toASCIIString(), handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class,
+ dataProvider = "parser-provider")
+ public void testParse22(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(
+ new File(XML_DIR, "invalid.xml"))) {
+ saxparser.parse(instream, new DefaultHandler());
}
}
/**
- * Testcase with File null, parsing should fail and throw
- * IllegalArgumentException.
+ * Test with valid input stream, parser should parse the XML document
+ * successfully.
*
- * @throws IllegalArgumentException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse26(SAXParser saxparser) throws IllegalArgumentException {
- try {
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse23(SAXParser saxparser) throws Exception {
+ DefaultHandler handler = new DefaultHandler();
+ saxparser.parse(new File(XML_DIR, "parsertest.xml"), handler);
+ }
+
+ /**
+ * Test with valid input stream, parser should parse the XML document
+ * successfully.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse24(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(new File(XML_DIR,
+ "correct.xml"))) {
DefaultHandler handler = new DefaultHandler();
- saxparser.parse((File) null, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ saxparser.parse(instream, handler);
}
}
/**
- * Testcase with empty string as File, parsing should fail and throw
- * SAXException.
+ * Test with valid input source, parser should parse the XML document
+ * successfully.
*
- * @throws SAXException
- */
- @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse27(SAXParser saxparser) throws SAXException {
- try {
- DefaultHandler handler = new DefaultHandler();
- File file = new File("");
- saxparser.parse(file, handler);
- } catch (IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase with xml file that has errors, parsing should fail and throw
- * SAXException.
- *
- * @throws SAXException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse28(SAXParser saxparser) throws SAXException {
- try {
- DefaultHandler handler = new DefaultHandler();
- File file = new File(TestUtils.XML_DIR, "valid.xml");
- saxparser.parse(file, handler);
- } catch (IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Testcase with xml file that has no errors, parser should successfully
- * parse the xml document.
- */
- @Test(dataProvider = "parser-provider")
- public void testParse29(SAXParser saxparser) {
- try {
- DefaultHandler handler = new DefaultHandler();
- File file = new File(TestUtils.XML_DIR, "correct.xml");
- saxparser.parse(file, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse25(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(
+ new File(XML_DIR, "parsertest.xml"))) {
+ saxparser.parse(instream, new DefaultHandler(),
+ new File(XML_DIR).toURI().toASCIIString());
}
}
/**
- * Testcase with input source null, parsing should fail and throw
- * IllegalArgumentException.
+ * Test with proper URI, parser should parse successfully.
*
- * @throws IllegalArgumentException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse26(SAXParser saxparser) throws Exception {
+ File file = new File(XML_DIR, "correct.xml");
+ saxparser.parse(file.toURI().toASCIIString(), new DefaultHandler());
+ }
+
+ /**
+ * Test with XML file that has errors, parsing should fail and throw
+ * SAXException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider")
- public void testParse30(SAXParser saxparser) throws IllegalArgumentException {
- try {
- InputSource is = null;
- DefaultHandler handler = new DefaultHandler();
- saxparser.parse(is, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class,
+ dataProvider = "parser-provider")
+ public void testParse27(SAXParser saxparser) throws Exception {
+ saxparser.parse(new File(XML_DIR, "valid.xml"), new DefaultHandler());
+ }
+
+ /**
+ * Test with XML file that has no errors, parser should successfully
+ * parse the XML document.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse28(SAXParser saxparser) throws Exception {
+ saxparser.parse(new File(XML_DIR, "correct.xml"), new DefaultHandler());
+ }
+
+ /**
+ * Test with an invalid XML file, parser should throw SAXException.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class,
+ dataProvider = "parser-provider")
+ public void testParse29(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(
+ new File(XML_DIR, "invalid.xml"))) {
+ saxparser.parse(new InputSource(instream), new DefaultHandler());
}
}
/**
- * Testcase with an invalid xml file, parser should throw SAXException.
+ * Test case to parse an XML file that not use namespaces.
*
- * @throws SAXException
+ * @param saxparser a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
- public void testParse31(SAXParser saxparser) throws SAXException {
- try {
- DefaultHandler handler = new DefaultHandler();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml"));
- InputSource is = new InputSource(instream);
- saxparser.parse(is, handler);
- } catch (IOException e) {
- failUnexpected(e);
+ @Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
+ public void testParse30(SAXParser saxparser) throws Exception {
+ try (FileInputStream instream = new FileInputStream(
+ new File(XML_DIR, "correct.xml"))) {
+ saxparser.parse(new InputSource(instream), new DefaultHandler());
}
}
/**
- * Test case to parse an xml file that not use namespaces.
+ * Test case to parse an XML file that uses namespaces.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "parser-provider")
- public void testParse32(SAXParser saxparser) {
- try {
- DefaultHandler handler = new DefaultHandler();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml"));
- InputSource is = new InputSource(instream);
- saxparser.parse(is, handler);
- } catch (SAXException | IOException e) {
- failUnexpected(e);
- }
- }
-
- /**
- * Test case to parse an xml file that uses namespaces.
- */
- @Test
- public void testParse33() {
- try {
+ @Test(groups = {"readLocalFiles"})
+ public void testParse31() throws Exception {
+ try (FileInputStream instream = new FileInputStream(
+ new File(XML_DIR, "ns4.xml"))) {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
- SAXParser saxparser = spf.newSAXParser();
- HandlerBase handler = new HandlerBase();
- FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "ns4.xml"));
- saxparser.parse(instream, handler);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
+ spf.newSAXParser().parse(instream, new HandlerBase());
}
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest02.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest02.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,260 +23,239 @@
package javax.xml.parsers.ptests;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
-
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
-
+import jaxp.library.JAXPBaseTest;
+import static org.testng.Assert.assertNotNull;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
-import org.xml.sax.Parser;
import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
-import org.xml.sax.XMLReader;
import org.xml.sax.ext.DeclHandler;
import org.xml.sax.ext.LexicalHandler;
/**
* Class contains the test cases for SAXParser API
*/
-public class SAXParserTest02 {
- final String DOM_NODE = "http://xml.org/sax/properties/dom-node";
- final String XML_STRING = "http://xml.org/sax/properties/xml-string";
- final String DECL_HANDLER = "http://xml.org/sax/properties/declaration-handler";
- final String LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler";
+public class SAXParserTest02 extends JAXPBaseTest {
+ private static final String DOM_NODE = "http://xml.org/sax/properties/dom-node";
+ private static final String XML_STRING = "http://xml.org/sax/properties/xml-string";
+ private static final String DECL_HANDLER = "http://xml.org/sax/properties/declaration-handler";
+ private static final String LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler";
/**
* Provide SAXParser.
*
- * @throws SAXException
- * @throws ParserConfigurationException
+ * @return a data provider contains a SAXParser instance.
+ * @throws Exception If any errors occur.
*/
@DataProvider(name = "parser-provider")
- public Object[][] getParser() throws ParserConfigurationException, SAXException {
+ public Object[][] getParser() throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxparser = spf.newSAXParser();
return new Object[][] { { saxparser } };
}
/**
- * Testcase to test the default functionality (No validation) of the parser.
+ * Test to test the default functionality (No validation) of the parser.
+ *
+ * @param saxparser a SAXParser instance.
*/
@Test(dataProvider = "parser-provider")
public void testValidate01(SAXParser saxparser) {
- try {
- assertFalse(saxparser.isValidating());
- } catch (FactoryConfigurationError e) {
- failUnexpected(e);
- }
-
+ assertFalse(saxparser.isValidating());
}
/**
- * Testcase to test the functionality of setValidating and isvalidating
+ * Test to test the functionality of setValidating and isValidating
* methods.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testValidate02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setValidating(true);
- spf.newSAXParser();
- assertTrue(spf.isValidating());
- } catch (FactoryConfigurationError | ParserConfigurationException | SAXException e) {
- failUnexpected(e);
- }
-
+ public void testValidate02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setValidating(true);
+ spf.newSAXParser();
+ assertTrue(spf.isValidating());
}
/**
- * Test case to test isNamespaceAware() method. By default, namespaces are
+ * Test isNamespaceAware() method. By default, namespaces are
* not supported.
+ *
+ * @param saxparser a SAXParser instance.
*/
@Test(dataProvider = "parser-provider")
public void testNamespace01(SAXParser saxparser) {
- try {
- assertFalse(saxparser.isNamespaceAware());
- } catch (FactoryConfigurationError e) {
- failUnexpected(e);
- }
-
+ assertFalse(saxparser.isNamespaceAware());
}
/**
* Test case to test setnamespaceAware() method.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testNamespace02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxparser = spf.newSAXParser();
- assertTrue(saxparser.isNamespaceAware());
- } catch (FactoryConfigurationError | ParserConfigurationException | SAXException e) {
- failUnexpected(e);
- }
-
+ public void testNamespace02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ SAXParser saxparser = spf.newSAXParser();
+ assertTrue(saxparser.isNamespaceAware());
}
/**
* Test case to test if the getParser() method returns instance of Parser.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
@Test(dataProvider = "parser-provider")
- public void testParser01(SAXParser saxparser) {
- try {
- Parser parser = saxparser.getParser();
- } catch (FactoryConfigurationError | SAXException e) {
- failUnexpected(e);
- }
-
+ public void testParser01(SAXParser saxparser) throws SAXException {
+ assertNotNull(saxparser.getParser());
}
/**
* Test case to test if the getXMLReader() method returns instance of
* XMLReader.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
@Test(dataProvider = "parser-provider")
- public void testXmlReader01(SAXParser saxparser) {
- try {
- XMLReader xmlReader = saxparser.getXMLReader();
- } catch (FactoryConfigurationError | SAXException e) {
- failUnexpected(e);
- }
+ public void testXmlReader01(SAXParser saxparser) throws SAXException {
+ assertNotNull(saxparser.getXMLReader());
}
/**
* Test whether the xml-string property is not supported.
*
- * @throws SAXNotSupportedException
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
- @Test(expectedExceptions = SAXNotSupportedException.class, dataProvider = "parser-provider")
- public void testProperty01(SAXParser saxparser) throws SAXNotSupportedException {
- try {
- Object object = saxparser.getProperty(XML_STRING);
- } catch (SAXNotRecognizedException e) {
- failUnexpected(e);
- }
+ @Test(expectedExceptions = SAXNotSupportedException.class,
+ dataProvider = "parser-provider")
+ public void testProperty01(SAXParser saxparser) throws SAXException {
+ saxparser.getProperty(XML_STRING);
}
/**
* Test whether the dom-node property is not supported.
*
- * @throws SAXNotSupportedException
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
- @Test(expectedExceptions = SAXNotSupportedException.class, dataProvider = "parser-provider")
- public void testProperty02(SAXParser saxparser) throws SAXNotSupportedException {
- try {
- Object object = saxparser.getProperty(DOM_NODE);
- } catch (SAXNotRecognizedException e) {
- failUnexpected(e);
- }
+ @Test(expectedExceptions = SAXNotSupportedException.class,
+ dataProvider = "parser-provider")
+ public void testProperty02(SAXParser saxparser) throws SAXException {
+ saxparser.getProperty(DOM_NODE);
}
/**
* Test the default lexical-handler not exists.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
@Test(dataProvider = "parser-provider")
- public void testProperty03(SAXParser saxparser) {
- try {
- assertNull(saxparser.getProperty(LEXICAL_HANDLER));
- } catch (SAXException e) {
- failUnexpected(e);
- }
-
+ public void testProperty03(SAXParser saxparser) throws SAXException {
+ assertNull(saxparser.getProperty(LEXICAL_HANDLER));
}
/**
* Test the default declaration-handler not exists.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
@Test(dataProvider = "parser-provider")
- public void testProperty04(SAXParser saxparser) {
-
- try {
- assertNull(saxparser.getProperty(DECL_HANDLER));
- } catch (SAXException e) {
- failUnexpected(e);
- }
+ public void testProperty04(SAXParser saxparser) throws SAXException {
+ assertNull(saxparser.getProperty(DECL_HANDLER));
}
/**
* Test to set and get the lexical-handler.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
@Test(dataProvider = "parser-provider")
- public void testProperty05(SAXParser saxparser) {
- try {
- MyLexicalHandler myLexicalHandler = new MyLexicalHandler();
- saxparser.setProperty(LEXICAL_HANDLER, myLexicalHandler);
- Object object = saxparser.getProperty(LEXICAL_HANDLER);
- assertTrue(object instanceof LexicalHandler);
- } catch (SAXException e) {
- failUnexpected(e);
- }
+ public void testProperty05(SAXParser saxparser) throws SAXException {
+ MyLexicalHandler myLexicalHandler = new MyLexicalHandler();
+ saxparser.setProperty(LEXICAL_HANDLER, myLexicalHandler);
+ assertTrue(saxparser.getProperty(LEXICAL_HANDLER) instanceof LexicalHandler);
}
/**
* Test to set and get the declaration-handler.
+ *
+ * @param saxparser a SAXParser instance.
+ * @throws SAXException If any parse errors occur.
*/
@Test(dataProvider = "parser-provider")
- public void testProperty06(SAXParser saxparser) {
- try {
- MyDeclHandler myDeclHandler = new MyDeclHandler();
- saxparser.setProperty(DECL_HANDLER, myDeclHandler);
- Object object = saxparser.getProperty(DECL_HANDLER);
- assertTrue(object instanceof DeclHandler);
- } catch (SAXException e) {
- failUnexpected(e);
- }
-
+ public void testProperty06(SAXParser saxparser) throws SAXException {
+ MyDeclHandler myDeclHandler = new MyDeclHandler();
+ saxparser.setProperty(DECL_HANDLER, myDeclHandler);
+ assertTrue(saxparser.getProperty(DECL_HANDLER) instanceof DeclHandler);
}
/**
- * Customized LexicalHandler used for test.
+ * Customized LexicalHandler used for test. An empty implementation for
+ * LexicalHandler.
*/
private class MyLexicalHandler implements LexicalHandler {
+ @Override
public void comment(char[] ch, int start, int length) {
}
+ @Override
public void endCDATA() {
}
+ @Override
public void endDTD() {
}
+ @Override
public void endEntity(String name) {
}
+ @Override
public void startCDATA() {
}
+ @Override
public void startDTD(String name, String publicId, String systemId) {
}
+ @Override
public void startEntity(String name) {
}
}
/**
- * Customized DeclHandler used for test.
+ * Customized DeclHandler used for test. An empty implementation for
+ * DeclHandler.
*/
private class MyDeclHandler implements DeclHandler {
+ @Override
public void attributeDecl(String eName, String aName, String type, String valueDefault, String value) {
}
+ @Override
public void elementDecl(String name, String model) {
}
+ @Override
public void externalEntityDecl(String name, String publicId, String systemId) {
}
+ @Override
public void internalEntityDecl(String name, String value) {
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest03.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest03.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,17 +23,17 @@
package javax.xml.parsers.ptests;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
-
import java.io.File;
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
+import java.io.FilePermission;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
-
+import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
+import static org.testng.Assert.fail;
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.BeforeGroups;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
@@ -41,68 +41,70 @@
/**
* Class contains the test cases for SAXParser API
*/
-public class SAXParserTest03 {
+public class SAXParserTest03 extends JAXPFileReadOnlyBaseTest {
/**
* Provide SAXParserFactory.
*
- * @throws Exception
+ * @return a dimensional contains.
*/
@DataProvider(name = "input-provider")
public Object[][] getFactory() {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setValidating(true);
- MyErrorHandler handler = MyErrorHandler.newInstance();
- return new Object[][] { { spf, handler } };
+ return new Object[][] { { spf, MyErrorHandler.newInstance() } };
}
/**
* parsertest.xml holds a valid document. This method tests the validating
* parser.
+ *
+ * @param spf a Parser factory.
+ * @param handler an error handler for capturing events.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "input-provider")
- public void testParseValidate01(SAXParserFactory spf, MyErrorHandler handler) {
- try {
- SAXParser saxparser = spf.newSAXParser();
- saxparser.parse(new File(TestUtils.XML_DIR, "parsertest.xml"), handler);
- assertFalse(handler.errorOccured);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ @Test(groups = {"readLocalFiles"}, dataProvider = "input-provider")
+ public void testParseValidate01(SAXParserFactory spf, MyErrorHandler handler)
+ throws Exception {
+ spf.newSAXParser().parse(new File(XML_DIR, "parsertest.xml"), handler);
+ assertFalse(handler.isErrorOccured());
}
/**
* validns.xml holds a valid document with XML namespaces in it. This method
* tests the Validating parser with namespace processing on.
+ *
+ * @param spf a Parser factory.
+ * @param handler an error handler for capturing events.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "input-provider")
- public void testParseValidate02(SAXParserFactory spf, MyErrorHandler handler) {
- try {
+ @Test(groups = {"readLocalFiles"}, dataProvider = "input-provider")
+ public void testParseValidate02(SAXParserFactory spf, MyErrorHandler handler)
+ throws Exception {
spf.setNamespaceAware(true);
- SAXParser saxparser = spf.newSAXParser();
- saxparser.parse(new File(TestUtils.XML_DIR, "validns.xml"), handler);
- assertFalse(handler.errorOccured);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ spf.newSAXParser().parse(new File(XML_DIR, "validns.xml"), handler);
+ assertFalse(handler.isErrorOccured());
}
/**
* invalidns.xml holds an invalid document with XML namespaces in it. This
* method tests the validating parser with namespace processing on. It
* should throw validation error.
+ *
+ * @param spf a Parser factory.
+ * @param handler an error handler for capturing events.
+ * @throws Exception If any errors occur.
*/
- @Test(dataProvider = "input-provider")
- public void testParseValidate03(SAXParserFactory spf, MyErrorHandler handler) {
+ @Test(groups = {"readLocalFiles"}, dataProvider = "input-provider")
+ public void testParseValidate03(SAXParserFactory spf, MyErrorHandler handler)
+ throws Exception {
try {
spf.setNamespaceAware(true);
SAXParser saxparser = spf.newSAXParser();
- saxparser.parse(new File(TestUtils.XML_DIR, "invalidns.xml"), handler);
- failUnexpected(new RuntimeException());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- if (e instanceof SAXException) {
- assertTrue(handler.errorOccured);
- }
+ saxparser.parse(new File(XML_DIR, "invalidns.xml"), handler);
+ fail("Expecting SAXException here");
+ } catch (SAXException e) {
+ assertTrue(handler.isErrorOccured());
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/TestUtils.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,200 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.parsers.ptests;
-
-import static jaxp.library.JAXPTestUtilities.ERROR_MSG_HEADER;
-import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.helpers.LocatorImpl;
-
-/**
- * Utility interface which includes final variables of xml, golden file
- * directories.
- */
-interface TestUtils {
- final String XML_DIR = System.getProperty("test.src", ".") + FILE_SEP + "javax/xml/parsers/xmlfiles";
- final String GOLDEN_DIR = XML_DIR + FILE_SEP + "out";
-}
-
-/**
- * Customized DefaultHandler which writes output document when methods are
- * called by Transformer. Test may use output document to compare with golden
- * file for verification.
- */
-class MyCHandler extends DefaultHandler {
-
- private final BufferedWriter bWriter;
- private final Locator locator = new LocatorImpl();
-
- private MyCHandler(File file) throws IOException {
- bWriter = new BufferedWriter(new FileWriter(file));
- }
-
- public static MyCHandler newInstance(File file) throws IOException {
- MyCHandler handler = new MyCHandler(file);
- return handler;
- }
-
- public void characters(char[] ch, int start, int length) {
- String s = new String(ch, start, length);
- String str = String.format("characters...length is:%d\n<%s>", s.length(), s);
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void endDocument() {
- String str = "endDocument...";
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- bWriter.flush();
- bWriter.close();
-
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void endElement(String namespaceURI, String localName, String qName) {
- String str = String.format("endElement...\nnamespaceURI: <%s> localName: <%s> qName: <%s>", namespaceURI, localName, qName);
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void endPrefixMapping(String prefix) {
- String str = String.format("endPrefixMapping...\nprefix: <%s>", prefix);
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void ignorableWhitespace(char[] ch, int start, int length) {
- String s = new String(ch, start, length);
- String str = String.format("ignorableWhitespace...\n%s ignorable white space string length: %d", s, s.length());
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void processingInstruction(String target, String data) {
- String str = String.format("processingInstruction...target:<%s> data: <%s>", target, data);
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void skippedEntity(String name) {
- String str = String.format("skippedEntity...\nname: <%s>", name);
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void startDocument() {
- String str = "startDocument...";
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
- String str = String.format("startElement...\nnamespaceURI: <%s> localName: <%s> qName: <%s> Number of Attributes: <%d> Line# <%d>", namespaceURI,
- localName, qName, atts.getLength(), locator.getLineNumber());
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-
- public void startPrefixMapping(String prefix, String uri) {
- String str = String.format("startPrefixMapping...\nprefix: <%s> uri: <%s>", prefix, uri);
- try {
- bWriter.write(str, 0, str.length());
- bWriter.newLine();
- } catch (IOException e) {
- throw new RuntimeException(ERROR_MSG_HEADER, e);
- }
- }
-}
-
-/**
- * Customized DefaultHandler used for SAXParseException testing.
- */
-class MyErrorHandler extends DefaultHandler {
- boolean errorOccured = false;
-
- private MyErrorHandler() {
- }
-
- public static MyErrorHandler newInstance() {
- return new MyErrorHandler();
- }
-
- public void error(SAXParseException e) {
- errorOccured = true;
- }
-
- public void warning(SAXParseException e) {
- errorOccured = true;
- }
-
- public void fatalError(SAXParseException e) {
- errorOccured = true;
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/DOMResultTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.xml.transform.ptests;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
+import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.compareWithGold;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+import org.w3c.dom.Attr;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * DOM parse on test file to be compared with golden output file. No Exception
+ * is expected.
+ */
+public class DOMResultTest extends JAXPFileBaseTest {
+ /**
+ * Unit test for simple DOM parsing.
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase01() throws Exception {
+ String resultFile = USER_DIR + "domresult01.out";
+ String goldFile = GOLDEN_DIR + "domresult01GF.out";
+ String xsltFile = XML_DIR + "cities.xsl";
+ String xmlFile = XML_DIR + "cities.xml";
+
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory) TransformerFactory.newInstance();
+ SAXSource saxSource = new SAXSource(new InputSource(xsltFile));
+ TransformerHandler handler
+ = saxTFactory.newTransformerHandler(saxSource);
+
+ DOMResult result = new DOMResult();
+
+ handler.setResult(result);
+ reader.setContentHandler(handler);
+ reader.parse(xmlFile);
+
+ Node node = result.getNode();
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(resultFile))) {
+ writeNodes(node, writer);
+ }
+ assertTrue(compareWithGold(goldFile, resultFile));
+ }
+
+ /**
+ * Prints all node names, attributes to file
+ * @param node a node that need to be recursively access.
+ * @param bWriter file writer.
+ * @throws IOException if writing file failed.
+ */
+ private void writeNodes(Node node, BufferedWriter bWriter) throws IOException {
+ String str = "Node: " + node.getNodeName();
+ bWriter.write( str, 0,str.length());
+ bWriter.newLine();
+
+ NamedNodeMap nnm = node.getAttributes();
+ if (nnm != null && nnm.getLength() > 0)
+ for (int i=0; i<nnm.getLength(); i++) {
+ str = "AttributeName:" + ((Attr) nnm.item(i)).getName() +
+ ", AttributeValue:" +((Attr) nnm.item(i)).getValue();
+ bWriter.write( str, 0,str.length());
+ bWriter.newLine();
+ }
+
+ NodeList kids = node.getChildNodes();
+ if (kids != null)
+ for (int i=0; i<kids.getLength(); i++)
+ writeNodes(kids.item(i), bWriter);
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/DOMResultTest01.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package javax.xml.transform.ptests;
-
-import java.io.BufferedWriter;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMResult;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * DOM parse on test file to be compared with golden output file. No Exception
- * is expected.
- */
-public class DOMResultTest01 {
- /**
- * Unit test for simple DOM parsing.
- */
- @Test
- public void testcase01() {
- String resultFile = CLASS_DIR + "domresult01.out";
- String goldFile = GOLDEN_DIR + "domresult01GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory) TransformerFactory.newInstance();
- SAXSource saxSource = new SAXSource(new InputSource(xsltFile));
- TransformerHandler handler
- = saxTFactory.newTransformerHandler(saxSource);
-
- DOMResult result = new DOMResult();
-
- handler.setResult(result);
- reader.setContentHandler(handler);
- reader.parse(xmlFile);
-
- Node node = result.getNode();
- try (BufferedWriter writer = new BufferedWriter(new FileWriter(resultFile))) {
- writeNodes(node, writer);
- }
- assertTrue(compareWithGold(goldFile, resultFile));
- } catch (SAXException | TransformerConfigurationException
- | IllegalArgumentException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if(Files.exists(resultPath))
- Files.delete(resultPath);
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
- }
- }
-
- /**
- * Prints all node names, attributes to file
- * @param node a node that need to be recursively access.
- * @param bWriter file writer.
- * @throws IOException if writing file failed.
- */
- private void writeNodes(Node node, BufferedWriter bWriter) throws IOException {
- String str = "Node: " + node.getNodeName();
- bWriter.write( str, 0,str.length());
- bWriter.newLine();
-
- NamedNodeMap nnm = node.getAttributes();
- if (nnm != null && nnm.getLength() > 0)
- for (int i=0; i<nnm.getLength(); i++) {
- str = "AttributeName:" + ((Attr) nnm.item(i)).getName() +
- ", AttributeValue:" +((Attr) nnm.item(i)).getValue();
- bWriter.write( str, 0,str.length());
- bWriter.newLine();
- }
-
- NodeList kids = node.getChildNodes();
- if (kids != null)
- for (int i=0; i<kids.getLength(); i++)
- writeNodes(kids.item(i), bWriter);
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/ErrorListenerTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/ErrorListenerTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,12 +24,14 @@
package javax.xml.transform.ptests;
import java.io.File;
+import java.io.FilePermission;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
import javax.xml.transform.stream.StreamSource;
+import jaxp.library.JAXPBaseTest;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
import org.testng.annotations.Test;
@@ -37,7 +39,7 @@
/**
* Class containing the test cases for ErrorListener interface
*/
-public class ErrorListenerTest implements ErrorListener {
+public class ErrorListenerTest extends JAXPBaseTest implements ErrorListener {
/**
* Define ErrorListener's status.
*/
@@ -58,9 +60,10 @@
try {
TransformerFactory tfactory = TransformerFactory.newInstance();
tfactory.setErrorListener (listener);
+ setPermissions(new FilePermission(XML_DIR + "invalid.xsl", "read"));
tfactory.newTransformer(new StreamSource(
new File(XML_DIR + "invalid.xsl")));
- fail("We expect an Exception here");
+ fail("Expect TransformerConfigurationException here");
} catch (TransformerConfigurationException ex) {
assertEquals(listener.status, ListenerStatus.FATAL);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXSourceTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.xml.transform.ptests;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.dom.DOMSource;
+import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import org.testng.annotations.Test;
+import org.xml.sax.InputSource;
+
+
+/**
+ * Unit test for SAXSource sourceToInputSource API.
+ */
+public class SAXSourceTest extends JAXPFileReadOnlyBaseTest {
+ /**
+ * Test style-sheet file name
+ */
+ private final String TEST_FILE = XML_DIR + "cities.xsl";
+
+ /**
+ * Test obtaining a SAX InputSource object from a Source object.
+ *
+ * @throws IOException reading file error.
+ */
+ @Test(groups = {"readLocalFiles"})
+ public void source2inputsource01() throws IOException {
+ try (FileInputStream fis = new FileInputStream(TEST_FILE)) {
+ StreamSource streamSource = new StreamSource(fis);
+ assertNotNull(SAXSource.sourceToInputSource(streamSource));
+ }
+ }
+
+ /**
+ * This test case tries to get InputSource from DOMSource using
+ * sourceToInputSource method. It is not possible and hence null is
+ * expected. This is a negative test case,
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test(groups = {"readLocalFiles"})
+ public void source2inputsource02() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.newDocumentBuilder().parse(new File(TEST_FILE));
+ assertNull(SAXSource.sourceToInputSource(new DOMSource(null)));
+ }
+
+ /**
+ * This test case tries to get InputSource from SAXSource using
+ * sourceToInputSource method. This will also check if the systemId
+ * remained the same. This is a positive test case.
+ *
+ * @throws IOException reading file error.
+ */
+ @Test(groups = {"readLocalFiles"})
+ public void source2inputsource03() throws IOException {
+ String SYSTEM_ID = "file:///" + XML_DIR;
+ try (FileInputStream fis = new FileInputStream(TEST_FILE)) {
+ SAXSource saxSource =
+ new SAXSource(new InputSource(fis));
+ saxSource.setSystemId(SYSTEM_ID);
+ assertEquals(SAXSource.sourceToInputSource(saxSource).getSystemId(),
+ SYSTEM_ID);
+ }
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXSourceTest01.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package javax.xml.transform.ptests;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.stream.StreamSource;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import org.testng.annotations.Test;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-
-/**
- * Unit test for SAXSource sourceToInputSource API.
- */
-public class SAXSourceTest01 {
- /**
- * Test file name
- */
- private final String TEST_FILE = XML_DIR + "cities.xsl";
-
- /**
- * Test obtaining a SAX InputSource object from a Source object.
- */
- @Test
- public void source2inputsource01() {
- try {
- StreamSource streamSource = new StreamSource (
- new FileInputStream (TEST_FILE));
- assertNotNull(SAXSource.sourceToInputSource(streamSource));
- } catch (FileNotFoundException ex) {
- failUnexpected(ex);
- }
- }
-
- /**
- * This test case tries to get InputSource from DOMSource using
- * sourceToInputSource method. It is not possible and hence null is
- * expected. This is a negative test case
- */
- @Test
- public void source2inputsource02() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- dbf.newDocumentBuilder().parse(new File(TEST_FILE));
- assertNull(SAXSource.sourceToInputSource(new DOMSource(null)));
- } catch (ParserConfigurationException | SAXException | IOException ex) {
- failUnexpected(ex);
- }
-
- }
-
- /**
- * This test case tries to get InputSource from SAXSource using
- * sourceToInputSource method. This will also check if the systemId
- * remained the same. This is a positive test case.
- */
- @Test
- public void source2inputsource03() {
- String SYSTEM_ID = "file:///" + XML_DIR;
- try {
- SAXSource saxSource =
- new SAXSource(new InputSource(new FileInputStream(TEST_FILE)));
- saxSource.setSystemId(SYSTEM_ID);
- assertEquals(SAXSource.sourceToInputSource(saxSource).getSystemId(),
- SYSTEM_ID);
- } catch (FileNotFoundException ex) {
- failUnexpected(ex);
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,423 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package javax.xml.transform.ptests;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.Result;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
+import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TemplatesHandler;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.compareWithGold;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLFilter;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ * Test newTransformerhandler() method which takes StreamSource as argument can
+ * be set to XMLReader.
+ */
+public class SAXTFactoryTest extends JAXPFileBaseTest {
+ /**
+ * Test style-sheet file.
+ */
+ private static final String XSLT_FILE = XML_DIR + "cities.xsl";
+
+ /**
+ * Test style-sheet file.
+ */
+ private static final String XSLT_INCL_FILE = XML_DIR + "citiesinclude.xsl";
+
+ /**
+ * Test XML file.
+ */
+ private static final String XML_FILE = XML_DIR + "cities.xml";
+
+ /**
+ * SAXTFactory.newTransformerhandler() method which takes SAXSource as
+ * argument can be set to XMLReader. SAXSource has input XML file as its
+ * input source. XMLReader has a transformer handler which write out the
+ * result to output file. Test verifies output file is same as golden file.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase01() throws Exception {
+ String outputFile = USER_DIR + "saxtf001.out";
+ String goldFile = GOLDEN_DIR + "saxtf001GF.out";
+
+ try (FileOutputStream fos = new FileOutputStream(outputFile)) {
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory) TransformerFactory.newInstance();
+ TransformerHandler handler = saxTFactory.newTransformerHandler(new StreamSource(XSLT_FILE));
+ Result result = new StreamResult(fos);
+ handler.setResult(result);
+ reader.setContentHandler(handler);
+ reader.parse(XML_FILE);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * SAXTFactory.newTransformerhandler() method which takes SAXSource as
+ * argument can be set to XMLReader. SAXSource has input XML file as its
+ * input source. XMLReader has a content handler which write out the result
+ * to output file. Test verifies output file is same as golden file.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase02() throws Exception {
+ String outputFile = USER_DIR + "saxtf002.out";
+ String goldFile = GOLDEN_DIR + "saxtf002GF.out";
+
+ try (FileOutputStream fos = new FileOutputStream(outputFile);
+ FileInputStream fis = new FileInputStream(XSLT_FILE)) {
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory) TransformerFactory.newInstance();
+ SAXSource ss = new SAXSource();
+ ss.setInputSource(new InputSource(fis));
+
+ TransformerHandler handler = saxTFactory.newTransformerHandler(ss);
+ Result result = new StreamResult(fos);
+ handler.setResult(result);
+ reader.setContentHandler(handler);
+ reader.parse(XML_FILE);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Unit test for newTransformerhandler(Source). DcoumentBuilderFactory is
+ * namespace awareness, DocumentBuilder parse xslt file as DOMSource.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase03() throws Exception {
+ String outputFile = USER_DIR + "saxtf003.out";
+ String goldFile = GOLDEN_DIR + "saxtf003GF.out";
+
+ try (FileOutputStream fos = new FileOutputStream(outputFile)) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document document = docBuilder.parse(new File(XSLT_FILE));
+ Node node = (Node)document;
+ DOMSource domSource= new DOMSource(node);
+
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+ TransformerHandler handler =
+ saxTFactory.newTransformerHandler(domSource);
+ Result result = new StreamResult(fos);
+ handler.setResult(result);
+ reader.setContentHandler(handler);
+ reader.parse(XML_FILE);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Negative test for newTransformerHandler when relative URI is in XML file.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test(expectedExceptions = TransformerConfigurationException.class)
+ public void transformerHandlerTest04() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document document = docBuilder.parse(new File(XSLT_INCL_FILE));
+ DOMSource domSource= new DOMSource(document);
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+ saxTFactory.newTransformerHandler(domSource);
+ }
+
+ /**
+ * Unit test for XMLReader parsing when relative URI is used in xsl file and
+ * SystemId was set.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase05() throws Exception {
+ String outputFile = USER_DIR + "saxtf005.out";
+ String goldFile = GOLDEN_DIR + "saxtf005GF.out";
+
+ try (FileOutputStream fos = new FileOutputStream(outputFile)) {
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document document = docBuilder.parse(new File(XSLT_INCL_FILE));
+ Node node = (Node)document;
+ DOMSource domSource= new DOMSource(node);
+
+ domSource.setSystemId("file:///" + XML_DIR);
+
+ TransformerHandler handler =
+ saxTFactory.newTransformerHandler(domSource);
+ Result result = new StreamResult(fos);
+
+ handler.setResult(result);
+ reader.setContentHandler(handler);
+ reader.parse(XML_FILE);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Unit test newTransformerHandler with a DOMSource.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase06() throws Exception {
+ String outputFile = USER_DIR + "saxtf006.out";
+ String goldFile = GOLDEN_DIR + "saxtf006GF.out";
+
+ try (FileOutputStream fos = new FileOutputStream(outputFile)) {
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Node node = (Node)docBuilder.parse(new File(XSLT_INCL_FILE));
+
+ DOMSource domSource = new DOMSource(node, "file:///" + XML_DIR);
+ TransformerHandler handler =
+ saxTFactory.newTransformerHandler(domSource);
+
+ Result result = new StreamResult(fos);
+ handler.setResult(result);
+ reader.setContentHandler(handler);
+ reader.parse(XML_FILE);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Test newTransformerHandler with a Template Handler.
+ *
+ * @throws Exception If any errors occur.
+ */
+ public void testcase08() throws Exception {
+ String outputFile = USER_DIR + "saxtf008.out";
+ String goldFile = GOLDEN_DIR + "saxtf008GF.out";
+
+ try (FileOutputStream fos = new FileOutputStream(outputFile)) {
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+
+ TemplatesHandler thandler = saxTFactory.newTemplatesHandler();
+ reader.setContentHandler(thandler);
+ reader.parse(XSLT_FILE);
+ TransformerHandler tfhandler
+ = saxTFactory.newTransformerHandler(thandler.getTemplates());
+
+ Result result = new StreamResult(fos);
+ tfhandler.setResult(result);
+
+ reader.setContentHandler(tfhandler);
+ reader.parse(XML_FILE);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Test newTransformerHandler with a Template Handler along with a relative
+ * URI in the style-sheet file.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase09() throws Exception {
+ String outputFile = USER_DIR + "saxtf009.out";
+ String goldFile = GOLDEN_DIR + "saxtf009GF.out";
+
+ try (FileOutputStream fos = new FileOutputStream(outputFile)) {
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+
+ TemplatesHandler thandler = saxTFactory.newTemplatesHandler();
+ thandler.setSystemId("file:///" + XML_DIR);
+ reader.setContentHandler(thandler);
+ reader.parse(XSLT_INCL_FILE);
+ TransformerHandler tfhandler=
+ saxTFactory.newTransformerHandler(thandler.getTemplates());
+ Result result = new StreamResult(fos);
+ tfhandler.setResult(result);
+ reader.setContentHandler(tfhandler);
+ reader.parse(XML_FILE);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Unit test for contentHandler setter/getter along reader as handler's
+ * parent.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase10() throws Exception {
+ String outputFile = USER_DIR + "saxtf010.out";
+ String goldFile = GOLDEN_DIR + "saxtf010GF.out";
+ // The transformer will use a SAX parser as it's reader.
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+ XMLFilter filter =
+ saxTFactory.newXMLFilter(new StreamSource(XSLT_FILE));
+ filter.setParent(reader);
+ filter.setContentHandler(new MyContentHandler(outputFile));
+
+ // Now, when you call transformer.parse, it will set itself as
+ // the content handler for the parser object (it's "parent"), and
+ // will then call the parse method on the parser.
+ filter.parse(new InputSource(XML_FILE));
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Unit test for contentHandler setter/getter with parent.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase11() throws Exception {
+ String outputFile = USER_DIR + "saxtf011.out";
+ String goldFile = GOLDEN_DIR + "saxtf011GF.out";
+ // The transformer will use a SAX parser as it's reader.
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document document = docBuilder.parse(new File(XSLT_FILE));
+ Node node = (Node)document;
+ DOMSource domSource= new DOMSource(node);
+
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory)TransformerFactory.newInstance();
+ XMLFilter filter = saxTFactory.newXMLFilter(domSource);
+
+ filter.setParent(reader);
+ filter.setContentHandler(new MyContentHandler(outputFile));
+
+ // Now, when you call transformer.parse, it will set itself as
+ // the content handler for the parser object (it's "parent"), and
+ // will then call the parse method on the parser.
+ filter.parse(new InputSource(XML_FILE));
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Unit test for contentHandler setter/getter.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase12() throws Exception {
+ String outputFile = USER_DIR + "saxtf012.out";
+ String goldFile = GOLDEN_DIR + "saxtf012GF.out";
+ // The transformer will use a SAX parser as it's reader.
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+
+ InputSource is = new InputSource(new FileInputStream(XSLT_FILE));
+ SAXSource saxSource = new SAXSource();
+ saxSource.setInputSource(is);
+
+ SAXTransformerFactory saxTFactory = (SAXTransformerFactory)TransformerFactory.newInstance();
+ XMLFilter filter = saxTFactory.newXMLFilter(saxSource);
+
+ filter.setParent(reader);
+ filter.setContentHandler(new MyContentHandler(outputFile));
+
+ // Now, when you call transformer.parse, it will set itself as
+ // the content handler for the parser object (it's "parent"), and
+ // will then call the parse method on the parser.
+ filter.parse(new InputSource(XML_FILE));
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+
+ /**
+ * Unit test for TemplatesHandler setter/getter.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void testcase13() throws Exception {
+ String outputFile = USER_DIR + "saxtf013.out";
+ String goldFile = GOLDEN_DIR + "saxtf013GF.out";
+ try(FileInputStream fis = new FileInputStream(XML_FILE)) {
+ // The transformer will use a SAX parser as it's reader.
+ XMLReader reader = XMLReaderFactory.createXMLReader();
+
+ SAXTransformerFactory saxTFactory
+ = (SAXTransformerFactory) TransformerFactory.newInstance();
+ TemplatesHandler thandler = saxTFactory.newTemplatesHandler();
+ // I have put this as it was complaining about systemid
+ thandler.setSystemId("file:///" + USER_DIR);
+
+ reader.setContentHandler(thandler);
+ reader.parse(XSLT_FILE);
+ XMLFilter filter
+ = saxTFactory.newXMLFilter(thandler.getTemplates());
+ filter.setParent(reader);
+
+ filter.setContentHandler(new MyContentHandler(outputFile));
+ filter.parse(new InputSource(fis));
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest001.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package javax.xml.transform.ptests;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.Result;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test newTransformerhandler() method which takes StreamSource as argument can
- * be set to XMLReader.
- */
-public class SAXTFactoryTest001 {
- /**
- * SAXTFactory.newTransformerhandler() method which takes SAXSource as
- * argument can be set to XMLReader. SAXSource has input XML file as its
- * input source. XMLReader has a transformer handler which write out the
- * result to output file. Test verifies output file is same as golden file.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf001.out";
- String goldFile = GOLDEN_DIR + "saxtf001GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try (FileOutputStream fos = new FileOutputStream(outputFile)) {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory) TransformerFactory.newInstance();
- TransformerHandler handler = saxTFactory.newTransformerHandler(
- new StreamSource(xsltFile));
- Result result = new StreamResult(fos);
- handler.setResult(result);
- reader.setContentHandler(handler);
- reader.parse(xmlFile);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | TransformerConfigurationException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest002.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.Result;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test newTransformerhandler() method which takes SAXSource as argument can
- * be set to XMLReader.
- */
-public class SAXTFactoryTest002 {
- /**
- * SAXTFactory.newTransformerhandler() method which takes SAXSource as
- * argument can be set to XMLReader. SAXSource has input XML file as its
- * input source. XMLReader has a content handler which write out the result
- * to output file. Test verifies output file is same as golden file.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf002.out";
- String goldFile = GOLDEN_DIR + "saxtf002GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try (FileOutputStream fos = new FileOutputStream(outputFile);
- FileInputStream fis = new FileInputStream(xsltFile)) {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory) TransformerFactory.newInstance();
- SAXSource ss = new SAXSource();
- ss.setInputSource(new InputSource(fis));
-
- TransformerHandler handler = saxTFactory.newTransformerHandler(ss);
- Result result = new StreamResult(fos);
- handler.setResult(result);
- reader.setContentHandler(handler);
- reader.parse(xmlFile);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | IOException | TransformerConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest003.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test newTransformerhandler() method which takes DOMSource as argument can
- * be set to XMLReader.
- */
-public class SAXTFactoryTest003 {
- /**
- * Unit test for newTransformerhandler(Source). DcoumentBuilderFactory is
- * namespace awareness, DocumentBuilder parse xslt file as DOMSource.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf003.out";
- String goldFile = GOLDEN_DIR + "saxtf003GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try (FileOutputStream fos = new FileOutputStream(outputFile)) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document document = docBuilder.parse(new File(xsltFile));
- Node node = (Node)document;
- DOMSource domSource= new DOMSource(node);
-
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
- TransformerHandler handler =
- saxTFactory.newTransformerHandler(domSource);
- Result result = new StreamResult(fos);
- handler.setResult(result);
- reader.setContentHandler(handler);
- reader.parse(xmlFile);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (TransformerConfigurationException | ParserConfigurationException
- | SAXException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest004.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.File;
-import java.io.IOException;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
-
-/*
- * TransformerConfigurationException expected when there is relative URI is used
- * in citiesinclude.xsl file
- */
-public class SAXTFactoryTest004 {
- /**
- * Negative test for newTransformerHandler when relative URI is in XML file.
- * @throws TransformerConfigurationException If for some reason the
- * TransformerHandler can not be created.
- */
- @Test(expectedExceptions = TransformerConfigurationException.class)
- public void transformerHandlerTest01() throws TransformerConfigurationException {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document document = docBuilder.parse(new File(XML_DIR + "citiesinclude.xsl"));
- DOMSource domSource= new DOMSource(document);
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
- saxTFactory.newTransformerHandler(domSource);
- } catch (ParserConfigurationException | IOException | SAXException ex) {
- failUnexpected(ex);
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest005.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test SAXSource API when relative URI is used in xsl file and SystemId was set
- */
-public class SAXTFactoryTest005 {
- /**
- * Unit test for XMLReader parsing when relative URI is used in xsl file and
- * SystemId was set.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf005.out";
- String goldFile = GOLDEN_DIR + "saxtf005GF.out";
- String xsltFile = XML_DIR + "citiesinclude.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try (FileOutputStream fos = new FileOutputStream(outputFile)) {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document document = docBuilder.parse(new File(xsltFile));
- Node node = (Node)document;
- DOMSource domSource= new DOMSource(node);
-
- domSource.setSystemId("file:///" + XML_DIR);
-
- TransformerHandler handler =
- saxTFactory.newTransformerHandler(domSource);
- Result result = new StreamResult(fos);
-
- handler.setResult(result);
- reader.setContentHandler(handler);
- reader.parse(xmlFile);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (TransformerConfigurationException | ParserConfigurationException
- | SAXException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest006.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Result;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test newTransformerHandler with a DOMSource and StreamResult set.
- */
-public class SAXTFactoryTest006 extends TransformerTestConst{
- /**
- * Unit test newTransformerHandler with a DOMSource.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf006.out";
- String goldFile = GOLDEN_DIR + "saxtf006GF.out";
- String xsltFile = XML_DIR + "citiesinclude.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try (FileOutputStream fos = new FileOutputStream(outputFile)) {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
-
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Node node = (Node)docBuilder.parse(new File(xsltFile));
-
- DOMSource domSource = new DOMSource(node, "file:///" + XML_DIR);
- TransformerHandler handler =
- saxTFactory.newTransformerHandler(domSource);
-
- Result result = new StreamResult(fos);
- handler.setResult(result);
- reader.setContentHandler(handler);
- reader.parse(xmlFile);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (TransformerConfigurationException | ParserConfigurationException
- | SAXException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest008.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.Result;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test newTransformerHandler with a Template Handler.
- */
-public class SAXTFactoryTest008 {
- /**
- * Test newTransformerHandler with a Template Handler.
- */
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf008.out";
- String goldFile = GOLDEN_DIR + "saxtf008GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try (FileOutputStream fos = new FileOutputStream(outputFile)) {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
-
- TemplatesHandler thandler = saxTFactory.newTemplatesHandler();
- reader.setContentHandler(thandler);
- reader.parse(xsltFile);
- TransformerHandler tfhandler
- = saxTFactory.newTransformerHandler(thandler.getTemplates());
-
- Result result = new StreamResult(fos);
- tfhandler.setResult(result);
-
- reader.setContentHandler(tfhandler);
- reader.parse(xmlFile);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | IOException | TransformerConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest009.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.Result;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamResult;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test newTransformerHandler with a Template Handler along with a relative URI
- * in the xslt file.
- */
-public class SAXTFactoryTest009 {
- /**
- * Test newTransformerHandler with a Template Handler along with a relative
- * URI in the xslt file.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf009.out";
- String goldFile = GOLDEN_DIR + "saxtf009GF.out";
- String xsltFile = XML_DIR + "citiesinclude.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try (FileOutputStream fos = new FileOutputStream(outputFile)) {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
-
- TemplatesHandler thandler = saxTFactory.newTemplatesHandler();
- thandler.setSystemId("file:///" + XML_DIR);
- reader.setContentHandler(thandler);
- reader.parse(xsltFile);
- TransformerHandler tfhandler=
- saxTFactory.newTransformerHandler(thandler.getTemplates());
- Result result = new StreamResult(fos);
- tfhandler.setResult(result);
- reader.setContentHandler(tfhandler);
- reader.parse(xmlFile);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | IOException | TransformerConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest010.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.stream.StreamSource;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test XMLFilter parse InputSource along with customized ContentHandler.
- */
-public class SAXTFactoryTest010 {
- /**
- * Unit test for contentHandler setter/getter along reader as handler's
- * parent.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf010.out";
- String goldFile = GOLDEN_DIR + "saxtf010GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try {
- // The transformer will use a SAX parser as it's reader.
- XMLReader reader = XMLReaderFactory.createXMLReader();
-
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
- XMLFilter filter =
- saxTFactory.newXMLFilter(new StreamSource(xsltFile));
-
- filter.setParent(reader);
- filter.setContentHandler(new MyContentHandler(outputFile));
-
- // Now, when you call transformer.parse, it will set itself as
- // the content handler for the parser object (it's "parent"), and
- // will then call the parse method on the parser.
- filter.parse(new InputSource(xmlFile));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | IOException | TransformerConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest011.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test XMLFilter parse InputSource along with customized ContentHandler by
- * using SAX parser as it's reader.
- */
-public class SAXTFactoryTest011 {
- /**
- * Unit test for contentHandler setter/getter with parent.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf011.out";
- String goldFile = GOLDEN_DIR + "saxtf011GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try {
- // The transformer will use a SAX parser as it's reader.
- XMLReader reader = XMLReaderFactory.createXMLReader();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document document = docBuilder.parse(new File(xsltFile));
- Node node = (Node)document;
- DOMSource domSource= new DOMSource(node);
-
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory)TransformerFactory.newInstance();
- XMLFilter filter = saxTFactory.newXMLFilter(domSource);
-
- filter.setParent(reader);
- filter.setContentHandler(new MyContentHandler(outputFile));
-
- // Now, when you call transformer.parse, it will set itself as
- // the content handler for the parser object (it's "parent"), and
- // will then call the parse method on the parser.
- filter.parse(new InputSource(xmlFile));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | IOException | TransformerConfigurationException
- | ParserConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest012.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXSource;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test XMLFilter parse InputSource along with customized ContentHandler by
- * using SAX parser as it's reader.
- */
-public class SAXTFactoryTest012 {
- /**
- * Unit test for contentHandler setter/getter.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf012.out";
- String goldFile = GOLDEN_DIR + "saxtf012GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
- try {
- // The transformer will use a SAX parser as it's reader.
- XMLReader reader = XMLReaderFactory.createXMLReader();
-
- InputSource is = new InputSource(new FileInputStream(xsltFile));
- SAXSource saxSource = new SAXSource();
- saxSource.setInputSource(is);
-
- SAXTransformerFactory saxTFactory = (SAXTransformerFactory)TransformerFactory.newInstance();
- XMLFilter filter = saxTFactory.newXMLFilter(saxSource);
-
- filter.setParent(reader);
- filter.setContentHandler(new MyContentHandler(outputFile));
-
- // Now, when you call transformer.parse, it will set itself as
- // the content handler for the parser object (it's "parent"), and
- // will then call the parse method on the parser.
- filter.parse(new InputSource(xmlFile));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | IOException | TransformerConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/SAXTFactoryTest013.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerFactory;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLFilter;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * Test XMLFilter parse InputSource along with TemplatesHandler.
- */
-public class SAXTFactoryTest013 {
- /**
- * Unit test for TemplatesHandler setter/getter.
- */
- @Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "saxtf013.out";
- String goldFile = GOLDEN_DIR + "saxtf013GF.out";
- String xsltFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- try {
- // The transformer will use a SAX parser as it's reader.
- XMLReader reader = XMLReaderFactory.createXMLReader();
-
- SAXTransformerFactory saxTFactory
- = (SAXTransformerFactory) TransformerFactory.newInstance();
- TemplatesHandler thandler = saxTFactory.newTemplatesHandler();
- // I have put this as it was complaining about systemid
- thandler.setSystemId("file:///" + CLASS_DIR);
-
- reader.setContentHandler(thandler);
- reader.parse(xsltFile);
- XMLFilter filter
- = saxTFactory.newXMLFilter(thandler.getTemplates());
- filter.setParent(reader);
-
- filter.setContentHandler(
- new MyContentHandler(outputFile));
- filter.parse(new InputSource(new FileInputStream(xmlFile)));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (SAXException | IOException | TransformerConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/StreamResultTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package javax.xml.transform.ptests;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Properties;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import org.testng.annotations.Test;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+/**
+ * Test a StreamResult using a file name that contains URL characters that need
+ * to be encoded.
+ */
+public class StreamResultTest extends JAXPFileBaseTest {
+ /**
+ * Unit test for StreamResult.
+ */
+ @Test
+ public void testcase01() {
+ // Set Transformer properties
+ Properties transformProperties = new Properties();
+ transformProperties.put("method", "xml");
+ transformProperties.put("encoding", "UTF-8");
+ transformProperties.put("omit-xml-declaration", "yes");
+ transformProperties.put("{http://xml.apache.org/xslt}indent-amount", "0");
+ transformProperties.put("indent", "no");
+ transformProperties.put("standalone", "no");
+ transformProperties.put("version", "1.0");
+ transformProperties.put("media-type", "text/xml");
+
+ String[] fileNames = {
+ "StreamResult01.out",
+ "StreamResult 02.out",
+ "StreamResult#03.out"
+ };
+
+ String xslFile = XML_DIR + "cities.xsl";
+ String xmlFile = XML_DIR + "cities.xml";
+
+ Arrays.stream(fileNames).forEach(file -> {
+ try {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(xslFile));
+ DOMSource domSource = new DOMSource(document);
+ StreamSource streamSource = new StreamSource(new FileInputStream(xmlFile));
+
+ File streamResultFile = new File(USER_DIR + file);
+ StreamResult streamResult = new StreamResult(streamResultFile);
+
+ Transformer transformer = TransformerFactory.newInstance().newTransformer(domSource);
+ transformer.setOutputProperties(transformProperties);
+ transformer.transform(streamSource, streamResult);
+ } catch (SAXException | IOException | ParserConfigurationException
+ | TransformerException ex) {
+ failUnexpected(ex);
+ }
+ });
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/StreamResultTest01.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package javax.xml.transform.ptests;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Properties;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
-import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
-
-/**
- * Test a StreamResult using a file name that contains URL characters that need
- * to be encoded.
- */
-public class StreamResultTest01 {
- /**
- * Unit test for StreamResult.
- */
- @Test
- public void testcase01() {
- // Set Transformer properties
- Properties transformProperties = new Properties();
- transformProperties.put("method", "xml");
- transformProperties.put("encoding", "UTF-8");
- transformProperties.put("omit-xml-declaration", "yes");
- transformProperties.put("{http://xml.apache.org/xslt}indent-amount", "0");
- transformProperties.put("indent", "no");
- transformProperties.put("standalone", "no");
- transformProperties.put("version", "1.0");
- transformProperties.put("media-type", "text/xml");
-
- String[] fileNames = {
- "StreamResult01.out",
- "StreamResult 02.out",
- "StreamResult#03.out"
- };
-
- String xslFile = XML_DIR + "cities.xsl";
- String xmlFile = XML_DIR + "cities.xml";
-
- Arrays.stream(fileNames).forEach(file -> {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(xslFile));
- DOMSource domSource = new DOMSource(document);
- StreamSource streamSource = new StreamSource(new FileInputStream(xmlFile));
-
- File streamResultFile = new File(CLASS_DIR + file);
- StreamResult streamResult = new StreamResult(streamResultFile);
-
- Transformer transformer = TransformerFactory.newInstance().newTransformer(domSource);
- transformer.setOutputProperties(transformProperties);
- transformer.transform(streamSource, streamResult);
- } catch (SAXException | IOException | ParserConfigurationException
- | TransformerException ex) {
- failUnexpected(ex);
- }
- });
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TfClearParamTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TfClearParamTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,11 +24,8 @@
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
@@ -36,21 +33,20 @@
import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* Class containing the test cases for SAXParserFactory API
*/
-public class TfClearParamTest {
+public class TfClearParamTest extends JAXPFileReadOnlyBaseTest {
/**
- * Test xslt file.
+ * Test style-sheet file name.
*/
private final String XSL_FILE = XML_DIR + "cities.xsl";
@@ -72,193 +68,164 @@
/**
* Obtains transformer's parameter with the same name that set before. Value
* should be same as set one.
+ * @throws TransformerConfigurationException If for some reason the
+ * TransformerHandler can not be created.
*/
@Test
- public void clear01() {
- try {
- Transformer transformer = TransformerFactory.newInstance().newTransformer();
- transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
- assertEquals(transformer.getParameter(LONG_PARAM_NAME).toString(), PARAM_VALUE);
- } catch (TransformerConfigurationException ex) {
- failUnexpected(ex);
- }
-
+ public void clear01() throws TransformerConfigurationException {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
+ assertEquals(transformer.getParameter(LONG_PARAM_NAME).toString(), PARAM_VALUE);
}
/**
* Obtains transformer's parameter with the a name that wasn't set before.
* Null is expected.
+ * @throws TransformerConfigurationException If for some reason the
+ * TransformerHandler can not be created.
+ */
+ @Test
+ public void clear02() throws TransformerConfigurationException {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
+ transformer.clearParameters();
+ assertNull(transformer.getParameter(LONG_PARAM_NAME));
+ }
+
+ /**
+ * Obtains transformer's parameter with a short name that set before. Value
+ * should be same as set one.
+ * @throws TransformerConfigurationException If for some reason the
+ * TransformerHandler can not be created.
*/
@Test
- public void clear02() {
- try {
- Transformer transformer = TransformerFactory.newInstance().newTransformer();
- transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
- transformer.clearParameters();
- assertNull(transformer.getParameter(LONG_PARAM_NAME));
- } catch (TransformerConfigurationException ex){
- failUnexpected(ex);
- }
+ public void clear03() throws TransformerConfigurationException {
+ TransformerFactory tfactory = TransformerFactory.newInstance();
+ Transformer transformer = tfactory.newTransformer();
+
+ transformer.setParameter(SHORT_PARAM_NAME, PARAM_VALUE);
+ assertEquals(transformer.getParameter(SHORT_PARAM_NAME).toString(), PARAM_VALUE);
+ }
+
+ /**
+ * Obtains transformer's parameter with a short name that set with an integer
+ * object before. Value should be same as the set integer object.
+ * @throws TransformerConfigurationException If for some reason the
+ * TransformerHandler can not be created.
+ */
+ @Test
+ public void clear04() throws TransformerConfigurationException {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+
+ int intObject = 5;
+ transformer.setParameter(SHORT_PARAM_NAME, intObject);
+ assertEquals(transformer.getParameter(SHORT_PARAM_NAME), intObject);
}
/**
* Obtains transformer's parameter whose initiated with a stream source with
* the a name that set before. Value should be same as set one.
+ * @throws TransformerConfigurationException If for some reason the
+ * TransformerHandler can not be created.
*/
- @Test
- public void clear03() {
- try {
- Transformer transformer = TransformerFactory.newInstance().
- newTransformer(new StreamSource(new File(XSL_FILE)));
+ @Test (groups = {"readLocalFiles"})
+ public void clear05() throws TransformerConfigurationException {
+ Transformer transformer = TransformerFactory.newInstance().
+ newTransformer(new StreamSource(new File(XSL_FILE)));
- transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
- assertEquals(transformer.getParameter(LONG_PARAM_NAME), PARAM_VALUE);
- } catch (TransformerConfigurationException ex){
- failUnexpected(ex);
- }
+ transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
+ assertEquals(transformer.getParameter(LONG_PARAM_NAME), PARAM_VALUE);
}
/**
* Obtains transformer's parameter whose initiated with a stream source with
* the a name that wasn't set before. Null is expected.
+ * @throws TransformerConfigurationException If for some reason the
+ * TransformerHandler can not be created.
*/
- @Test
- public void clear04() {
- try {
- Transformer transformer = TransformerFactory.newInstance().
- newTransformer(new StreamSource(new File(XSL_FILE)));
- transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
- transformer.clearParameters();
- assertNull(transformer.getParameter(LONG_PARAM_NAME));
- } catch (TransformerConfigurationException ex){
- failUnexpected(ex);
- }
-
+ @Test (groups = {"readLocalFiles"})
+ public void clear06() throws TransformerConfigurationException {
+ Transformer transformer = TransformerFactory.newInstance().
+ newTransformer(new StreamSource(new File(XSL_FILE)));
+ transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
+ transformer.clearParameters();
+ assertNull(transformer.getParameter(LONG_PARAM_NAME));
}
/**
* Obtains transformer's parameter whose initiated with a sax source with
* the a name that set before. Value should be same as set one.
+ * @throws Exception If any errors occur.
*/
- @Test
- public void clear05() {
- try {
- InputSource is = new InputSource(new FileInputStream(XSL_FILE));
+ @Test (groups = {"readLocalFiles"})
+ public void clear07() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XSL_FILE)) {
SAXSource saxSource = new SAXSource();
- saxSource.setInputSource(is);
+ saxSource.setInputSource(new InputSource(fis));
Transformer transformer = TransformerFactory.newInstance().newTransformer(saxSource);
-
transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
assertEquals(transformer.getParameter(LONG_PARAM_NAME), PARAM_VALUE);
- } catch (FileNotFoundException | TransformerConfigurationException ex){
- failUnexpected(ex);
}
}
/**
* Obtains transformer's parameter whose initiated with a sax source with
* the a name that wasn't set before. Null is expected.
+ * @throws Exception If any errors occur.
*/
- @Test
- public void clear06() {
- try {
- InputSource is = new InputSource(new FileInputStream(XSL_FILE));
+ @Test (groups = {"readLocalFiles"})
+ public void clear08() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XSL_FILE)) {
SAXSource saxSource = new SAXSource();
- saxSource.setInputSource(is);
+ saxSource.setInputSource(new InputSource(fis));
Transformer transformer = TransformerFactory.newInstance().newTransformer(saxSource);
-
transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
transformer.clearParameters();
assertNull(transformer.getParameter(LONG_PARAM_NAME));
- } catch (FileNotFoundException | TransformerConfigurationException ex){
- failUnexpected(ex);
}
}
/**
* Obtains transformer's parameter whose initiated with a dom source with
* the a name that set before. Value should be same as set one.
+ * @throws Exception If any errors occur.
*/
- @Test
- public void clear07() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
+ @Test (groups = {"readLocalFiles"})
+ public void clear09() throws Exception {
+ TransformerFactory tfactory = TransformerFactory.newInstance();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(XSL_FILE));
- DOMSource domSource = new DOMSource((Node)document);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(XSL_FILE));
+ DOMSource domSource = new DOMSource((Node)document);
- Transformer transformer = tfactory.newTransformer(domSource);
+ Transformer transformer = tfactory.newTransformer(domSource);
- transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
- assertEquals(transformer.getParameter(LONG_PARAM_NAME), PARAM_VALUE);
- } catch (IOException | ParserConfigurationException
- | TransformerConfigurationException | SAXException ex){
- failUnexpected(ex);
- }
+ transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
+ assertEquals(transformer.getParameter(LONG_PARAM_NAME), PARAM_VALUE);
}
/**
* Obtains transformer's parameter whose initiated with a dom source with
* the a name that wasn't set before. Null is expected.
- */
- @Test
- public void clear08() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
-
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(XSL_FILE));
- DOMSource domSource = new DOMSource((Node)document);
-
- Transformer transformer = tfactory.newTransformer(domSource);
- transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
- transformer.clearParameters();
- assertNull(transformer.getParameter(LONG_PARAM_NAME));
- } catch (IOException | ParserConfigurationException
- | TransformerConfigurationException | SAXException ex){
- failUnexpected(ex);
- }
- }
-
- /**
- * Obtains transformer's parameter with a short name that set before. Value
- * should be same as set one.
+ * @throws Exception If any errors occur.
*/
- @Test
- public void clear09() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
- Transformer transformer = tfactory.newTransformer();
-
- transformer.setParameter(SHORT_PARAM_NAME, PARAM_VALUE);
- assertEquals(transformer.getParameter(SHORT_PARAM_NAME).toString(), PARAM_VALUE);
- } catch (TransformerConfigurationException ex){
- failUnexpected(ex);
- }
- }
+ @Test (groups = {"readLocalFiles"})
+ public void clear10() throws Exception {
+ TransformerFactory tfactory = TransformerFactory.newInstance();
- /**
- * Obtains transformer's parameter with a short name that set with an integer
- * object before. Value should be same as the set integer object.
- */
- @Test
- public void clear10() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
- Transformer transformer = tfactory.newTransformer();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(XSL_FILE));
+ DOMSource domSource = new DOMSource((Node)document);
- int intObject = 5;
- transformer.setParameter(SHORT_PARAM_NAME, intObject);
- assertEquals(transformer.getParameter(SHORT_PARAM_NAME), intObject);
- } catch (TransformerConfigurationException ex){
- failUnexpected(ex);
- }
+ Transformer transformer = tfactory.newTransformer(domSource);
+ transformer.setParameter(LONG_PARAM_NAME, PARAM_VALUE);
+ transformer.clearParameters();
+ assertNull(transformer.getParameter(LONG_PARAM_NAME));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerExcpTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerExcpTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,12 +23,14 @@
package javax.xml.transform.ptests;
import java.io.File;
+import java.io.FilePermission;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource;
+import jaxp.library.JAXPBaseTest;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
@@ -38,13 +40,14 @@
/**
* Basic test for TransformerException specification.
*/
-public class TransformerExcpTest {
+public class TransformerExcpTest extends JAXPBaseTest {
/**
- * Transform an unformatted xslt file. TransformerException is thrown.
+ * Transform an unformatted style-sheet file. TransformerException is thrown.
*/
@Test
public void tfexception() {
try {
+ setPermissions(new FilePermission(XML_DIR + "-", "read"));
// invalid.xsl has well-formedness error. Therefore transform throws
// TransformerException
StreamSource streamSource
@@ -60,6 +63,8 @@
assertNotNull(e.getException());
assertNull(e.getLocationAsString());
assertEquals(e.getMessageAndLocation(),e.getMessage());
+ } finally {
+ setPermissions();
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerFactoryTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerFactoryTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,39 +24,35 @@
import java.io.*;
import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
import javax.xml.transform.stream.*;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
import org.w3c.dom.*;
-import org.xml.sax.SAXException;
/**
* Class containing the test cases for TransformerFactory API's
* getAssociatedStyleSheet method.
*/
-public class TransformerFactoryTest {
+public class TransformerFactoryTest extends JAXPFileBaseTest {
/**
* This test case checks for the getAssociatedStylesheet method
* of TransformerFactory.
* The style sheet returned is then copied to an tfactory01.out
- * It will then be verified to see if it matches the golden files
+ * It will then be verified to see if it matches the golden files.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void tfactory01() {
- String outputFile = CLASS_DIR + "tfactory01.out";
+ public void tfactory01() throws Exception {
+ String outputFile = USER_DIR + "tfactory01.out";
String goldFile = GOLDEN_DIR + "tfactory01GF.out";
String xmlFile = XML_DIR + "TransformerFactoryTest.xml";
String xmlURI = "file:///" + XML_DIR;
@@ -76,10 +72,7 @@
"Modern", null);
Transformer t = tFactory.newTransformer();
t.transform(s, streamResult);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException | ParserConfigurationException
- | TransformerException | SAXException ex) {
- failUnexpected(ex);
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,12 +24,9 @@
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
import java.util.Properties;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
@@ -39,150 +36,132 @@
import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* Basic test cases for Transformer API
*/
-public class TransformerTest {
+public class TransformerTest extends JAXPFileReadOnlyBaseTest {
/**
* XSLT file serves every test method.
*/
private final static String TEST_XSL = XML_DIR + "cities.xsl";
/**
- * This tests if newTransformer(StreamSource) method returns Transformer
+ * This tests if newTransformer(StreamSource) method returns Transformer.
+ * @throws TransformerConfigurationException If for some reason the
+ * TransformerHandler can not be created.
*/
- @Test
- public void transformer01() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
- StreamSource streamSource = new StreamSource(
- new File(TEST_XSL));
- Transformer transformer = tfactory.newTransformer(streamSource);
- assertNotNull(transformer);
- } catch (TransformerConfigurationException ex){
- failUnexpected(ex);
- }
+ @Test (groups = {"readLocalFiles"})
+ public void transformer01() throws TransformerConfigurationException {
+ TransformerFactory tfactory = TransformerFactory.newInstance();
+ StreamSource streamSource = new StreamSource(
+ new File(TEST_XSL));
+ Transformer transformer = tfactory.newTransformer(streamSource);
+ assertNotNull(transformer);
}
/**
- * This tests if newTransformer(SAXSource) method returns Transformer
+ * This tests if newTransformer(SAXSource) method returns Transformer.
+ * @throws Exception If any errors occur.
*/
- @Test
- public void transformer02() {
- try {
+ @Test (groups = {"readLocalFiles"})
+ public void transformer02() throws Exception {
+ try (FileInputStream fis = new FileInputStream(TEST_XSL)) {
TransformerFactory tfactory = TransformerFactory.newInstance();
- InputSource is = new InputSource(
- new FileInputStream(TEST_XSL));
- SAXSource saxSource = new SAXSource(is);
+ SAXSource saxSource = new SAXSource(new InputSource(fis));
Transformer transformer = tfactory.newTransformer(saxSource);
assertNotNull(transformer);
- } catch (TransformerConfigurationException | FileNotFoundException ex){
- failUnexpected(ex);
- }
- }
-
- /**
- * This tests if newTransformer(DOMSource) method returns Transformer
- */
- @Test
- public void transformer03() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
-
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(TEST_XSL));
- DOMSource domSource = new DOMSource(document);
-
- Transformer transformer = tfactory.newTransformer(domSource);
- assertNotNull(transformer);
- } catch (TransformerConfigurationException | IOException
- | ParserConfigurationException | SAXException ex){
- failUnexpected(ex);
}
}
/**
- * This tests set/get ErrorListener methods of Transformer
+ * This tests if newTransformer(DOMSource) method returns Transformer.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void transformer04() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(TEST_XSL));
- DOMSource domSource = new DOMSource(document);
+ @Test (groups = {"readLocalFiles"})
+ public void transformer03() throws Exception {
+ TransformerFactory tfactory = TransformerFactory.newInstance();
+
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(TEST_XSL));
+ DOMSource domSource = new DOMSource(document);
+
+ Transformer transformer = tfactory.newTransformer(domSource);
+ assertNotNull(transformer);
+ }
- Transformer transformer = TransformerFactory.newInstance()
- .newTransformer(domSource);
- transformer.setErrorListener(new MyErrorListener());
- assertNotNull(transformer.getErrorListener());
- assertTrue(transformer.getErrorListener() instanceof MyErrorListener);
- } catch (IOException | IllegalArgumentException | ParserConfigurationException
- | TransformerConfigurationException | SAXException ex){
- failUnexpected(ex);
- }
+ /**
+ * This tests set/get ErrorListener methods of Transformer.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test (groups = {"readLocalFiles"})
+ public void transformer04() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(TEST_XSL));
+ DOMSource domSource = new DOMSource(document);
+
+ Transformer transformer = TransformerFactory.newInstance()
+ .newTransformer(domSource);
+ transformer.setErrorListener(new MyErrorListener());
+ assertNotNull(transformer.getErrorListener());
+ assertTrue(transformer.getErrorListener() instanceof MyErrorListener);
}
/**
- * This tests getOutputProperties() method of Transformer
+ * This tests getOutputProperties() method of Transformer.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void transformer05() {
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(TEST_XSL));
- DOMSource domSource = new DOMSource(document);
+ @Test (groups = {"readLocalFiles"})
+ public void transformer05() throws Exception {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(TEST_XSL));
+ DOMSource domSource = new DOMSource(document);
- Transformer transformer = TransformerFactory.newInstance().
- newTransformer(domSource);
- Properties prop = transformer.getOutputProperties();
+ Transformer transformer = TransformerFactory.newInstance().
+ newTransformer(domSource);
+ Properties prop = transformer.getOutputProperties();
- assertEquals(prop.getProperty("indent"), "yes");
- assertEquals(prop.getProperty("method"), "xml");
- assertEquals(prop.getProperty("encoding"), "UTF-8");
- assertEquals(prop.getProperty("standalone"), "no");
- assertEquals(prop.getProperty("version"), "1.0");
- assertEquals(prop.getProperty("omit-xml-declaration"), "no");
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerConfigurationException ex){
- failUnexpected(ex);
- }
+ assertEquals(prop.getProperty("indent"), "yes");
+ assertEquals(prop.getProperty("method"), "xml");
+ assertEquals(prop.getProperty("encoding"), "UTF-8");
+ assertEquals(prop.getProperty("standalone"), "no");
+ assertEquals(prop.getProperty("version"), "1.0");
+ assertEquals(prop.getProperty("omit-xml-declaration"), "no");
}
/**
- * This tests getOutputProperty() method of Transformer
+ * This tests getOutputProperty() method of Transformer.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void transformer06() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
+ @Test (groups = {"readLocalFiles"})
+ public void transformer06() throws Exception {
+ TransformerFactory tfactory = TransformerFactory.newInstance();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(TEST_XSL));
- DOMSource domSource = new DOMSource(document);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(TEST_XSL));
+ DOMSource domSource = new DOMSource(document);
- Transformer transformer = tfactory.newTransformer(domSource);
- assertEquals(transformer.getOutputProperty("method"), "xml");
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerConfigurationException | IllegalArgumentException ex){
- failUnexpected(ex);
- }
+ Transformer transformer = tfactory.newTransformer(domSource);
+ assertEquals(transformer.getOutputProperty("method"), "xml");
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerTest02.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerTest02.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,42 +25,34 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
/**
* Here a transformer is created using DOMSource. Some specific output property
* is set on transformer. Then transform(StreamSource, StreamResult) is tested.
*/
-public class TransformerTest02 {
+public class TransformerTest02 extends JAXPFileBaseTest {
/**
* Unit test for transform(StreamSource, StreamResult).
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "transformer02.out";
+ public void testcase01() throws Exception {
+ String outputFile = USER_DIR + "transformer02.out";
String goldFile = GOLDEN_DIR + "transformer02GF.out";
String xsltFile = XML_DIR + "cities.xsl";
String xmlFile = XML_DIR + "cities.xml";
@@ -69,9 +61,8 @@
FileOutputStream fos = new FileOutputStream(outputFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(xsltFile));
- DOMSource domSource = new DOMSource(document);
+ DOMSource domSource = new DOMSource(dbf.newDocumentBuilder().
+ parse(new File(xsltFile)));
Transformer transformer = TransformerFactory.newInstance().
newTransformer(domSource);
@@ -79,20 +70,8 @@
StreamResult streamResult = new StreamResult(fos);
transformer.setOutputProperty("indent", "no");
- transformer.transform( streamSource, streamResult);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException | IllegalArgumentException
- | ParserConfigurationException | TransformerException
- | SAXException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
+ transformer.transform(streamSource, streamResult);
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerTest03.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerTest03.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,30 +25,20 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Properties;
-import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
-import static javax.xml.transform.ptests.TransformerTestConst.CLASS_DIR;
import static javax.xml.transform.ptests.TransformerTestConst.GOLDEN_DIR;
import static javax.xml.transform.ptests.TransformerTestConst.XML_DIR;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
-import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
/**
* Here Properties Object is populated with required properties.A transformer
@@ -56,13 +46,15 @@
* for transformer. Then transform(StreamSource, StreamResult) is used for
* transformation. This tests the setOutputProperties() method.
*/
-public class TransformerTest03 {
+public class TransformerTest03 extends JAXPFileBaseTest {
/**
* Test for Transformer.setOutputProperties method.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "transformer03.out";
+ public void testcase01() throws Exception {
+ String outputFile = USER_DIR + "transformer03.out";
String goldFile = GOLDEN_DIR + "transformer03GF.out";
String xsltFile = XML_DIR + "cities.xsl";
String xmlFile = XML_DIR + "cities.xml";
@@ -81,29 +73,14 @@
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(xsltFile));
- DOMSource domSource = new DOMSource(document);
+ DOMSource domSource = new DOMSource(dbf.newDocumentBuilder().
+ parse(new File(xsltFile)));
Transformer transformer = TransformerFactory.newInstance().
newTransformer(domSource);
- StreamSource streamSource = new StreamSource(fis);
- StreamResult streamResult = new StreamResult(fos);
-
transformer.setOutputProperties(properties);
- transformer.transform( streamSource, streamResult);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException
- | IOException | TransformerException ex){
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
+ transformer.transform(new StreamSource(fis), new StreamResult(fos));
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/URIResolverTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/URIResolverTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,15 +24,10 @@
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver;
import javax.xml.transform.dom.DOMSource;
@@ -40,18 +35,17 @@
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
-import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileBaseTest;
import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* URIResolver should be invoked when transform happens.
*/
-public class URIResolverTest implements URIResolver {
+public class URIResolverTest extends JAXPFileBaseTest implements URIResolver {
/**
* System ID constant.
*/
@@ -72,9 +66,8 @@
*/
private final static String XSL_TEMP_FILE = "temp/cities.xsl";
-
/**
- * expected Href.
+ * expected HREF.
*/
private final String validateHref;
@@ -84,6 +77,14 @@
private final String validateBase;
/**
+ * Default constructor for testng invocation.
+ */
+ public URIResolverTest(){
+ validateHref = null;
+ validateBase = null;
+ }
+
+ /**
* Constructor for setting expected Href and expected Base URI.
* @param validateHref expected Href
* @param validateBase expected Base URI
@@ -110,166 +111,144 @@
/**
* This is to test the URIResolver.resolve() method when a transformer is
- * created using StreamSource. xsl file has xsl:include in it
+ * created using StreamSource. style-sheet file has xsl:include in it.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public static void resolver01() {
- try {
+ @Test (groups = {"readLocalFiles"})
+ public static void resolver01() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XSL_INCLUDE_FILE)) {
TransformerFactory tfactory = TransformerFactory.newInstance();
URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
tfactory.setURIResolver(resolver);
- StreamSource streamSource = new StreamSource(new FileInputStream(XSL_INCLUDE_FILE));
+ StreamSource streamSource = new StreamSource(fis);
streamSource.setSystemId(SYSTEM_ID);
-
- Transformer transformer = tfactory.newTransformer(streamSource);
- } catch (FileNotFoundException | TransformerConfigurationException ex){
- failUnexpected(ex);
+ assertNotNull(tfactory.newTransformer(streamSource));
}
}
/**
* This is to test the URIResolver.resolve() method when a transformer is
- * created using DOMSource. xsl file has xsl:include in it
+ * created using DOMSource. style-sheet file has xsl:include in it.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public static void resolver02() {
- try {
- TransformerFactory tfactory = TransformerFactory.newInstance();
- URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
- tfactory.setURIResolver(resolver);
+ @Test (groups = {"readLocalFiles"})
+ public static void resolver02() throws Exception {
+ TransformerFactory tfactory = TransformerFactory.newInstance();
+ URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
+ tfactory.setURIResolver(resolver);
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(XSL_INCLUDE_FILE);
- DOMSource domSource = new DOMSource(document, SYSTEM_ID);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(XSL_INCLUDE_FILE);
+ DOMSource domSource = new DOMSource(document, SYSTEM_ID);
- Transformer transformer = tfactory.newTransformer(domSource);
- } catch (IOException | ParserConfigurationException
- | TransformerConfigurationException | SAXException ex){
- failUnexpected(ex);
- }
+ assertNotNull(tfactory.newTransformer(domSource));
}
/**
* This is to test the URIResolver.resolve() method when a transformer is
- * created using SAXSource. xsl file has xsl:include in it
+ * created using SAXSource. style-sheet file has xsl:include in it.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public static void resolver03() {
- try {
+ @Test (groups = {"readLocalFiles"})
+ public static void resolver03() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XSL_INCLUDE_FILE)){
URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
TransformerFactory tfactory = TransformerFactory.newInstance();
tfactory.setURIResolver(resolver);
- InputSource is = new InputSource(new FileInputStream(XSL_INCLUDE_FILE));
+ InputSource is = new InputSource(fis);
is.setSystemId(SYSTEM_ID);
SAXSource saxSource = new SAXSource(is);
-
- Transformer transformer = tfactory.newTransformer(saxSource);
- } catch (FileNotFoundException | TransformerConfigurationException ex){
- failUnexpected(ex);
+ assertNotNull(tfactory.newTransformer(saxSource));
}
}
/**
* This is to test the URIResolver.resolve() method when a transformer is
- * created using StreamSource. xsl file has xsl:import in it
+ * created using StreamSource. style-sheet file has xsl:import in it.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public static void resolver04() {
- try {
+ @Test (groups = {"readLocalFiles"})
+ public static void resolver04() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XSL_IMPORT_FILE)) {
URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
TransformerFactory tfactory = TransformerFactory.newInstance();
tfactory.setURIResolver(resolver);
-
- StreamSource streamSource = new StreamSource(new FileInputStream(XSL_IMPORT_FILE));
+ StreamSource streamSource = new StreamSource(fis);
streamSource.setSystemId(SYSTEM_ID);
-
- Transformer transformer = tfactory.newTransformer(streamSource);
- } catch (FileNotFoundException | TransformerConfigurationException ex){
- failUnexpected(ex);
+ assertNotNull(tfactory.newTransformer(streamSource));
}
}
/**
* This is to test the URIResolver.resolve() method when a transformer is
- * created using DOMSource. xsl file has xsl:import in it
+ * created using DOMSource. style-sheet file has xsl:import in it.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public static void resolver05() {
- try {
- URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
- TransformerFactory tfactory = TransformerFactory.newInstance();
- tfactory.setURIResolver(resolver);
-
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document document = db.parse(new File(XSL_IMPORT_FILE));
- DOMSource domSource = new DOMSource(document, SYSTEM_ID);
-
- Transformer transformer = tfactory.newTransformer(domSource);
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerConfigurationException ex){
- failUnexpected(ex);
- }
-
+ @Test (groups = {"readLocalFiles"})
+ public static void resolver05() throws Exception {
+ URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
+ TransformerFactory tfactory = TransformerFactory.newInstance();
+ tfactory.setURIResolver(resolver);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document document = db.parse(new File(XSL_IMPORT_FILE));
+ DOMSource domSource = new DOMSource(document, SYSTEM_ID);
+ assertNotNull(tfactory.newTransformer(domSource));
}
/**
* This is to test the URIResolver.resolve() method when a transformer is
- * created using SAXSource. xsl file has xsl:import in it
+ * created using SAXSource. style-sheet file has xsl:import in it.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public static void resolver06() {
- try {
+ @Test (groups = {"readLocalFiles"})
+ public static void resolver06() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XSL_IMPORT_FILE)){
URIResolverTest resolver = new URIResolverTest(XSL_TEMP_FILE, SYSTEM_ID);
TransformerFactory tfactory = TransformerFactory.newInstance();
tfactory.setURIResolver(resolver);
-
- InputSource is = new InputSource(new FileInputStream(XSL_IMPORT_FILE));
+ InputSource is = new InputSource(fis);
is.setSystemId(SYSTEM_ID);
SAXSource saxSource = new SAXSource(is);
-
- Transformer transformer = tfactory.newTransformer(saxSource);
- } catch (FileNotFoundException | TransformerConfigurationException ex){
- failUnexpected(ex);
+ assertNotNull(tfactory.newTransformer(saxSource));
}
-
}
/**
* This is to test the URIResolver.resolve() method when there is an error
* in the file.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public static void docResolver01() {
- try {
+ @Test (groups = {"readLocalFiles"})
+ public static void docResolver01() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XML_DIR + "doctest.xsl")) {
URIResolverTest resolver = new URIResolverTest("temp/colors.xml", SYSTEM_ID);
- TransformerFactory tfactory = TransformerFactory.newInstance();
+ StreamSource streamSource = new StreamSource(fis);
+ streamSource.setSystemId(SYSTEM_ID);
- StreamSource streamSource = new StreamSource(
- new FileInputStream(XML_DIR + FILE_SEP + "doctest.xsl"));
- streamSource.setSystemId(SYSTEM_ID);
- System.err.println(streamSource.getSystemId());
-
- Transformer transformer = tfactory.newTransformer(streamSource);
+ Transformer transformer = TransformerFactory.newInstance().newTransformer(streamSource);
transformer.setURIResolver(resolver);
- File f = new File(XML_DIR + FILE_SEP + "myFake.xml");
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- Document document = builder.parse(f);
+ File f = new File(XML_DIR + "myFake.xml");
+ Document document = DocumentBuilderFactory.newInstance().
+ newDocumentBuilder().parse(f);
// Use a Transformer for output
DOMSource source = new DOMSource(document);
- System.err.println("Ignore the following output -- just dumping it here");
StreamResult result = new StreamResult(System.err);
+ // No exception is expected because resolver resolve wrong URI.
transformer.transform(source, result);
- } catch (IOException | ParserConfigurationException | SAXException
- | TransformerException ex) {
- failUnexpected(ex);
}
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/othervm/TFCErrorTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/othervm/TFCErrorTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,19 +23,22 @@
package javax.xml.transform.ptests.othervm;
import javax.xml.transform.*;
+import jaxp.library.JAXPBaseTest;
+import static org.testng.Assert.fail;
import org.testng.annotations.Test;
/**
* Negative test for set invalid TransformerFactory property.
*/
-public class TFCErrorTest{
+public class TFCErrorTest extends JAXPBaseTest {
@Test(expectedExceptions = ClassNotFoundException.class)
public void tfce01() throws Exception {
try{
- System.setProperty("javax.xml.transform.TransformerFactory","xx");
- TransformerFactory tFactory = TransformerFactory.newInstance();
- } catch (TransformerFactoryConfigurationError error) {
- throw error.getException();
+ setSystemProperty("javax.xml.transform.TransformerFactory","xx");
+ TransformerFactory.newInstance();
+ fail("Expect TransformerFactoryConfigurationError here");
+ } catch (TransformerFactoryConfigurationError expected) {
+ throw expected.getException();
}
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathExpressionTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathExpressionTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
package javax.xml.xpath.ptests;
-import java.io.IOException;
+import java.io.FilePermission;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -31,7 +31,6 @@
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import static javax.xml.xpath.XPathConstants.BOOLEAN;
import static javax.xml.xpath.XPathConstants.NODE;
@@ -41,7 +40,7 @@
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import static javax.xml.xpath.ptests.XPathTestConst.XML_DIR;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
@@ -49,12 +48,11 @@
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* Class containing the test cases for XPathExpression API.
*/
-public class XPathExpressionTest {
+public class XPathExpressionTest extends JAXPFileReadOnlyBaseTest {
/**
* Document object for testing XML file.
*/
@@ -87,13 +85,11 @@
/**
* Create Document object and XPath object for every time
- * @throws ParserConfigurationException If the factory class cannot be
- * loaded, instantiated
- * @throws SAXException If any parse errors occur.
- * @throws IOException If operation on xml file failed.
+ * @throws Exception If any errors occur.
*/
@BeforeTest
- public void setup() throws ParserConfigurationException, SAXException, IOException {
+ public void setup() throws Exception {
+ setPermissions(new FilePermission(XML_PATH.toFile().toString(), "read"));
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(XML_PATH.toFile());
xpath = XPathFactory.newInstance().newXPath();
}
@@ -101,230 +97,200 @@
/**
* Test for evaluate(java.lang.Object item,QName returnType)throws
* XPathExpressionException.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression01() {
- try {
- assertEquals(xpath.compile(EXPRESSION_NAME_A).
- evaluate(document, STRING), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression01() throws XPathExpressionException {
+ assertEquals(xpath.compile(EXPRESSION_NAME_A).
+ evaluate(document, STRING), "6");
}
/**
* evaluate(java.lang.Object item,QName returnType) throws NPE if input
* source is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression02() {
- try {
- xpath.compile(EXPRESSION_NAME_A).evaluate(null, STRING);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression02() throws XPathExpressionException {
+ xpath.compile(EXPRESSION_NAME_A).evaluate(null, STRING);
}
/**
* evaluate(java.lang.Object item,QName returnType) throws NPE if returnType
* is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression03() {
- try {
- xpath.compile(EXPRESSION_NAME_A).evaluate(document, null);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression03() throws XPathExpressionException {
+ xpath.compile(EXPRESSION_NAME_A).evaluate(document, null);
}
/**
* Test for method evaluate(java.lang.Object item,QName returnType).If a
* request is made to evaluate the expression in the absence of a context
* item, simple expressions, such as "1+1", can be evaluated.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression04() {
- try {
- assertEquals(xpath.compile("1+1").evaluate(document, STRING), "2");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression04() throws XPathExpressionException {
+ assertEquals(xpath.compile("1+1").evaluate(document, STRING), "2");
}
/**
* evaluate(java.lang.Object item,QName returnType) throws IAE If returnType
* is not one of the types defined in XPathConstants.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
- public void testCheckXPathExpression05() {
- try {
- xpath.compile(EXPRESSION_NAME_A).evaluate(document, TEST_QNAME);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression05() throws XPathExpressionException {
+ xpath.compile(EXPRESSION_NAME_A).evaluate(document, TEST_QNAME);
}
/**
* evaluate(java.lang.Object item,QName returnType) return correct boolean
* value if returnType is Boolean.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression06() {
- try {
- assertEquals(xpath.compile(EXPRESSION_NAME_A).
+ public void testCheckXPathExpression06() throws XPathExpressionException {
+ assertEquals(xpath.compile(EXPRESSION_NAME_A).
evaluate(document, BOOLEAN), true);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
}
/**
* evaluate(java.lang.Object item,QName returnType) return correct boolean
* value if returnType is Boolean.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression07() {
- try {
- assertEquals(xpath.compile(EXPRESSION_NAME_B).
- evaluate(document, BOOLEAN), false);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression07() throws XPathExpressionException {
+ assertEquals(xpath.compile(EXPRESSION_NAME_B).
+ evaluate(document, BOOLEAN), false);
}
/**
* evaluate(java.lang.Object item,QName returnType) return correct number
* value when return type is Double.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression08() {
- try {
- assertEquals(xpath.compile(EXPRESSION_NAME_A).
- evaluate(document, NUMBER), 6d);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression08() throws XPathExpressionException {
+ assertEquals(xpath.compile(EXPRESSION_NAME_A).
+ evaluate(document, NUMBER), 6d);
}
/**
* evaluate(java.lang.Object item,QName returnType) evaluate an attribute
* value which returnType is Node.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression09() {
- try {
- Attr attr = (Attr) xpath.compile(EXPRESSION_NAME_A).
- evaluate(document, NODE);
- assertEquals(attr.getValue(), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression09() throws XPathExpressionException {
+ Attr attr = (Attr) xpath.compile(EXPRESSION_NAME_A).
+ evaluate(document, NODE);
+ assertEquals(attr.getValue(), "6");
}
/**
* evaluate(java.lang.Object item,QName returnType) evaluate an attribute
* value which returnType is NodeList.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression10() {
- try {
- NodeList nodeList = (NodeList) xpath.compile(EXPRESSION_NAME_A).
- evaluate(document, NODESET);
- Attr attr = (Attr) nodeList.item(0);
- assertEquals(attr.getValue(), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression10() throws XPathExpressionException {
+ NodeList nodeList = (NodeList) xpath.compile(EXPRESSION_NAME_A).
+ evaluate(document, NODESET);
+ Attr attr = (Attr) nodeList.item(0);
+ assertEquals(attr.getValue(), "6");
}
/**
* Test for evaluate(java.lang.Object item) when returnType is left off of
* the XPath.evaluate method, all expressions are evaluated to a String
* value.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression11() {
- try {
- assertEquals(xpath.compile(EXPRESSION_NAME_A).evaluate(document), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression11() throws XPathExpressionException {
+ assertEquals(xpath.compile(EXPRESSION_NAME_A).evaluate(document), "6");
}
/**
* evaluate(java.lang.Object item) throws NPE if expression is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression12() {
- try {
- xpath.compile(null).evaluate(document);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression12() throws XPathExpressionException {
+ xpath.compile(null).evaluate(document);
}
/**
* evaluate(java.lang.Object item) when a request is made to evaluate the
* expression in the absence of a context item, simple expressions, such as
* "1+1", can be evaluated.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathExpression13() {
- try {
- assertEquals(xpath.compile("1+1").evaluate(document), "2");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression13() throws XPathExpressionException {
+ assertEquals(xpath.compile("1+1").evaluate(document), "2");
}
/**
* evaluate(java.lang.Object item) throws NPE if document is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression14() {
- try {
- xpath.compile(EXPRESSION_NAME_A).evaluate(null);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression14() throws XPathExpressionException {
+ xpath.compile(EXPRESSION_NAME_A).evaluate(null);
}
/**
* valuate(InputSource source) return a string value if return type is
* String.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPathExpression15() {
+ @Test (groups = {"readLocalFiles"})
+ public void testCheckXPathExpression15() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.compile(EXPRESSION_NAME_A).
evaluate(new InputSource(is)), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* evaluate(InputSource source) throws NPE if input source is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression16() {
- try {
- xpath.compile(EXPRESSION_NAME_A).evaluate(null);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression16() throws XPathExpressionException {
+ xpath.compile(EXPRESSION_NAME_A).evaluate(null);
}
/**
- * evaluate(InputSource source) throws NPE if expression is null
+ * evaluate(InputSource source) throws NPE if expression is null.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression17() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void testCheckXPathExpression17() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile(null).evaluate(new InputSource(is));
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
@@ -332,14 +298,12 @@
* evaluate(InputSource source) throws XPathExpressionException if
* returnType is String junk characters.
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPathExpression18() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPathExpression18() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile("-*&").evaluate(new InputSource(is));
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
@@ -347,67 +311,63 @@
* evaluate(InputSource source) throws XPathExpressionException if
* expression is a blank string " ".
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPathExpression19() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPathExpression19() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile(" ").evaluate(new InputSource(is));
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
/**
* Test for evaluate(InputSource source,QName returnType) returns a string
* value if returnType is String.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPathExpression20() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPathExpression20() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.compile(EXPRESSION_NAME_A).
evaluate(new InputSource(is), STRING), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* evaluate(InputSource source,QName returnType) throws NPE if source is
* null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression21() {
- try {
- xpath.compile(EXPRESSION_NAME_A).evaluate(null, STRING);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathExpression21() throws XPathExpressionException {
+ xpath.compile(EXPRESSION_NAME_A).evaluate(null, STRING);
}
/**
* evaluate(InputSource source,QName returnType) throws NPE if expression is
* null.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression22() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void testCheckXPathExpression22() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile(null).evaluate(new InputSource(is), STRING);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* evaluate(InputSource source,QName returnType) throws NPE if returnType is
* null.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathExpression23() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void testCheckXPathExpression23() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile(EXPRESSION_NAME_A).evaluate(new InputSource(is), null);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
@@ -415,14 +375,12 @@
* evaluate(InputSource source,QName returnType) throws
* XPathExpressionException if expression is junk characters.
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPathExpression24() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPathExpression24() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile("-*&").evaluate(new InputSource(is), STRING);
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
@@ -430,14 +388,12 @@
* evaluate(InputSource source,QName returnType) throws
* XPathExpressionException if expression is blank " ".
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPathExpression25() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPathExpression25() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile(" ").evaluate(new InputSource(is), STRING);
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
@@ -445,85 +401,85 @@
* evaluate(InputSource source,QName returnType) throws
* IllegalArgumentException if returnType is not one of the types defined
* in XPathConstants.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testCheckXPathExpression26() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = IllegalArgumentException.class)
+ public void testCheckXPathExpression26() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.compile(EXPRESSION_NAME_A).evaluate(new InputSource(is), TEST_QNAME);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* evaluate(InputSource source,QName returnType) return a correct boolean
* value if returnType is Boolean.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPathExpression27() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPathExpression27() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.compile(EXPRESSION_NAME_A).
evaluate(new InputSource(is), BOOLEAN), true);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* evaluate(InputSource source,QName returnType) return a correct boolean
* value if returnType is Boolean.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPathExpression28() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPathExpression28() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.compile(EXPRESSION_NAME_B).
evaluate(new InputSource(is), BOOLEAN), false);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* evaluate(InputSource source,QName returnType) return a correct number
* value if returnType is Number.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPathExpression29() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPathExpression29() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.compile(EXPRESSION_NAME_A).
evaluate(new InputSource(is), NUMBER), 6d);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* Test for evaluate(InputSource source,QName returnType) returns a node if
* returnType is Node.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPathExpression30() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPathExpression30() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
Attr attr = (Attr) xpath.compile(EXPRESSION_NAME_A).
evaluate(new InputSource(is), NODE);
assertEquals(attr.getValue(), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* Test for evaluate(InputSource source,QName returnType) return a node list
* if returnType is NodeList.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPathExpression31() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPathExpression31() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
NodeList nodeList = (NodeList) xpath.compile(EXPRESSION_NAME_A).
evaluate(new InputSource(is), NODESET);
assertEquals(((Attr) nodeList.item(0)).getValue(), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathFactoryTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathFactoryTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,14 +26,14 @@
import static javax.xml.xpath.XPathConstants.DOM_OBJECT_MODEL;
import javax.xml.xpath.XPathFactory;
import javax.xml.xpath.XPathFactoryConfigurationException;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPBaseTest;
import static org.testng.AssertJUnit.assertNotNull;
import org.testng.annotations.Test;
/**
* Class containing the test cases for XPathFactory API.
*/
-public class XPathFactoryTest {
+public class XPathFactoryTest extends JAXPBaseTest {
/**
* Valid URL for creating a XPath factory.
*/
@@ -54,21 +54,21 @@
/**
* XPathFactory.newInstance(String uri) throws NPE if uri is null.
+ *
+ * @throws XPathFactoryConfigurationException If the specified object model
+ * is unavailable, or if there is a configuration error.
*/
@Test(expectedExceptions = NullPointerException.class)
- private void testCheckXPathFactory02() {
- try {
- XPathFactory.newInstance(null);
- } catch (XPathFactoryConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathFactory02() throws XPathFactoryConfigurationException {
+ XPathFactory.newInstance(null);
}
/**
* XPathFactory.newInstance(String uri) throws XPFCE if uri is just a blank
* string.
*
- * @throws XPathFactoryConfigurationException
+ * @throws XPathFactoryConfigurationException If the specified object model
+ * is unavailable, or if there is a configuration error.
*/
@Test(expectedExceptions = XPathFactoryConfigurationException.class)
public void testCheckXPathFactory03() throws XPathFactoryConfigurationException {
@@ -78,21 +78,21 @@
/**
* Test for constructor - XPathFactory.newInstance(String uri) with valid
* url - "http://java.sun.com/jaxp/xpath/dom".
+ *
+ * @throws XPathFactoryConfigurationException If the specified object model
+ * is unavailable, or if there is a configuration error.
*/
@Test
- public void testCheckXPathFactory04() {
- try {
- assertNotNull(XPathFactory.newInstance(VALID_URL));
- } catch (XPathFactoryConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathFactory04() throws XPathFactoryConfigurationException {
+ assertNotNull(XPathFactory.newInstance(VALID_URL));
}
/**
* Test for constructor - XPathFactory.newInstance(String uri) with invalid
* url - "http://java.sun.com/jaxp/xpath/dom1".
*
- * @throws XPathFactoryConfigurationException
+ * @throws XPathFactoryConfigurationException If the specified object model
+ * is unavailable, or if there is a configuration error.
*/
@Test(expectedExceptions = XPathFactoryConfigurationException.class)
public void testCheckXPathFactory05() throws XPathFactoryConfigurationException {
@@ -112,26 +112,24 @@
* Test for constructor - XPathFactory.newInstance(String uri) with valid
* url - "http://java.sun.com/jaxp/xpath/dom" and creating XPath with
* newXPath().
+ *
+ * @throws XPathFactoryConfigurationException If the specified object model
+ * is unavailable, or if there is a configuration error.
*/
@Test
- public void testCheckXPathFactory07() {
- try {
- assertNotNull(XPathFactory.newInstance(VALID_URL).newXPath());
- } catch (XPathFactoryConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathFactory07() throws XPathFactoryConfigurationException {
+ assertNotNull(XPathFactory.newInstance(VALID_URL).newXPath());
}
/**
* Test for constructor - XPathFactory.newInstance(String uri) with valid
* uri - DOM_OBJECT_MODEL.toString().
+ *
+ * @throws XPathFactoryConfigurationException If the specified object model
+ * is unavailable, or if there is a configuration error.
*/
@Test
- public void testCheckXPathFactory08() {
- try {
- assertNotNull(XPathFactory.newInstance(DOM_OBJECT_MODEL));
- } catch (XPathFactoryConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathFactory08() throws XPathFactoryConfigurationException {
+ assertNotNull(XPathFactory.newInstance(DOM_OBJECT_MODEL));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathFunctionResolverTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathFunctionResolverTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPBaseTest;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
@@ -34,7 +34,7 @@
/**
* Class containing the test cases for XPathFunctionResolver.
*/
-public class XPathFunctionResolverTest {
+public class XPathFunctionResolverTest extends JAXPBaseTest {
/**
* A XPath for evaluation environment and expressions.
*/
@@ -54,26 +54,22 @@
/**
* Test for resolveFunction(QName functionName,int arity). evaluate will
* continue as long as functionName is meaningful.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPathFunctionResolver01() {
- try {
- assertEquals(xpath.evaluate("round(1.7)", (Object)null), "2");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathFunctionResolver01() throws XPathExpressionException {
+ assertEquals(xpath.evaluate("round(1.7)", (Object)null), "2");
}
/**
* Test for resolveFunction(QName functionName,int arity); evaluate throws
* NPE if functionName is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPathFunctionResolver02() {
- try {
- assertEquals(xpath.evaluate(null, "5"), "2");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPathFunctionResolver02() throws XPathExpressionException {
+ assertEquals(xpath.evaluate(null, "5"), "2");
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/xpath/ptests/XPathTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
package javax.xml.xpath.ptests;
-import java.io.IOException;
+import java.io.FilePermission;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -33,7 +33,6 @@
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import static javax.xml.xpath.XPathConstants.BOOLEAN;
import static javax.xml.xpath.XPathConstants.NODE;
@@ -43,7 +42,7 @@
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import static javax.xml.xpath.ptests.XPathTestConst.XML_DIR;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
@@ -53,12 +52,11 @@
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
/**
* Class containing the test cases for XPath API.
*/
-public class XPathTest {
+public class XPathTest extends JAXPFileReadOnlyBaseTest {
/**
* Document object for testing XML file.
*/
@@ -91,13 +89,11 @@
/**
* Create Document object and XPath object for every time
- * @throws ParserConfigurationException If the factory class cannot be
- * loaded, instantiated
- * @throws SAXException If any parse errors occur.
- * @throws IOException If operation on xml file failed.
+ * @throws Exception If any errors occur.
*/
@BeforeTest
- public void setup() throws ParserConfigurationException, SAXException, IOException {
+ public void setup() throws Exception {
+ setPermissions(new FilePermission(XML_DIR + "-", "read"));
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(XML_PATH.toFile());
xpath = XPathFactory.newInstance().newXPath();
}
@@ -105,62 +101,54 @@
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
* item, QName returnType) which return type is String.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath01() {
- try {
- assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document, STRING), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath01() throws XPathExpressionException {
+ assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document, STRING), "6");
}
/**
* Test for XPath.compile(java.lang.String expression) and then
* evaluate(java.lang.Object item, QName returnType).
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath02() {
- try {
- assertEquals(xpath.compile(EXPRESSION_NAME_A).evaluate(document, STRING), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath02() throws XPathExpressionException {
+ assertEquals(xpath.compile(EXPRESSION_NAME_A).evaluate(document, STRING), "6");
}
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
* item) when the third argument is left off of the XPath.evaluate method,
* all expressions are evaluated to a String value.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath03() {
- try {
- assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath03() throws XPathExpressionException {
+ assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document), "6");
}
/**
* Test for XPath.compile(java.lang.String expression). If expression is
* null, should throw NPE.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath04() {
- try {
- xpath.compile(null);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath04() throws XPathExpressionException {
+ xpath.compile(null);
}
/**
* Test for XPath.compile(java.lang.String expression). If expression cannot
* be compiled junk characters, should throw XPathExpressionException.
*
- * @throws XPathExpressionException
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = XPathExpressionException.class)
public void testCheckXPath05() throws XPathExpressionException {
@@ -171,7 +159,7 @@
* Test for XPath.compile(java.lang.String expression). If expression is
* blank, should throw XPathExpressionException
*
- * @throws XPathExpressionException
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = XPathExpressionException.class)
public void testCheckXPath06() throws XPathExpressionException {
@@ -181,55 +169,46 @@
/**
* Test for XPath.compile(java.lang.String expression). The expression
* cannot be evaluated as this does not exist.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath07() {
- try {
- assertEquals(xpath.compile(EXPRESSION_NAME_B).evaluate(document, STRING), "");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
-
+ public void testCheckXPath07() throws XPathExpressionException {
+ assertEquals(xpath.compile(EXPRESSION_NAME_B).evaluate(document, STRING), "");
}
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
- * item, QName returnType). If String expression is null, should throw NPE
+ * item, QName returnType). If String expression is null, should throw NPE.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath08() {
- try {
- xpath.evaluate(null, document, STRING);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath08() throws XPathExpressionException {
+ xpath.evaluate(null, document, STRING);
}
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
* item, QName returnType). If item is null, should throw NPE.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath09() {
- try {
- xpath.evaluate(EXPRESSION_NAME_A, null, STRING);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath09() throws XPathExpressionException {
+ xpath.evaluate(EXPRESSION_NAME_A, null, STRING);
}
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
* item, QName returnType). If returnType is null, should throw NPE.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath10() {
- try {
- xpath.evaluate(EXPRESSION_NAME_A, document, null);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath10() throws XPathExpressionException {
+ xpath.evaluate(EXPRESSION_NAME_A, document, null);
}
/**
@@ -237,23 +216,20 @@
* item, QName returnType). If a request is made to evaluate the expression
* in the absence of a context item, simple expressions, such as "1+1", can
* be evaluated.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath11() {
- try {
- assertEquals(xpath.evaluate("1+1", document, STRING), "2");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath11() throws XPathExpressionException {
+ assertEquals(xpath.evaluate("1+1", document, STRING), "2");
}
/**
* XPath.evaluate(java.lang.String expression, java.lang.Object item, QName
* returnType) throws XPathExpressionException if expression is a empty
* string "".
- * .
*
- * @throws XPathExpressionException
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = XPathExpressionException.class)
public void testCheckXPath12() throws XPathExpressionException {
@@ -264,161 +240,141 @@
* XPath.evaluate(java.lang.String expression, java.lang.Object item, QName
* returnType) throws IllegalArgumentException if returnType is not one of
* the types defined in XPathConstants.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
- public void testCheckXPath13() {
- try {
- xpath.evaluate(EXPRESSION_NAME_A, document, TEST_QNAME);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath13() throws XPathExpressionException {
+ xpath.evaluate(EXPRESSION_NAME_A, document, TEST_QNAME);
}
/**
* XPath.evaluate(java.lang.String expression, java.lang.Object item, QName
* returnType) returns correct boolean value if returnType is Boolean.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath14() {
- try {
- assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document, BOOLEAN), true);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath14() throws XPathExpressionException {
+ assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document, BOOLEAN), true);
}
/**
* XPath.evaluate(java.lang.String expression, java.lang.Object item, QName
* returnType) returns false as expression is not successful in evaluating
* to any result if returnType is Boolean.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath15() {
- try {
- assertEquals(xpath.evaluate(EXPRESSION_NAME_B, document, BOOLEAN), false);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath15() throws XPathExpressionException {
+ assertEquals(xpath.evaluate(EXPRESSION_NAME_B, document, BOOLEAN), false);
}
/**
* XPath.evaluate(java.lang.String expression, java.lang.Object item, QName
* returnType) returns correct number value if return type is Number.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath16() {
- try {
- assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document, NUMBER), 6d);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath16() throws XPathExpressionException {
+ assertEquals(xpath.evaluate(EXPRESSION_NAME_A, document, NUMBER), 6d);
}
/**
* XPath.evaluate(java.lang.String expression, java.lang.Object item, QName
* returnType) returns correct string value if return type is Node.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath17() {
- try {
- assertEquals(((Attr)xpath.evaluate(EXPRESSION_NAME_A, document, NODE)).getValue(), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath17() throws XPathExpressionException {
+ assertEquals(((Attr)xpath.evaluate(EXPRESSION_NAME_A, document, NODE)).getValue(), "6");
}
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
* item, QName returnType). If return type is NodeList,the evaluated value
* equals to "6" as expected.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath18() {
- try {
- NodeList nodeList = (NodeList)xpath.evaluate(EXPRESSION_NAME_A, document, NODESET);
- assertEquals(((Attr) nodeList.item(0)).getValue(), "6");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath18() throws XPathExpressionException {
+ NodeList nodeList = (NodeList)xpath.evaluate(EXPRESSION_NAME_A, document, NODESET);
+ assertEquals(((Attr) nodeList.item(0)).getValue(), "6");
}
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
* item). If expression is null, should throw NPE.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath19() {
- try {
- xpath.evaluate(null, document);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath19() throws XPathExpressionException {
+ xpath.evaluate(null, document);
}
/**
* Test for XPath.evaluate(java.lang.String expression, java.lang.Object
* item). If a request is made to evaluate the expression in the absence of
* a context item, simple expressions, such as "1+1", can be evaluated.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test
- public void testCheckXPath20() {
- try {
- assertEquals(xpath.evaluate("1+1", document), "2");
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath20() throws XPathExpressionException {
+ assertEquals(xpath.evaluate("1+1", document), "2");
}
/**
* XPath.evaluate(java.lang.String expression, java.lang.Object item) throws
* NPE if InputSource is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath21() {
- try {
- xpath.evaluate(EXPRESSION_NAME_A, null);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath21() throws XPathExpressionException {
+ xpath.evaluate(EXPRESSION_NAME_A, null);
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source) return
* correct value by looking for Node.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath22() {
+ @Test (groups = {"readLocalFiles"})
+ public void testCheckXPath22() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.evaluate(EXPRESSION_NAME_A, new InputSource(is)), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source) throws
* NPE if InputSource is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath23() {
- try {
- xpath.evaluate(EXPRESSION_NAME_A, null);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath23() throws XPathExpressionException {
+ xpath.evaluate(EXPRESSION_NAME_A, null);
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source) throws
* NPE if String expression is null.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath24() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void testCheckXPath24() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate(null, new InputSource(is));
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
@@ -427,14 +383,12 @@
* If expression is junk characters, expression cannot be evaluated, should
* throw XPathExpressionException.
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPath25() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPath25() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate("-*&", new InputSource(is));
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
@@ -442,66 +396,62 @@
* XPath.evaluate(java.lang.String expression, InputSource source) throws
* XPathExpressionException if expression is blank " ".
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPath26() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPath26() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate(" ", new InputSource(is));
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source, QName
* returnType) returns correct string value which return type is String.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath27() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath27() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.evaluate(EXPRESSION_NAME_A, new InputSource(is), STRING), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source, QName
* returnType) throws NPE if source is null.
+ *
+ * @throws XPathExpressionException If the expression cannot be evaluated.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath28() {
- try {
- xpath.evaluate(EXPRESSION_NAME_A, null, STRING);
- } catch (XPathExpressionException ex) {
- failUnexpected(ex);
- }
+ public void testCheckXPath28() throws XPathExpressionException {
+ xpath.evaluate(EXPRESSION_NAME_A, null, STRING);
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source, QName
* returnType) throws NPE if expression is null.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath29() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void testCheckXPath29() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate(null, new InputSource(is), STRING);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source,
- * QName returnType) throws NPE if returnType is null .
+ * QName returnType) throws NPE if returnType is null.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void testCheckXPath30() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void testCheckXPath30() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate(EXPRESSION_NAME_A, new InputSource(is), null);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
@@ -509,14 +459,12 @@
* XPath.evaluate(java.lang.String expression, InputSource source, QName
* returnType) throws XPathExpressionException if expression is junk characters.
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPath31() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPath31() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate("-*&", new InputSource(is), STRING);
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
@@ -524,14 +472,12 @@
* XPath.evaluate(java.lang.String expression, InputSource source, QName
* returnType) throws XPathExpressionException if expression is blank " ".
*
- * @throws XPathExpressionException
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = XPathExpressionException.class)
- public void testCheckXPath32() throws XPathExpressionException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = XPathExpressionException.class)
+ public void testCheckXPath32() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate(" ", new InputSource(is), STRING);
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
@@ -539,84 +485,84 @@
* XPath.evaluate(java.lang.String expression, InputSource source,
* QName returnType) throws IllegalArgumentException if returnType is not
* one of the types defined in XPathConstants.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = IllegalArgumentException.class)
- public void testCheckXPath33() {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = IllegalArgumentException.class)
+ public void testCheckXPath33() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
xpath.evaluate(EXPRESSION_NAME_A, new InputSource(is), TEST_QNAME);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source,
* QName returnType) return correct boolean value if return type is Boolean.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath34() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath34() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.evaluate(EXPRESSION_NAME_A, new InputSource(is),
BOOLEAN), true);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source,
* QName returnType) return correct boolean value if return type is Boolean.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath35() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath35() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.evaluate(EXPRESSION_NAME_B, new InputSource(is),
BOOLEAN), false);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source,
* QName returnType) return correct number value if return type is Number.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath36() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath36() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.evaluate(EXPRESSION_NAME_A, new InputSource(is),
NUMBER), 6d);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource source,
* QName returnType) return correct string value if return type is Node.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath37() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath37() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(((Attr)xpath.evaluate(EXPRESSION_NAME_A,
new InputSource(is), NODE)).getValue(), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* Test for XPath.evaluate(java.lang.String expression, InputSource source,
* QName returnType) which return type is NodeList.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath38() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath38() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
NodeList nodeList = (NodeList)xpath.evaluate(EXPRESSION_NAME_A,
new InputSource(is), NODESET);
assertEquals(((Attr) nodeList.item(0)).getValue(), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
@@ -624,57 +570,57 @@
* Test for XPath.evaluate(java.lang.String expression, InputSource iSource,
* QName returnType). If return type is Boolean, should return false as
* expression is not successful in evaluating to any result.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath52() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath52() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.evaluate(EXPRESSION_NAME_B, new InputSource(is),
BOOLEAN), false);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource iSource, QName
* returnType) returns correct number value which return type is Number.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath53() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath53() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(xpath.evaluate(EXPRESSION_NAME_A, new InputSource(is),
NUMBER), 6d);
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource iSource, QName
* returnType) returns a node value if returnType is Node.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath54() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath54() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
assertEquals(((Attr)xpath.evaluate(EXPRESSION_NAME_A,
new InputSource(is), NODE)).getValue(), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
/**
* XPath.evaluate(java.lang.String expression, InputSource iSource, QName
* returnType) returns a node list if returnType is NodeList.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckXPath55() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckXPath55() throws Exception {
try (InputStream is = Files.newInputStream(XML_PATH)) {
NodeList nodeList = (NodeList)xpath.evaluate(EXPRESSION_NAME_A,
new InputSource(is), NODESET);
assertEquals(((Attr) nodeList.item(0)).getValue(), "6");
- } catch (XPathExpressionException | IOException ex) {
- failUnexpected(ex);
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/AttrImplTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/AttrImplTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,6 +22,7 @@
*/
package org.xml.sax.ptests;
+import jaxp.library.JAXPBaseTest;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import org.testng.annotations.Test;
@@ -30,7 +31,7 @@
/**
* Class containing the test cases for AttributesImpl API.
*/
-public class AttrImplTest {
+public class AttrImplTest extends JAXPBaseTest {
private static final String CAR_URI = "http://www.cars.com/xml";
private static final String CAR_LOCALNAME = "part";
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/AttributesNSTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/AttributesNSTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,20 +23,13 @@
package org.xml.sax.ptests;
import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
-import org.xml.sax.SAXException;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -45,39 +38,29 @@
* ContentHandler has Attributes as one of its arguments. Attributes
* pertaining to an element are taken into this argument and various methods
* of Attributes interfaces are tested. This program uses Namespace processing
- * with namespaces in xml file. This program does not use Validation
+ * with namespaces in XML file. This program does not use Validation
*/
-public class AttributesNSTest {
+public class AttributesNSTest extends JAXPFileBaseTest {
/**
* Test for Attribute Interface's setter/getter.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "AttributesNS.out";
+ public void testcase01() throws Exception {
+ String outputFile = USER_DIR + "AttributesNS.out";
String goldFile = GOLDEN_DIR + "AttributesNSGF.out";
String xmlFile = XML_DIR + "namespace1.xml";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- // http://www.saxproject.com/?selected=namespaces namespace-prefixes
- //set to false to supress xmlns attributes
- spf.setFeature("http://xml.org/sax/features/namespace-prefixes",
- false);
- SAXParser saxParser = spf.newSAXParser();
- MyAttrCHandler myAttrCHandler = new MyAttrCHandler(outputFile);
- saxParser.parse(new File(xmlFile), myAttrCHandler);
- myAttrCHandler.flushAndClose();
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException | ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ // http://www.saxproject.com/?selected=namespaces namespace-prefixes
+ //set to false to supress xmlns attributes
+ spf.setFeature("http://xml.org/sax/features/namespace-prefixes",
+ false);
+ SAXParser saxParser = spf.newSAXParser();
+ MyAttrCHandler myAttrCHandler = new MyAttrCHandler(outputFile);
+ saxParser.parse(new File(xmlFile), myAttrCHandler);
+ myAttrCHandler.flushAndClose();
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/AttributesTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/AttributesTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,20 +23,13 @@
package org.xml.sax.ptests;
import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
-import org.xml.sax.SAXException;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -48,37 +41,28 @@
* This program uses Namespace processing without any namepsaces in xml file.
* This program uses Validation
*/
-public class AttributesTest {
+public class AttributesTest extends JAXPFileBaseTest {
/**
* Unit test for Attributes interface. Prints all attributes into output
* file. Check it with golden file.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "Attributes.out";
+ public void testcase01() throws Exception {
+ String outputFile = USER_DIR + "Attributes.out";
String goldFile = GOLDEN_DIR + "AttributesGF.out";
String xmlFile = XML_DIR + "family.xml";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- spf.setFeature("http://xml.org/sax/features/namespace-prefixes",
- true);
- spf.setValidating(true);
- SAXParser saxParser = spf.newSAXParser();
- MyAttrCHandler myAttrCHandler = new MyAttrCHandler(outputFile);
- saxParser.parse(new File(xmlFile), myAttrCHandler);
- myAttrCHandler.flushAndClose();
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException | ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
+
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.setFeature("http://xml.org/sax/features/namespace-prefixes",
+ true);
+ spf.setValidating(true);
+ SAXParser saxParser = spf.newSAXParser();
+ MyAttrCHandler myAttrCHandler = new MyAttrCHandler(outputFile);
+ saxParser.parse(new File(xmlFile), myAttrCHandler);
+ myAttrCHandler.flushAndClose();
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/ContentHandlerTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/ContentHandlerTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,24 +26,18 @@
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -52,43 +46,34 @@
* transverses XML and print all visited node when XMLreader parses XML. Test
* verifies output is same as the golden file.
*/
-public class ContentHandlerTest {
+public class ContentHandlerTest extends JAXPFileBaseTest {
/**
* Content event handler visit all nodes to print to output file.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testcase01() {
- String outputFile = CLASS_DIR + "Content.out";
+ public void testcase01() throws Exception {
+ String outputFile = USER_DIR + "Content.out";
String goldFile = GOLDEN_DIR + "ContentGF.out";
String xmlFile = XML_DIR + "namespace1.xml";
- try(FileInputStream instream = new FileInputStream(xmlFile)) {
+ try(FileInputStream instream = new FileInputStream(xmlFile);
+ MyContentHandler cHandler = new MyContentHandler(outputFile)) {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- ContentHandler cHandler = new MyContentHandler(outputFile);
xmlReader.setContentHandler(cHandler);
- InputSource is = new InputSource(instream);
- xmlReader.parse(is);
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch( IOException | SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
+ xmlReader.parse(new InputSource(instream));
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
/**
* A content write out handler.
*/
-class MyContentHandler extends XMLFilterImpl {
+class MyContentHandler extends XMLFilterImpl implements AutoCloseable {
/**
* Prefix to every exception.
*/
@@ -258,4 +243,14 @@
throw new SAXException(WRITE_ERROR, ex);
}
}
+
+ /**
+ * Close the writer if it's initiated.
+ * @throws IOException if any IO error when close buffered writer.
+ */
+ @Override
+ public void close() throws IOException {
+ if (bWriter != null)
+ bWriter.close();
+ }
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/DefaultHandlerTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/DefaultHandlerTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,15 +26,11 @@
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
import org.xml.sax.Attributes;
@@ -42,7 +38,6 @@
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -50,46 +45,32 @@
* XMLReader parse XML with default handler that transverses XML and
* print all visited node. Test verifies output is same as the golden file.
*/
-public class DefaultHandlerTest {
+public class DefaultHandlerTest extends JAXPFileBaseTest {
/**
* Test default handler that transverses XML and print all visited node.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testDefaultHandler() {
- String outputFile = CLASS_DIR + "DefaultHandler.out";
+ public void testDefaultHandler() throws Exception {
+ String outputFile = USER_DIR + "DefaultHandler.out";
String goldFile = GOLDEN_DIR + "DefaultHandlerGF.out";
String xmlFile = XML_DIR + "namespace1.xml";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxparser = spf.newSAXParser();
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ SAXParser saxparser = spf.newSAXParser();
- MyDefaultHandler handler = new MyDefaultHandler(outputFile);
- File file = new File(xmlFile);
- String Absolutepath = file.getAbsolutePath();
- String newAbsolutePath = Absolutepath;
- if (File.separatorChar == '\\')
- newAbsolutePath = Absolutepath.replace('\\', '/');
- String uri = "file:///" + newAbsolutePath;
- saxparser.parse(uri, handler);
- } catch (IOException | ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
- // Need close the output file before we compare it with golden file.
- try {
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
+ MyDefaultHandler handler = new MyDefaultHandler(outputFile);
+ File file = new File(xmlFile);
+ String Absolutepath = file.getAbsolutePath();
+ String newAbsolutePath = Absolutepath;
+ if (File.separatorChar == '\\')
+ newAbsolutePath = Absolutepath.replace('\\', '/');
+ saxparser.parse("file:///" + newAbsolutePath, handler);
+
+ assertTrue(compareWithGold(goldFile, outputFile));
+
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/EHFatalTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/EHFatalTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,23 +26,19 @@
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
import org.testng.annotations.Test;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -50,14 +46,16 @@
* ErrorHandler unit test. Set a ErrorHandle to XMLReader. Capture fatal error
* events in ErrorHandler.
*/
-public class EHFatalTest {
+public class EHFatalTest extends JAXPFileBaseTest {
/**
* Error Handler to capture all error events to output file. Verifies the
* output file is same as golden file.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testEHFatal() {
- String outputFile = CLASS_DIR + "EHFatal.out";
+ public void testEHFatal() throws Exception {
+ String outputFile = USER_DIR + "EHFatal.out";
String goldFile = GOLDEN_DIR + "EHFatalGF.out";
String xmlFile = XML_DIR + "invalid.xml";
@@ -68,25 +66,12 @@
xmlReader.setErrorHandler(eHandler);
InputSource is = new InputSource(instream);
xmlReader.parse(is);
- } catch (IOException | ParserConfigurationException ex) {
- failUnexpected(ex);
- } catch (SAXException ex) {
- System.out.println("This is expected:" + ex);
+ fail("Parse should throw SAXException");
+ } catch (SAXException expected) {
+ // This is expected.
}
// Need close the output file before we compare it with golden file.
- try {
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/MyAttrCHandler.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package org.xml.sax.ptests;
-
-import java.io.BufferedWriter;
-import java.io.FileWriter;
-import java.io.IOException;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Simple attributes handler.
- */
-public class MyAttrCHandler extends DefaultHandler {
- /**
- * FileWriter to write string to output file.
- */
- private final BufferedWriter bWriter;
-
- /**
- * Initiate FileWriter
- * @param fileName output file name.
- * @throws IOException
- */
- public MyAttrCHandler(String fileName) throws IOException {
- bWriter = new BufferedWriter(new FileWriter(fileName));
- }
-
- /**
- * Write element content before start access every element.
- * @throws org.xml.sax.SAXException
- */
- @Override
- public void startElement(String uri, String localName,
- String qName, Attributes attributes) throws SAXException {
- try {
- String string = "uri <" + uri + "> localName <" + localName +
- "> qName <" + qName + ">";
-
- bWriter.write( string, 0, string.length());
- bWriter.newLine();
-
- int length = attributes.getLength();
- string = "length: " + length;
-
- bWriter.write( string, 0, string.length());
- bWriter.newLine();
-
- for (int ind=0; ind < length ; ind++) {
- string = "For index = " + ind + "\n";
- string += "getLocalName <" + attributes.getLocalName(ind)
- +">" + "\n";
- string += "getQName <" + attributes.getQName(ind) +">" + "\n";
- string += "getType <" + attributes.getType(ind) +">" + "\n";
- string += "getURI <" + attributes.getURI(ind) +">" + "\n";
- string += "getValue <" + attributes.getValue(ind) +">" + "\n";
-
- bWriter.write( string, 0, string.length());
- bWriter.newLine();
-
- String gotLocalName = attributes.getLocalName(ind);
- String gotQName = attributes.getQName(ind);
- String gotURI = attributes.getURI(ind);
-
- string ="Using localName, qname and uri pertaining to index = "
- + ind;
- bWriter.write( string, 0, string.length());
- bWriter.newLine();
-
- string = "getIndex(qName) <" + attributes.getIndex(gotQName)
- +">" + "\n";
- string += "getIndex(uri, localName) <" +
- attributes.getIndex(gotURI, gotLocalName) +">" + "\n";
-
- string += "getType(qName) <" +
- attributes.getType(gotQName) +">" + "\n";
- string += "getType(uri, localName) <" +
- attributes.getType(gotURI, gotLocalName) +">" + "\n";
-
- string += "getValue(qName) <" +
- attributes.getValue(gotQName) +">" + "\n";
- string += "getValue(uri, localName) <" +
- attributes.getValue(gotURI, gotLocalName) +">" + "\n";
-
- bWriter.write( string, 0, string.length());
- bWriter.newLine();
- }
- bWriter.newLine();
- } catch(IOException ex){
- throw new SAXException(ex);
- }
- }
-
- /**
- * Flush the stream and close the file.
- * @throws IOException when writing or closing file failed.
- */
- public void flushAndClose() throws IOException {
- bWriter.flush();
- bWriter.close();
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/MyNSContentHandler.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,208 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package org.xml.sax.ptests;
-
-import org.xml.sax.helpers.DefaultHandler;
-import org.xml.sax.helpers.LocatorImpl;
-import org.xml.sax.Locator;
-import org.xml.sax.Attributes;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.FileWriter;
-import org.xml.sax.SAXException;
-
-class MyNSContentHandler extends DefaultHandler {
- /**
- * Prefix for written string.
- */
- private final static String WRITE_ERROR = "bWrite error";
- /**
- * FileWriter to write output file.
- */
- private final BufferedWriter bWriter;
-
- /**
- * Default locator.
- */
- Locator locator = new LocatorImpl();
-
- /**
- * Initiate FileWrite.
- * @param outputFileName file name of output file.
- * @throws SAXException when open output file failed.
- */
- public MyNSContentHandler(String outputFileName) throws SAXException {
- try {
- bWriter = new BufferedWriter(new FileWriter(outputFileName));
- } catch (IOException ex) {
- throw new SAXException(ex);
- }
- }
-
- /**
- * Write characters tag along with content of characters when meet
- * characters event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void characters(char[] ch, int start, int length)
- throws SAXException {
- String s = new String(ch, start, length);
- println("characters...length is:" + s.length() + "\n"
- + "<" + s + ">");
- }
-
- /**
- * Write endDocument tag then flush the content and close the file when meet
- * endDocument event.
- * @throws IOException error happen when writing file or closing file.
- */
- @Override
- public void endDocument() throws SAXException {
- try {
- println("endDocument...");
- bWriter.flush();
- bWriter.close();
- } catch (IOException ex) {
- throw new SAXException(WRITE_ERROR, ex);
- }
- }
-
- /**
- * Write endElement tag with namespaceURI, localName, qName to the file when
- * meet endElement event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void endElement(String namespaceURI, String localName, String qName)
- throws SAXException {
- println("endElement...\n" + "namespaceURI: <" + namespaceURI
- + "> localName: <" + localName + "> qName: <" + qName + ">");
- }
-
- /**
- * Write endPrefixMapping tag along with prefix to the file when meet
- * endPrefixMapping event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void endPrefixMapping(String prefix) throws SAXException {
- println("endPrefixMapping...\n" + "prefix: <" + prefix + ">");
- }
-
- /**
- * Write ignorableWhitespace tag along with white spaces when meet
- * ignorableWhitespace event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void ignorableWhitespace(char[] ch, int start, int length)
- throws SAXException {
- String s = new String(ch, start, length);
- println("ignorableWhitespace...\n" + s
- + " ignorable white space string length: " + s.length());
- }
-
- /**
- * Write processingInstruction tag along with target name and target data
- * when meet processingInstruction event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void processingInstruction(String target, String data)
- throws SAXException {
- println("processingInstruction...target:<" + target
- + "> data: <" + data + ">");
- }
-
- /**
- * Write setDocumentLocator tag when meet setDocumentLocator event.
- */
- @Override
- public void setDocumentLocator(Locator locator) {
- try {
- this.locator = locator;
- println("setDocumentLocator...");
- } catch (SAXException ex) {
- System.err.println(WRITE_ERROR + ex);
- }
- }
-
- /**
- * Write skippedEntity tag along with entity name when meet skippedEntity
- * event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void skippedEntity(String name) throws SAXException {
- println("skippedEntity...\n" + "name: <" + name + ">");
- }
-
- /**
- * Write startDocument tag when meet startDocument event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void startDocument() throws SAXException {
- println("startDocument...");
- }
-
- /**
- * Write startElement tag along with namespaceURI, localName, qName, number
- * of attributes and line number when meet startElement event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void startElement(String namespaceURI, String localName,
- String qName, Attributes atts) throws SAXException {
- println("startElement...\n" + "namespaceURI: <" + namespaceURI
- + "> localName: <" + localName + "> qName: <" + qName
- + "> Number of Attributes: <" + atts.getLength()
- + "> Line# <" + locator.getLineNumber() + ">");
- }
-
- /**
- * Write startPrefixMapping tag along with prefix and uri when meet
- * startPrefixMapping event.
- * @throws IOException error happen when writing file.
- */
- @Override
- public void startPrefixMapping(String prefix, String uri)
- throws SAXException {
- println("startPrefixMapping...\n" + "prefix: <" + prefix
- + "> uri: <" + uri + ">");
- }
- /**
- * Write outString to output file.
- * @param outString string to be written.
- * @throws SAXException
- */
- private void println(String outString) throws SAXException {
- try {
- bWriter.write( outString, 0, outString.length());
- bWriter.newLine();
- } catch (IOException ex) {
- throw new SAXException(WRITE_ERROR, ex);
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/NSSupportTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/NSSupportTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,6 +23,7 @@
package org.xml.sax.ptests;
import java.util.Enumeration;
+import jaxp.library.JAXPBaseTest;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import org.testng.annotations.Test;
@@ -31,7 +32,7 @@
/**
* Unit test cases for NamespaceSupport API
*/
-public class NSSupportTest {
+public class NSSupportTest extends JAXPBaseTest {
/**
* Empty prefix name.
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/NSTableTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.xml.sax.ptests;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPBaseTest;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+import org.xml.sax.XMLReader;
+
+/**
+ * Class containing the test cases for Namespace Table defined at
+ * http://www.megginson.com/SAX/Java/namespaces.html
+ */
+public class NSTableTest extends JAXPBaseTest {
+ private static final String NAMESPACES =
+ "http://xml.org/sax/features/namespaces";
+ private static final String NAMESPACE_PREFIXES =
+ "http://xml.org/sax/features/namespace-prefixes";
+
+ /**
+ * Here namespace processing and namespace-prefixes are enabled.
+ * The testcase tests XMLReader for this.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void xrNSTable01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ SAXParser saxParser = spf.newSAXParser();
+
+ XMLReader xmlReader = saxParser.getXMLReader();
+ xmlReader.setFeature(NAMESPACE_PREFIXES, true);
+
+ assertTrue(xmlReader.getFeature(NAMESPACES));
+ assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
+ }
+
+ /**
+ * Here namespace processing is enabled. This will make namespace-prefixes
+ * disabled. The testcase tests XMLReader for this.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void xrNSTable02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertTrue(xmlReader.getFeature(NAMESPACES));
+ assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
+ }
+
+ /**
+ * Here namespace processing is disabled. This will make namespace-prefixes
+ * enabled. The testcase tests XMLReader for this.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void xrNSTable03() throws Exception {
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ assertFalse(xmlReader.getFeature(NAMESPACES));
+ assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
+ }
+
+ /**
+ * Here namespace processing is disabled, and namespace-prefixes is
+ * disabled. This will make namespace processing on.The testcase tests
+ * XMLReader for this. This behavior only apply to crimson, not
+ * XERCES.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void xrNSTable04() throws Exception {
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ xmlReader.setFeature(NAMESPACE_PREFIXES, false);
+ assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
+ }
+
+ /**
+ * Here namespace processing and namespace-prefixes are enabled.
+ * The testcase tests SAXParserFactory for this.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void spNSTable01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.setFeature(NAMESPACE_PREFIXES,true);
+ assertTrue(spf.getFeature(NAMESPACES));
+ assertTrue(spf.getFeature(NAMESPACE_PREFIXES));
+ }
+
+ /**
+ * Here namespace processing is enabled. This will make namespace-prefixes
+ * disabled. The testcase tests SAXParserFactory for this.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void spNSTable02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ assertTrue(spf.getFeature(NAMESPACES));
+ assertFalse(spf.getFeature(NAMESPACE_PREFIXES));
+ }
+
+ /**
+ * Here namespace processing is disabled. This will make namespace-prefixes
+ * enabled. The testcase tests SAXParserFactory for this.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void spNSTable03() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ assertFalse(spf.getFeature(NAMESPACES));
+ assertTrue(spf.getFeature(NAMESPACE_PREFIXES));
+ }
+ /**
+ * Here namespace processing is disabled, and namespace-prefixes is
+ * disabled. This will make namespace processing on.The testcase tests
+ * SAXParserFactory for this. This behavior only apply to crimson,
+ * not xerces.
+ *
+ * @throws Exception If any errors occur.
+ */
+ @Test
+ public void spNSTable04() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setFeature(NAMESPACE_PREFIXES, false);
+ assertFalse(spf.getFeature(NAMESPACE_PREFIXES));
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/NSTableTest01.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package org.xml.sax.ptests;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertTrue;
-import org.testng.annotations.Test;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
-import org.xml.sax.XMLReader;
-
-/**
- * Class containing the test cases for Namespace Table defined at
- * http://www.megginson.com/SAX/Java/namespaces.html
- */
-public class NSTableTest01 {
- private static final String NAMESPACES =
- "http://xml.org/sax/features/namespaces";
- private static final String NAMESPACE_PREFIXES =
- "http://xml.org/sax/features/namespace-prefixes";
-
- /**
- * Here namespace processing and namespace-prefixes are enabled.
- * The testcase tests XMLReader for this.
- */
- @Test
- public void xrNSTable01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxParser = spf.newSAXParser();
-
- XMLReader xmlReader = saxParser.getXMLReader();
- xmlReader.setFeature(NAMESPACE_PREFIXES, true);
-
- assertTrue(xmlReader.getFeature(NAMESPACES));
- assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
- }
-
- /**
- * Here namespace processing is enabled. This will make namespace-prefixes
- * disabled. The testcase tests XMLReader for this.
- */
- @Test
- public void xrNSTable02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxParser = spf.newSAXParser();
-
- XMLReader xmlReader = saxParser.getXMLReader();
- assertTrue(xmlReader.getFeature(NAMESPACES));
- assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
-
- }
-
- /**
- * Here namespace processing is disabled. This will make namespace-prefixes
- * enabled. The testcase tests XMLReader for this.
- */
- @Test
- public void xrNSTable03() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- SAXParser saxParser = spf.newSAXParser();
- XMLReader xmlReader = saxParser.getXMLReader();
- assertFalse(xmlReader.getFeature(NAMESPACES));
- assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
- }
-
- /**
- * Here namespace processing is disabled, and namespace-prefixes is
- * disabled. This will make namespace processing on.The testcase tests
- * XMLReader for this. This behavior only apply to crimson, not
- * xerces
- */
- @Test
- public void xrNSTable04() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- SAXParser saxParser = spf.newSAXParser();
- XMLReader xmlReader = saxParser.getXMLReader();
- xmlReader.setFeature(NAMESPACE_PREFIXES, false);
-
- assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
- }
-
- /**
- * Here namespace processing and namespace-prefixes are enabled.
- * The testcase tests SAXParserFactory for this.
- */
- @Test
- public void spNSTable01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- spf.setFeature(NAMESPACE_PREFIXES,true);
- assertTrue(spf.getFeature(NAMESPACES));
- assertTrue(spf.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXNotRecognizedException
- | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
- }
-
- /**
- * Here namespace processing is enabled. This will make namespace-prefixes
- * disabled. The testcase tests SAXParserFactory for this.
- */
- @Test
- public void spNSTable02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- assertTrue(spf.getFeature(NAMESPACES));
- assertFalse(spf.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXNotRecognizedException
- | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
- }
-
- /**
- * Here namespace processing is disabled. This will make namespace-prefixes
- * enabled. The testcase tests SAXParserFactory for this.
- */
- @Test
- public void spNSTable03() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- assertFalse(spf.getFeature(NAMESPACES));
- assertTrue(spf.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXNotRecognizedException
- | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
- }
- /**
- * Here namespace processing is disabled, and namespace-prefixes is
- * disabled. This will make namespace processing on.The testcase tests
- * SAXParserFactory for this. This behavior only apply to crimson,
- * not xerces.
- */
- @Test
- public void spNSTable04() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setFeature(NAMESPACE_PREFIXES, false);
-
- assertFalse(spf.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXNotRecognizedException
- | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/ParserAdapterTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/ParserAdapterTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,10 +23,8 @@
package org.xml.sax.ptests;
import java.io.FileInputStream;
-import java.io.IOException;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
@@ -35,7 +33,6 @@
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.ParserAdapter;
import org.xml.sax.helpers.XMLFilterImpl;
@@ -47,7 +44,7 @@
* Unit test cases for ParserAdapter API. By default the only features recognized
* are namespaces and namespace-prefixes.
*/
-public class ParserAdapterTest {
+public class ParserAdapterTest extends JAXPFileReadOnlyBaseTest {
/**
* namespaces feature name.
*/
@@ -67,10 +64,9 @@
/**
* Initiate ParserAdapter.
- * @throws ParserConfigurationException
- * @throws SAXException
+ * @throws Exception If any errors occur.
*/
- ParserAdapterTest() throws ParserConfigurationException, SAXException {
+ ParserAdapterTest() throws Exception {
SAXParserFactory spf = SAXParserFactory.newInstance();
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
XMLReaderAdapter xmlReaderAdapter = new XMLReaderAdapter(xmlReader);
@@ -151,129 +147,111 @@
/**
* parserAdapter.getFeature(NAMESPACES) returns true be default.
+ *
+ * @exception Exception If any errors occur.
*/
@Test
- public void getFeature01() {
- try {
- assertTrue(parserAdapter.getFeature(NAMESPACES));
- } catch (SAXNotRecognizedException | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
+ public void getFeature01() throws Exception {
+ assertTrue(parserAdapter.getFeature(NAMESPACES));
}
/**
* parserAdapter.getFeature(NAMESPACE_PREFIXES) returns true be default.
+ *
+ * @exception Exception If any errors occur.
*/
@Test
- public void getFeature02() {
- try {
- assertFalse(parserAdapter.getFeature(NAMESPACE_PREFIXES));
- } catch (SAXNotRecognizedException | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
+ public void getFeature02() throws Exception {
+ assertFalse(parserAdapter.getFeature(NAMESPACE_PREFIXES));
}
/**
* SAXNotRecognizedException thrown when feature name is not known one.
- * @throws org.xml.sax.SAXNotRecognizedException expected Exception
+ *
+ * @exception Exception If any errors occur.
*/
@Test(expectedExceptions = SAXNotRecognizedException.class)
- public void getFeature03() throws SAXNotRecognizedException {
- try {
- parserAdapter.getFeature("no-meaning-feature");
- } catch (SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
+ public void getFeature03() throws Exception {
+ parserAdapter.getFeature("no-meaning-feature");
}
/**
* Obtain getFeature after it's set returns set value.
+ *
+ * @exception Exception If any errors occur.
*/
@Test
- public void setFeature01() {
- try {
- parserAdapter.setFeature(NAMESPACES, false);
- assertFalse(parserAdapter.getFeature(NAMESPACES));
- } catch (SAXNotRecognizedException | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
+ public void setFeature01() throws Exception {
+ parserAdapter.setFeature(NAMESPACES, false);
+ assertFalse(parserAdapter.getFeature(NAMESPACES));
}
/**
* Obtain getFeature after it's set returns set value.
+ *
+ * @exception Exception If any errors occur.
*/
@Test
- public void setFeature02() {
- try {
- parserAdapter.setFeature(NAMESPACE_PREFIXES, false);
- assertFalse(parserAdapter.getFeature(NAMESPACE_PREFIXES));
- } catch (SAXNotRecognizedException | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
+ public void setFeature02() throws Exception {
+ parserAdapter.setFeature(NAMESPACE_PREFIXES, false);
+ assertFalse(parserAdapter.getFeature(NAMESPACE_PREFIXES));
}
/**
* Obtain getFeature after it's set returns set value.
+ *
+ * @exception Exception If any errors occur.
*/
@Test
- public void setFeature03() {
- try {
- parserAdapter.setFeature(NAMESPACES, true);
- assertTrue(parserAdapter.getFeature(NAMESPACES));
- } catch (SAXNotRecognizedException | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
+ public void setFeature03() throws Exception {
+ parserAdapter.setFeature(NAMESPACES, true);
+ assertTrue(parserAdapter.getFeature(NAMESPACES));
}
/**
* Obtain getFeature after it's set returns set value.
+ *
+ * @exception Exception If any errors occur.
*/
@Test
- public void setFeature04() {
- try {
- parserAdapter.setFeature(NAMESPACE_PREFIXES, true);
- assertTrue(parserAdapter.getFeature(NAMESPACE_PREFIXES));
- } catch (SAXNotRecognizedException | SAXNotSupportedException ex) {
- failUnexpected(ex);
- }
+ public void setFeature04() throws Exception {
+ parserAdapter.setFeature(NAMESPACE_PREFIXES, true);
+ assertTrue(parserAdapter.getFeature(NAMESPACE_PREFIXES));
}
/**
* NPE expected when parsing a null object by ParserAdapter.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void parse01() {
- try {
- parserAdapter.parse((InputSource)null);
- } catch (IOException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void parse01() throws Exception {
+ parserAdapter.parse((InputSource)null);
}
/**
* SAXException expected when parsing a wrong-formatter XML with ParserAdapter.
- * @throws org.xml.sax.SAXException
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class)
- public void parse02() throws SAXException {
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class)
+ public void parse02() throws Exception {
try(FileInputStream fis = new FileInputStream(XML_DIR + "invalid.xml")) {
InputSource is = new InputSource(fis);
parserAdapter.parse(is);
- } catch (IOException ex) {
- failUnexpected(ex);
}
}
/**
* Parse a well-formatter XML with ParserAdapter.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void parse03() {
+ @Test(groups = {"readLocalFiles"})
+ public void parse03() throws Exception {
try(FileInputStream fis = new FileInputStream(XML_DIR + "correct.xml")) {
InputSource is = new InputSource(fis);
parserAdapter.parse(is);
- } catch (IOException | SAXException ex) {
- failUnexpected(ex);
}
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/ResolverTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/ResolverTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,21 +26,16 @@
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -48,12 +43,14 @@
* Entity resolver should be invoked in XML parse. This test verifies parsing
* process by checking the output with golden file.
*/
-public class ResolverTest {
+public class ResolverTest extends JAXPFileBaseTest {
/**
* Unit test for entityResolver setter.
+ *
+ * @throws Exception If any errors occur.
*/
- public void testResolver() {
- String outputFile = CLASS_DIR + "EntityResolver.out";
+ public void testResolver() throws Exception {
+ String outputFile = USER_DIR + "EntityResolver.out";
String goldFile = GOLDEN_DIR + "EntityResolverGF.out";
String xmlFile = XML_DIR + "publish.xml";
@@ -64,23 +61,8 @@
xmlReader.setEntityResolver(eResolver);
InputSource is = new InputSource(instream);
xmlReader.parse(is);
- } catch(IOException | SAXException | ParserConfigurationException ex ) {
- failUnexpected(ex);
}
- // Need close the output file before we compare it with golden file.
- try {
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/SAXParserNSTableTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/SAXParserNSTableTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,20 +23,12 @@
package org.xml.sax.ptests;
import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
-import org.xml.sax.SAXException;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -44,91 +36,64 @@
* This class contains the testcases to test SAXParser with regard to
* Namespace Table defined at http://www.megginson.com/SAX/Java/namespaces.html
*/
-public class SAXParserNSTableTest {
+public class SAXParserNSTableTest extends JAXPFileBaseTest {
/**
* namespace processing is enabled. namespace-prefix is also is enabled.
* So it is a True-True combination.
- * The test is to test SAXParser with these conditions
+ * The test is to test SAXParser with these conditions.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testWithTrueTrue() {
- String outputFile = CLASS_DIR + "SPNSTableTT.out";
+ public void testWithTrueTrue() throws Exception {
+ String outputFile = USER_DIR + "SPNSTableTT.out";
String goldFile = GOLDEN_DIR + "NSTableTTGF.out";
String xmlFile = XML_DIR + "namespace1.xml";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- spf.setFeature("http://xml.org/sax/features/namespace-prefixes",
- true);
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.setFeature("http://xml.org/sax/features/namespace-prefixes",
+ true);
+ try (MyNSContentHandler handler = new MyNSContentHandler(outputFile)) {
+ spf.newSAXParser().parse(new File(xmlFile), handler);
+ }
+ assertTrue(compareWithGold(goldFile, outputFile));
- SAXParser saxParser = spf.newSAXParser();
- saxParser.parse(new File(xmlFile), new MyNSContentHandler(outputFile));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
}
/**
* namespace processing is enabled. Hence namespace-prefix is
- * expected to be automaically off. So it is a True-False combination.
- * The test is to test SAXParser with these conditions
+ * expected to be automatically off. So it is a True-False combination.
+ * The test is to test SAXParser with these conditions.
+ *
+ * @throws Exception If any errors occur.
*/
- public void testWithTrueFalse() {
- String outputFile = CLASS_DIR + "SPNSTableTF.out";
+ public void testWithTrueFalse() throws Exception {
+ String outputFile = USER_DIR + "SPNSTableTF.out";
String goldFile = GOLDEN_DIR + "NSTableTFGF.out";
String xmlFile = XML_DIR + "namespace1.xml";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxParser = spf.newSAXParser();
- saxParser.parse(new File(xmlFile), new MyNSContentHandler(outputFile));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ try (MyNSContentHandler handler = new MyNSContentHandler(outputFile)) {
+ spf.newSAXParser().parse(new File(xmlFile), handler);
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
/**
* namespace processing is not enabled. Hence namespace-prefix is
- * expected to be automaically on. So it is a False-True combination.
- * The test is to test SAXParser with these conditions
+ * expected to be automatically on. So it is a False-True combination.
+ * The test is to test SAXParser with these conditions.
+ *
+ * @throws Exception If any errors occur.
*/
- public void testWithFalseTrue() {
- String outputFile = CLASS_DIR + "SPNSTableFT.out";
+ public void testWithFalseTrue() throws Exception {
+ String outputFile = USER_DIR + "SPNSTableFT.out";
String goldFile = GOLDEN_DIR + "NSTableFTGF.out";
String xmlFile = XML_DIR + "namespace1.xml";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxParser = spf.newSAXParser();
- saxParser.parse(new File(xmlFile), new MyNSContentHandler(outputFile));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException | IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ try (MyNSContentHandler handler = new MyNSContentHandler(outputFile)) {
+ spf.newSAXParser().parse(new File(xmlFile), handler);
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLFilterCBTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLFilterCBTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,14 +26,10 @@
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
@@ -42,7 +38,6 @@
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -50,45 +45,34 @@
* Set parent of XMLFilter to XMLReader. Parsing on XML file will invoke XMLFilter
* to write to output file. Test verifies output is same as the golden file.
*/
-public class XMLFilterCBTest {
- public void testXMLFilterCB() {
- String outputFile = CLASS_DIR + "XMLFilter.out";
+public class XMLFilterCBTest extends JAXPFileBaseTest {
+ /**
+ * Test XMLFilter working with XML reader.
+ *
+ * @throws Exception If any errors occur.
+ */
+ public void testXMLFilterCB() throws Exception {
+ String outputFile = USER_DIR + "XMLFilter.out";
String goldFile = GOLDEN_DIR + "XMLFilterGF.out";
String xmlFile = XML_DIR + "namespace1.xml";
- try (FileInputStream fis = new FileInputStream(xmlFile)){
+ try (FileInputStream fis = new FileInputStream(xmlFile);
+ MyXMLFilter myXmlFilter = new MyXMLFilter(outputFile)){
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
XMLReader xmlReader = spf.newSAXParser().getXMLReader();
-
- MyXMLFilter myXmlFilter = new MyXMLFilter(outputFile);
myXmlFilter.setParent(xmlReader);
- InputSource is = new InputSource(fis);
- myXmlFilter.parse(is);
- } catch( SAXException | IOException | ParserConfigurationException ex) {
- failUnexpected(ex);
+ myXmlFilter.parse(new InputSource(fis));
}
// Need close the output file before we compare it with golden file.
- try {
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (IOException ex) {
- failUnexpected(ex);
- } finally {
- try {
- Path outputPath = Paths.get(outputFile);
- if(Files.exists(outputPath))
- Files.delete(outputPath);
- } catch (IOException ex) {
- failCleanup(ex, outputFile);
- }
- }
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
/**
* Writer XMLFiler which write all tags to output file when event happens.
*/
-class MyXMLFilter extends XMLFilterImpl{
+class MyXMLFilter extends XMLFilterImpl implements AutoCloseable {
/**
* FileWriter to write string to output file.
*/
@@ -278,4 +262,14 @@
throw new SAXException(ex);
}
}
+
+ /**
+ * Close writer handler.
+ * @throws IOException if any I/O error when close writer handler.
+ */
+ @Override
+ public void close() throws IOException {
+ if (bWriter != null)
+ bWriter.close();
+ }
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLFilterTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLFilterTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,18 +23,14 @@
package org.xml.sax.ptests;
import java.io.FileInputStream;
-import java.io.IOException;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
-import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -42,7 +38,7 @@
/**
* Unit test for XMLFilter.
*/
-public class XMLFilterTest {
+public class XMLFilterTest extends JAXPFileReadOnlyBaseTest {
/**
* name spaces constant.
*/
@@ -129,139 +125,114 @@
/**
* By default true is expected get namespaces feature.
- * @throws SAXException
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void getFeature01() throws SAXException {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ public void getFeature01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
- xmlFilter.setParent(xmlReader);
- assertTrue(xmlFilter.getFeature(NAMESPACES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ xmlFilter.setParent(xmlReader);
+ assertTrue(xmlFilter.getFeature(NAMESPACES));
}
/**
* By default false is expected get namespaces-prefix feature.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void getFeature02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
-
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
- xmlFilter.setParent(xmlReader);
- assertFalse(xmlFilter.getFeature(NAMESPACE_PREFIXES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void getFeature02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ xmlFilter.setParent(spf.newSAXParser().getXMLReader());
+ assertFalse(xmlFilter.getFeature(NAMESPACE_PREFIXES));
}
/**
* SAXNotRecognizedException is expected when get a feature by an invalid
* feature name.
- * @throws org.xml.sax.SAXNotRecognizedException If the feature
- * value can't be assigned or retrieved from the parent.
- * @throws org.xml.sax.SAXNotSupportedException When the
- * parent recognizes the feature name but
- * cannot determine its value at this time.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = SAXNotRecognizedException.class)
- public void getFeature03() throws SAXNotRecognizedException,
- SAXNotSupportedException {
+ public void getFeature03() throws Exception {
new XMLFilterImpl().getFeature("no-meaning-feature");
}
/**
* Set namespaces feature to a value to XMLFilter. it's expected same when
* obtain it again.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void setFeature01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ public void setFeature01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
- xmlFilter.setParent(xmlReader);
- xmlFilter.setFeature(NAMESPACES, false);
- assertFalse(xmlFilter.getFeature(NAMESPACES));
- xmlFilter.setFeature(NAMESPACES, true);
- assertTrue(xmlFilter.getFeature(NAMESPACES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ xmlFilter.setParent(spf.newSAXParser().getXMLReader());
+ xmlFilter.setFeature(NAMESPACES, false);
+ assertFalse(xmlFilter.getFeature(NAMESPACES));
+ xmlFilter.setFeature(NAMESPACES, true);
+ assertTrue(xmlFilter.getFeature(NAMESPACES));
}
/**
* Set namespaces-prefix feature to a value to XMLFilter. it's expected same
* when obtain it again.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void setFeature02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ public void setFeature02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
- xmlFilter.setParent(xmlReader);
- xmlFilter.setFeature(NAMESPACE_PREFIXES, false);
- assertFalse(xmlFilter.getFeature(NAMESPACE_PREFIXES));
- xmlFilter.setFeature(NAMESPACE_PREFIXES, true);
- assertTrue(xmlFilter.getFeature(NAMESPACE_PREFIXES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ xmlFilter.setParent(spf.newSAXParser().getXMLReader());
+ xmlFilter.setFeature(NAMESPACE_PREFIXES, false);
+ assertFalse(xmlFilter.getFeature(NAMESPACE_PREFIXES));
+ xmlFilter.setFeature(NAMESPACE_PREFIXES, true);
+ assertTrue(xmlFilter.getFeature(NAMESPACE_PREFIXES));
}
/**
* NullPointerException is expected when parse a null InputSource.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void parse01() {
- try {
- new XMLFilterImpl().parse((InputSource)null);
- } catch (IOException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void parse01() throws Exception {
+ new XMLFilterImpl().parse((InputSource)null);
}
/**
* SAXException is expected when parsing a invalid formatted XML file.
- * @throws org.xml.sax.SAXException when parse a incorrect formatted XML
- * file.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void parse02() throws SAXException {
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void parse02() throws Exception {
try(FileInputStream fis = new FileInputStream(XML_DIR + "invalid.xml")) {
- InputSource is = new InputSource(fis);
- xmlFilter.parse(is);
- } catch (IOException ex) {
- failUnexpected(ex);
+ new XMLFilterImpl().parse(new InputSource(fis));
}
}
/**
* No exception when parse a normal XML file.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = NullPointerException.class)
- public void parse03() {
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = NullPointerException.class)
+ public void parse03() throws Exception {
try(FileInputStream fis = new FileInputStream(XML_DIR + "correct2.xml")) {
- InputSource is = new InputSource(fis);
- xmlFilter.parse(is);
- } catch (IOException | SAXException ex) {
- failUnexpected(ex);
+ new XMLFilterImpl().parse(new InputSource(fis));
}
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderAdapterTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderAdapterTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,10 +23,9 @@
package org.xml.sax.ptests;
import java.io.FileInputStream;
-import java.io.IOException;
-import javax.xml.parsers.ParserConfigurationException;
+import java.io.FilePermission;
import javax.xml.parsers.SAXParserFactory;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPBaseTest;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import org.testng.annotations.Test;
@@ -40,7 +39,7 @@
/**
* Class containing the test cases for XMLReaderAdapter API
*/
-public class XMLReaderAdapterTest {
+public class XMLReaderAdapterTest extends JAXPBaseTest {
/**
* http://xml.org/sax/features/namespace-prefixes property name.
*/
@@ -58,60 +57,51 @@
}
/**
- * To test the constructor that uses XMLReader
+ * To test the constructor that uses XMLReader.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void constructor02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
-
- assertNotNull(new XMLReaderAdapter(xmlReader));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void constructor02() throws Exception {
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ assertNotNull(new XMLReaderAdapter(xmlReader));
}
/**
* To test the parse method. The specification says that this method
* will throw an exception if the embedded XMLReader does not support
* the http://xml.org/sax/features/namespace-prefixes property.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void nsfeature01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- if (!xmlReader.getFeature(NM_PREFIXES_PROPERTY)) {
- xmlReader.setFeature(NM_PREFIXES_PROPERTY, true);
- }
-
- assertTrue(xmlReader.getFeature(NM_PREFIXES_PROPERTY));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
+ public void nsfeature01() throws Exception {
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ if (!xmlReader.getFeature(NM_PREFIXES_PROPERTY)) {
+ xmlReader.setFeature(NM_PREFIXES_PROPERTY, true);
}
+ assertTrue(xmlReader.getFeature(NM_PREFIXES_PROPERTY));
}
/**
* To test the parse method. The specification says that this method
* will throw an exception if the embedded XMLReader does not support
* the http://xml.org/sax/features/namespace-prefixes property.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void parse01() {
+ public void parse01() throws Exception {
+ setPermissions(new FilePermission(XML_DIR + "/-", "read"));
try (FileInputStream fis = new FileInputStream(XML_DIR + "namespace1.xml")) {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
if (!xmlReader.getFeature(NM_PREFIXES_PROPERTY)) {
xmlReader.setFeature(NM_PREFIXES_PROPERTY, true);
}
XMLReaderAdapter xmlRA = new XMLReaderAdapter(xmlReader);
-
- InputSource is = new InputSource(fis);
xmlRA.setDocumentHandler(new HandlerBase());
- xmlRA.parse(is);
- } catch (IOException | SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
+ xmlRA.parse(new InputSource(fis));
}
+ setPermissions();
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderFactoryTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderFactoryTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,6 +22,7 @@
*/
package org.xml.sax.ptests;
+import jaxp.library.JAXPBaseTest;
import static org.testng.Assert.assertNotNull;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
@@ -30,7 +31,7 @@
/**
* Unit test for XMLReaderFactory.createXMLReader API.
*/
-public class XMLReaderFactoryTest {
+public class XMLReaderFactoryTest extends JAXPBaseTest {
/**
* No exception expected when create XMLReader by default.
* @throws org.xml.sax.SAXException when xml reader creation failed.
@@ -48,12 +49,7 @@
*/
@Test
public void createReader02() throws SAXException {
- //Disable this test because this is only work for apache implementation.
- /*System.setProperty("org.xml.sax.driver",
- "org.apache.xerces.parsers.SAXParser");
- assertNotNull(XMLReaderFactory.
- createXMLReader("org.apache.xerces.parsers.SAXParser"));*/
- System.setProperty("org.xml.sax.driver",
+ setSystemProperty("org.xml.sax.driver",
"com.sun.org.apache.xerces.internal.parsers.SAXParser");
assertNotNull(XMLReaderFactory.
createXMLReader("com.sun.org.apache.xerces.internal.parsers.SAXParser"));
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderNSTableTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderNSTableTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,17 +23,14 @@
package org.xml.sax.ptests;
import java.io.FileInputStream;
-import java.io.IOException;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareWithGold;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertTrue;
import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
-import static org.xml.sax.ptests.SAXTestConst.CLASS_DIR;
import static org.xml.sax.ptests.SAXTestConst.GOLDEN_DIR;
import static org.xml.sax.ptests.SAXTestConst.XML_DIR;
@@ -41,7 +38,7 @@
* Namespace Table defined at
* http://www.megginson.com/SAX/Java/namespaces.html
*/
-public class XMLReaderNSTableTest {
+public class XMLReaderNSTableTest extends JAXPFileBaseTest {
/**
* XML file that used to be parsed.
*/
@@ -55,71 +52,70 @@
/**
* namespace processing is enabled. namespace-prefix is also is enabled.
* So it is a True-True combination.
- * The test is to test XMLReader with these conditions
+ * The test is to test XMLReader with these conditions.
+ *
+ * @throws Exception If any errors occur.
*/
- public void testWithTrueTrue() {
- String outputFile = CLASS_DIR + "XRNSTableTT.out";
+ public void testWithTrueTrue() throws Exception {
+ String outputFile = USER_DIR + "XRNSTableTT.out";
String goldFile = GOLDEN_DIR + "NSTableTTGF.out";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxParser = spf.newSAXParser();
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.setFeature(NAMESPACE_PREFIXES, true);
- XMLReader xmlReader = saxParser.getXMLReader();
- xmlReader.setFeature(NAMESPACE_PREFIXES, true);
-
- xmlReader.setContentHandler(new MyNSContentHandler(outputFile));
- xmlReader.parse(new InputSource(new FileInputStream(xmlFile)));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException | IOException ex) {
- failUnexpected(ex);
+ try (FileInputStream fis = new FileInputStream(xmlFile);
+ MyNSContentHandler handler = new MyNSContentHandler(outputFile);) {
+ xmlReader.setContentHandler(handler);
+ xmlReader.parse(new InputSource(fis));
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
/**
* Namespace processing is enabled. Hence namespace-prefix is
- * expected to be automaically off. So it is a True-False combination.
- * The test is to test XMLReader with these conditions
+ * expected to be automatically off. So it is a True-False combination.
+ * The test is to test XMLReader with these conditions.
+ *
+ * @throws Exception If any errors occur.
*/
- public void testWithTrueFalse() {
- String outputFile = CLASS_DIR + "XRNSTableTF.out";
+ public void testWithTrueFalse() throws Exception {
+ String outputFile = USER_DIR + "XRNSTableTF.out";
String goldFile = GOLDEN_DIR + "NSTableTFGF.out";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxParser = spf.newSAXParser();
- XMLReader xmlReader = saxParser.getXMLReader();
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ SAXParser saxParser = spf.newSAXParser();
+ XMLReader xmlReader = saxParser.getXMLReader();
- xmlReader.setContentHandler(new MyNSContentHandler(outputFile));
- xmlReader.parse(new InputSource(new FileInputStream(xmlFile)));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException | IOException ex) {
- failUnexpected(ex);
+ try (FileInputStream fis = new FileInputStream(xmlFile);
+ MyNSContentHandler handler = new MyNSContentHandler(outputFile)) {
+ xmlReader.setContentHandler(handler);
+ xmlReader.parse(new InputSource(fis));
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
/**
* namespace processing is not enabled. Hence namespace-prefix is
* expected to be automaically on. So it is a False-True combination.
- * The test is to test XMLReader with these conditions
+ * The test is to test XMLReader with these conditions.
+ *
+ * @throws Exception If any errors occur.
*/
- public void testWithFalseTrue() {
- String outputFile = CLASS_DIR + "XRNSTableFT.out";
+ public void testWithFalseTrue()throws Exception {
+ String outputFile = USER_DIR + "XRNSTableFT.out";
String goldFile = GOLDEN_DIR + "NSTableFTGF.out";
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- SAXParser saxParser = spf.newSAXParser();
- XMLReader xmlReader = saxParser.getXMLReader();
-
- xmlReader.setContentHandler(new MyNSContentHandler(outputFile));
- xmlReader.parse(new InputSource(new FileInputStream(xmlFile)));
- assertTrue(compareWithGold(goldFile, outputFile));
- } catch (ParserConfigurationException | SAXException | IOException ex) {
- failUnexpected(ex);
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ try (FileInputStream fis = new FileInputStream(xmlFile);
+ MyNSContentHandler handler = new MyNSContentHandler(outputFile)) {
+ xmlReader.setContentHandler(handler);
+ xmlReader.parse(new InputSource(fis));
}
+ assertTrue(compareWithGold(goldFile, outputFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/org/xml/sax/ptests/XMLReaderTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,10 +23,9 @@
package org.xml.sax.ptests;
import java.io.FileInputStream;
-import java.io.IOException;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
@@ -45,42 +44,43 @@
/**
* Class containing the test cases for SAXParser API
*/
-public class XMLReaderTest {
+public class XMLReaderTest extends JAXPFileReadOnlyBaseTest {
+
/**
* XML namespaces.
*/
- private static final String NAMESPACES =
- "http://xml.org/sax/features/namespaces";
+ private static final String NAMESPACES
+ = "http://xml.org/sax/features/namespaces";
/**
* XML namespaces prefixes.
*/
- private static final String NAMESPACE_PREFIXES =
- "http://xml.org/sax/features/namespace-prefixes";
+ private static final String NAMESPACE_PREFIXES
+ = "http://xml.org/sax/features/namespace-prefixes";
/**
* A string intern name.
*/
- private static final String STRING_INTERNING =
- "http://xml.org/sax/features/string-interning";
+ private static final String STRING_INTERNING
+ = "http://xml.org/sax/features/string-interning";
/**
* Validation name.
*/
- private static final String VALIDATION =
- "http://xml.org/sax/features/validation";
+ private static final String VALIDATION
+ = "http://xml.org/sax/features/validation";
/**
* A general external entities name
*/
- private static final String EXTERNAL_G_ENTITIES =
- "http://xml.org/sax/features/external-general-entities";
+ private static final String EXTERNAL_G_ENTITIES
+ = "http://xml.org/sax/features/external-general-entities";
/**
* A external parameter entities name
*/
- private static final String EXTERNAL_P_ENTITIES =
- "http://xml.org/sax/features/external-parameter-entities";
+ private static final String EXTERNAL_P_ENTITIES
+ = "http://xml.org/sax/features/external-parameter-entities";
/**
* XML DOM node name.
@@ -95,526 +95,444 @@
/**
* Declare handler name
*/
- private static final String DECL_HANDLER =
- "http://xml.org/sax/properties/declaration-handler";
+ private static final String DECL_HANDLER
+ = "http://xml.org/sax/properties/declaration-handler";
/**
* Lexical handler name
*/
- private static final String LEXICAL_HANDLER =
- "http://xml.org/sax/properties/lexical-handler";
+ private static final String LEXICAL_HANDLER
+ = "http://xml.org/sax/properties/lexical-handler";
/**
* According to the SAX2 specs, All XMLReaders are required to recognize the
- * http://xml.org/sax/features/namespaces feature names.
- * This test case is to test this.
+ * http://xml.org/sax/features/namespaces feature names. This test case is
+ * to test this.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureNS01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertFalse(xmlReader.getFeature(NAMESPACES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void featureNS01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertFalse(xmlReader.getFeature(NAMESPACES));
}
/**
* According to the SAX2 specs, All XMLReaders are required to recognize the
- * http://xml.org/sax/features/namespaces feature names.
- * This test case is to test this.
+ * http://xml.org/sax/features/namespaces feature names. This test case is
+ * to test this.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureNS02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertTrue(xmlReader.getFeature(NAMESPACES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void featureNS02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertTrue(xmlReader.getFeature(NAMESPACES));
}
/**
* Obtain http://xml.org/sax/features/namespaces feature name after it's
* just set. Expect it's same as set value.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureNS03() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setFeature(NAMESPACES, true);
- assertTrue(xmlReader.getFeature(NAMESPACES));
- xmlReader.setFeature(NAMESPACES, false);
- assertFalse(xmlReader.getFeature(NAMESPACES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void featureNS03() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.setFeature(NAMESPACES, true);
+ assertTrue(xmlReader.getFeature(NAMESPACES));
+ xmlReader.setFeature(NAMESPACES, false);
+ assertFalse(xmlReader.getFeature(NAMESPACES));
}
/**
* According to the SAX2 specs, All XMLReaders are required to recognize the
- * http://xml.org/sax/features/namespace-prefixes feature names.
- * This test case is to test this.
+ * http://xml.org/sax/features/namespace-prefixes feature names. This test
+ * case is to test this.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureNSP01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
-
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void featureNSP01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
}
/**
* According to the SAX2 specs, All XMLReaders are required to recognize the
- * http://xml.org/sax/features/namespace-prefixes feature names.
- * This test case is to test this.
+ * http://xml.org/sax/features/namespace-prefixes feature names. This test
+ * case is to test this.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureNSP02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void featureNSP02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
}
/**
* Obtain http://xml.org/sax/features/namespaces-prefixes feature name after
* it's just set. Expect it's same as set value.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureNSP03() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setFeature(NAMESPACE_PREFIXES, true);
- assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
- xmlReader.setFeature(NAMESPACE_PREFIXES, false);
- assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
- } catch (ParserConfigurationException | SAXException ex) {
- failUnexpected(ex);
- }
+ public void featureNSP03() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.setFeature(NAMESPACE_PREFIXES, true);
+ assertTrue(xmlReader.getFeature(NAMESPACE_PREFIXES));
+ xmlReader.setFeature(NAMESPACE_PREFIXES, false);
+ assertFalse(xmlReader.getFeature(NAMESPACE_PREFIXES));
}
/**
* getFeature returns true if a feature has not been preset when namespace
* awareness is set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureSI01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertTrue(xmlReader.getFeature(STRING_INTERNING));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void featureSI01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertTrue(xmlReader.getFeature(STRING_INTERNING));
}
/**
* getFeature with validation feature name returns the value that
* setValidation set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureV01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- assertFalse(spf.newSAXParser().getXMLReader().getFeature(VALIDATION));
- spf.setValidating(true);
- assertTrue(spf.newSAXParser().getXMLReader().getFeature(VALIDATION));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void featureV01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ assertFalse(spf.newSAXParser().getXMLReader().getFeature(VALIDATION));
+ spf.setValidating(true);
+ assertTrue(spf.newSAXParser().getXMLReader().getFeature(VALIDATION));
}
/**
- * getFeature returns the value that a feature has been preset as when
+ * getFeature returns the value that a feature has been preset as when
* namespace awareness is set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureV02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ public void featureV02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setFeature(VALIDATION, true);
- assertTrue(xmlReader.getFeature(VALIDATION));
-
- xmlReader.setFeature(VALIDATION, false);
- assertFalse(xmlReader.getFeature(VALIDATION));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ xmlReader.setFeature(VALIDATION, true);
+ assertTrue(xmlReader.getFeature(VALIDATION));
+ xmlReader.setFeature(VALIDATION, false);
+ assertFalse(xmlReader.getFeature(VALIDATION));
}
/**
* getFeature returns true if a feature has not been preset when namespace
* awareness is set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureEGE01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertTrue(xmlReader.getFeature(EXTERNAL_G_ENTITIES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void featureEGE01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertTrue(xmlReader.getFeature(EXTERNAL_G_ENTITIES));
}
/**
- * getFeature returns false if a feature has been preset as false when
+ * getFeature returns false if a feature has been preset as false when
* namespace awareness is set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureEGE02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setFeature(EXTERNAL_G_ENTITIES, false);
- assertFalse(xmlReader.getFeature(EXTERNAL_G_ENTITIES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void featureEGE02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.setFeature(EXTERNAL_G_ENTITIES, false);
+ assertFalse(xmlReader.getFeature(EXTERNAL_G_ENTITIES));
}
/**
* getFeature returns true if a feature has not been preset when namespace
* awareness is set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureEPE01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertTrue(xmlReader.getFeature(EXTERNAL_P_ENTITIES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void featureEPE01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertTrue(xmlReader.getFeature(EXTERNAL_P_ENTITIES));
}
/**
- * getFeature returns false if a feature has been preset as false when
+ * getFeature returns false if a feature has been preset as false when
* namespace awareness is set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void featureEPE02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setFeature(EXTERNAL_P_ENTITIES, false);
- assertFalse(xmlReader.getFeature(EXTERNAL_P_ENTITIES));
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void featureEPE02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.setFeature(EXTERNAL_P_ENTITIES, false);
+ assertFalse(xmlReader.getFeature(EXTERNAL_P_ENTITIES));
}
/**
* getFeature with a unknown feature name throws SAXNotRecognizedException.
- * @throws SAXNotRecognizedException If the feature value can't be assigned
- * or retrieved.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = SAXNotRecognizedException.class)
- public void featureNE01() throws SAXNotRecognizedException {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- boolean noMeaningFeature = xmlReader.getFeature("no-meaning-feature");
- } catch(SAXNotRecognizedException ex) {
- throw ex;
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void featureNE01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.newSAXParser().getXMLReader().getFeature("no-meaning-feature");
}
/**
* No exception expected when set entity resolver as simple entity resolver.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void entity01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
- xmlReader.setEntityResolver(xmlFilter);
- assertNotNull(xmlReader.getEntityResolver());
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void entity01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ xmlReader.setEntityResolver(xmlFilter);
+ assertEquals(xmlReader.getEntityResolver(), xmlFilter);
}
/**
* No NPE expected when set entity resolver as null.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void entity02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setEntityResolver(null);
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void entity02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.newSAXParser().getXMLReader().setEntityResolver(null);
}
/**
* No exception expected when set DTD handler as simple DTD handler.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void dtdhandler01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
- xmlReader.setDTDHandler(xmlFilter);
- assertNotNull(xmlReader.getDTDHandler());
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void dtdhandler01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ xmlReader.setDTDHandler(xmlFilter);
+ assertEquals(xmlReader.getDTDHandler(), xmlFilter);
}
/**
* No NPE expected when set DTD handler as null.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void dtdhandler02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setDTDHandler(null);
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void dtdhandler02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.newSAXParser().getXMLReader().setDTDHandler(null);
}
/**
* No exception expected when set content handler as simple content handler.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void contenthandler01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- XMLFilterImpl xmlFilter = new XMLFilterImpl();
- xmlReader.setContentHandler(xmlFilter);
- assertNotNull(xmlReader.getContentHandler());
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void contenthandler01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ XMLFilterImpl xmlFilter = new XMLFilterImpl();
+ xmlReader.setContentHandler(xmlFilter);
+ assertEquals(xmlReader.getContentHandler(), xmlFilter);
}
/**
* No NPE expected when set content handler as null.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void contenthandler02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setContentHandler(null);
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void contenthandler02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.newSAXParser().getXMLReader().setContentHandler(null);
}
/**
* No exception expected when set content handler as simple error handler.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void errorhandler01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setErrorHandler(new XMLFilterImpl());
- assertNotNull(xmlReader.getErrorHandler());
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void errorhandler01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.setErrorHandler(new XMLFilterImpl());
+ assertNotNull(xmlReader.getErrorHandler());
}
/**
* No NPE expected when set error handler as null.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void errorhandler02() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.setErrorHandler(null);
- } catch (SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
- }
+ public void errorhandler02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.setErrorHandler(null);
}
/**
* Parse a null input source throw NPE.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = NullPointerException.class)
- public void parse01() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.parse((InputSource)null);
- } catch (SAXException | ParserConfigurationException | IOException ex) {
- failUnexpected(ex);
- }
+ public void parse01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.newSAXParser().getXMLReader().parse((InputSource) null);
}
/**
* Unit test for parse a error-formatted file. SAXException is expected.
- * @throws org.xml.sax.SAXException parsing failed.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test(expectedExceptions = SAXException.class)
- public void parse02() throws SAXException {
- try (FileInputStream fis = new FileInputStream(XML_DIR + "invalid.xml")){
+ @Test(groups = {"readLocalFiles"}, expectedExceptions = SAXException.class)
+ public void parse02() throws Exception {
+ try (FileInputStream fis = new FileInputStream(XML_DIR + "invalid.xml")) {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- InputSource is = new InputSource(fis);
- xmlReader.parse(is);
- } catch (ParserConfigurationException | IOException ex) {
- failUnexpected(ex);
+ spf.newSAXParser().getXMLReader().parse(new InputSource(fis));
}
}
/**
* Unit test for parse a well-formatted file. No exception is expected.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void parse03(){
+ @Test(groups = {"readLocalFiles"})
+ public void parse03() throws Exception {
try (FileInputStream fis = new FileInputStream(XML_DIR + "correct2.xml")) {
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setNamespaceAware(true);
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- InputSource is = new InputSource(fis);
- xmlReader.parse(is);
- } catch (IOException | SAXException | ParserConfigurationException ex) {
- failUnexpected(ex);
+ spf.newSAXParser().getXMLReader().parse(new InputSource(fis));
}
}
/**
- * Modified by IBM
- * Xerces does not support this feature and it is not mandatory
- * @throws org.xml.sax.SAXNotSupportedException
+ * Modified by IBM Xerces does not support this feature and it is not
+ * mandatory.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = SAXNotSupportedException.class)
- public void xrProperty01() throws SAXNotSupportedException {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- xmlReader.getProperty(XML_STRING);
- } catch(SAXNotSupportedException ex) {
- throw ex;
- } catch (SAXException | ParserConfigurationException ex){
- failUnexpected(ex);
- }
+ public void xrProperty01() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ xmlReader.getProperty(XML_STRING);
}
/**
* SAXNotSupportedException thrown if property name is known but no value
* assigned to this property.
- * @throws org.xml.sax.SAXNotSupportedException when XMLReader recognizes
- * the property name but cannot determine its value at this time.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = SAXNotSupportedException.class)
- public void xrProperty02() throws SAXNotSupportedException {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertNull(xmlReader.getProperty(DOM_NODE));
- } catch (SAXNotSupportedException ex) {
- throw ex;
- } catch (SAXException | ParserConfigurationException ex){
- failUnexpected(ex);
- }
+ public void xrProperty02() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertNull(xmlReader.getProperty(DOM_NODE));
}
-
/**
* XMLReader.getProperty returns null if LEXICAL_HANDLER wasn't set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void xrProperty03() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertNull(xmlReader.getProperty(LEXICAL_HANDLER));
- } catch (SAXException | ParserConfigurationException ex){
- failUnexpected(ex);
- }
+ public void xrProperty03() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertNull(xmlReader.getProperty(LEXICAL_HANDLER));
}
/**
* XMLReader.getProperty returns null if DECL_HANDLER wasn't set.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void xrProperty04() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- assertNull(xmlReader.getProperty(DECL_HANDLER));
- } catch (SAXException | ParserConfigurationException ex){
- failUnexpected(ex);
- }
+ public void xrProperty04() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ assertNull(xmlReader.getProperty(DECL_HANDLER));
}
/**
* XMLReader.setProperty/getProperty for LEXICAL_HANDLER unit test.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void xrProperty05() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- MyLexicalHandler myLexicalHandler = new MyLexicalHandler();
- xmlReader.setProperty(LEXICAL_HANDLER, myLexicalHandler);
- assertNotNull(xmlReader.getProperty(LEXICAL_HANDLER));
- } catch (SAXException | ParserConfigurationException ex){
- failUnexpected(ex);
- }
+ public void xrProperty05() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ MyLexicalHandler myLexicalHandler = new MyLexicalHandler();
+ xmlReader.setProperty(LEXICAL_HANDLER, myLexicalHandler);
+ assertNotNull(xmlReader.getProperty(LEXICAL_HANDLER));
}
/**
* XMLReader.setProperty/getProperty for DECL_HANDLER unit test.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void xrProperty06() {
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
- MyDeclHandler myDeclHandler = new MyDeclHandler();
- xmlReader.setProperty(DECL_HANDLER, myDeclHandler);
- assertNotNull(xmlReader.getProperty(DECL_HANDLER));
- } catch (ParserConfigurationException | SAXException ex){
- failUnexpected(ex);
- }
+ public void xrProperty06() throws Exception {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+ MyDeclHandler myDeclHandler = new MyDeclHandler();
+ xmlReader.setProperty(DECL_HANDLER, myDeclHandler);
+ assertNotNull(xmlReader.getProperty(DECL_HANDLER));
}
}
@@ -622,6 +540,7 @@
* Simple LexicalHandler that skips every lexical event.
*/
class MyLexicalHandler implements LexicalHandler {
+
/**
* Report an XML comment anywhere in the document.
*
@@ -667,8 +586,10 @@
* Report the start of DTD declarations, if any.
*
* @param name The document type name.
- * @param publicId The declared public identifier for the external DTD subset.
- * @param systemId The declared system identifier for the external DTD subset.
+ * @param publicId The declared public identifier for the external DTD
+ * subset.
+ * @param systemId The declared system identifier for the external DTD
+ * subset.
*/
@Override
public void startDTD(String name, String publicId, String systemId) {
@@ -688,16 +609,17 @@
* Simple DeclHandler that skips every DTD declaration event.
*/
class MyDeclHandler implements DeclHandler {
+
/**
* Report an attribute type declaration.
+ *
* @param eName The name of the associated element.
* @param aName The name of the attribute.
* @param type A string representing the attribute type.
* @param mode A string representing the attribute defaulting mode
- * ("#IMPLIED", "#REQUIRED", or "#FIXED") or null if
- * none of these applies.
- * @param value A string representing the attribute's default value,
- * or null if there is none.
+ * ("#IMPLIED", "#REQUIRED", or "#FIXED") or null if none of these applies.
+ * @param value A string representing the attribute's default value, or null
+ * if there is none.
*/
@Override
public void attributeDecl(String eName, String aName, String type,
@@ -706,6 +628,7 @@
/**
* Report an element type declaration.
+ *
* @param name The element type name.
* @param model The content model as a normalized string.
*/
@@ -715,10 +638,11 @@
/**
* Report a parsed external entity declaration.
- * @param name The name of the entity. If it is a parameter
- * entity, the name will begin with '%'.
- * @param publicId The entity's public identifier, or null if none
- * was given.
+ *
+ * @param name The name of the entity. If it is a parameter entity, the name
+ * will begin with '%'.
+ * @param publicId The entity's public identifier, or null if none was
+ * given.
* @param systemId The entity's system identifier.
*/
@Override
@@ -728,8 +652,9 @@
/**
* Report an internal entity declaration.
- * @param name The name of the entity. If it is a parameter
- * entity, the name will begin with '%'.
+ *
+ * @param name The name of the entity. If it is a parameter entity, the name
+ * will begin with '%'.
* @param value The replacement text of the entity.
*/
@Override
--- a/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/AuctionController.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/AuctionController.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,23 +27,18 @@
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
-
import java.io.File;
import java.io.FileInputStream;
-import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.nio.file.Paths;
import java.util.GregorianCalendar;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
-
-import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.Duration;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.dom.DOMResult;
@@ -51,8 +46,8 @@
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
+import jaxp.library.JAXPFileReadOnlyBaseTest;
import static jaxp.library.JAXPTestUtilities.bomStream;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import org.testng.annotations.Test;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMConfiguration;
@@ -63,173 +58,160 @@
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSSerializer;
-import org.xml.sax.SAXException;
import static test.auctionportal.HiBidConstants.PORTAL_ACCOUNT_NS;
import static test.auctionportal.HiBidConstants.XML_DIR;
/**
* This is the user controller class for the Auction portal HiBid.com.
*/
-public class AuctionController {
+public class AuctionController extends JAXPFileReadOnlyBaseTest {
/**
* Check for DOMErrorHandler handling DOMError. Before fix of bug 4890927
* DOMConfiguration.setParameter("well-formed",true) throws an exception.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCreateNewItem2Sell() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCreateNewItem2Sell() throws Exception {
String xmlFile = XML_DIR + "novelsInvalid.xml";
- try {
- Document document = DocumentBuilderFactory.newInstance()
- .newDocumentBuilder().parse(xmlFile);
+ Document document = DocumentBuilderFactory.newInstance()
+ .newDocumentBuilder().parse(xmlFile);
- document.getDomConfig().setParameter("well-formed", true);
+ document.getDomConfig().setParameter("well-formed", true);
- DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
- DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
- MyDOMOutput domOutput = new MyDOMOutput();
- domOutput.setByteStream(System.out);
- LSSerializer writer = impl.createLSSerializer();
- writer.write(document, domOutput);
- } catch (ParserConfigurationException | SAXException | IOException
- | ClassNotFoundException | InstantiationException
- | IllegalAccessException | ClassCastException e) {
- failUnexpected(e);
- }
+ DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
+ DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
+ MyDOMOutput domOutput = new MyDOMOutput();
+ domOutput.setByteStream(System.out);
+ LSSerializer writer = impl.createLSSerializer();
+ writer.write(document, domOutput);
}
/**
* Check for DOMErrorHandler handling DOMError. Before fix of bug 4896132
* test throws DOM Level 1 node error.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCreateNewItem2SellRetry() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCreateNewItem2SellRetry() throws Exception {
String xmlFile = XML_DIR + "accountInfo.xml";
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- Document document = dbf.newDocumentBuilder().parse(xmlFile);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ Document document = dbf.newDocumentBuilder().parse(xmlFile);
- DOMConfiguration domConfig = document.getDomConfig();
- MyDOMErrorHandler errHandler = new MyDOMErrorHandler();
- domConfig.setParameter("error-handler", errHandler);
+ DOMConfiguration domConfig = document.getDomConfig();
+ MyDOMErrorHandler errHandler = new MyDOMErrorHandler();
+ domConfig.setParameter("error-handler", errHandler);
- DOMImplementationLS impl =
- (DOMImplementationLS) DOMImplementationRegistry.newInstance()
- .getDOMImplementation("LS");
- LSSerializer writer = impl.createLSSerializer();
- MyDOMOutput domoutput = new MyDOMOutput();
-
- domoutput.setByteStream(System.out);
- writer.write(document, domoutput);
+ DOMImplementationLS impl =
+ (DOMImplementationLS) DOMImplementationRegistry.newInstance()
+ .getDOMImplementation("LS");
+ LSSerializer writer = impl.createLSSerializer();
+ MyDOMOutput domoutput = new MyDOMOutput();
- document.normalizeDocument();
- writer.write(document, domoutput);
- assertFalse(errHandler.isError());
- } catch (ParserConfigurationException | SAXException | IOException
- | ClassNotFoundException | InstantiationException
- | IllegalAccessException | ClassCastException e) {
- failUnexpected(e);
- }
+ domoutput.setByteStream(System.out);
+ writer.write(document, domoutput);
+
+ document.normalizeDocument();
+ writer.write(document, domoutput);
+ assertFalse(errHandler.isError());
}
/**
* Check if setting the attribute to be of type ID works. This will affect
* the Attr.isID method according to the spec.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCreateID() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCreateID() throws Exception {
String xmlFile = XML_DIR + "accountInfo.xml";
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
- Document document = dbf.newDocumentBuilder().parse(xmlFile);
- Element account = (Element)document
- .getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
+ Document document = dbf.newDocumentBuilder().parse(xmlFile);
+ Element account = (Element)document
+ .getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
- account.setIdAttributeNS(PORTAL_ACCOUNT_NS, "accountID", true);
- Attr aID = account.getAttributeNodeNS(PORTAL_ACCOUNT_NS, "accountID");
- assertTrue(aID.isId());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ account.setIdAttributeNS(PORTAL_ACCOUNT_NS, "accountID", true);
+ Attr aID = account.getAttributeNodeNS(PORTAL_ACCOUNT_NS, "accountID");
+ assertTrue(aID.isId());
}
/**
* Check the user data on the node.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testCheckingUserData() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckingUserData() throws Exception {
String xmlFile = XML_DIR + "accountInfo.xml";
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document document = docBuilder.parse(xmlFile);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ Document document = docBuilder.parse(xmlFile);
- Element account = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
- assertEquals(account.getNodeName(), "acc:Account");
- Element firstName = (Element) document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "FirstName").item(0);
- assertEquals(firstName.getNodeName(), "FirstName");
+ Element account = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
+ assertEquals(account.getNodeName(), "acc:Account");
+ Element firstName = (Element) document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "FirstName").item(0);
+ assertEquals(firstName.getNodeName(), "FirstName");
- Document doc1 = docBuilder.newDocument();
- Element someName = doc1.createElement("newelem");
+ Document doc1 = docBuilder.newDocument();
+ Element someName = doc1.createElement("newelem");
- someName.setUserData("mykey", "dd",
- (operation, key, data, src, dst) -> {
- System.err.println("In UserDataHandler" + key);
- System.out.println("In UserDataHandler");
- });
- Element impAccount = (Element)document.importNode(someName, true);
- assertEquals(impAccount.getNodeName(), "newelem");
- document.normalizeDocument();
- String data = (someName.getUserData("mykey")).toString();
- assertEquals(data, "dd");
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ someName.setUserData("mykey", "dd",
+ (operation, key, data, src, dst) -> {
+ System.err.println("In UserDataHandler" + key);
+ System.out.println("In UserDataHandler");
+ });
+ Element impAccount = (Element)document.importNode(someName, true);
+ assertEquals(impAccount.getNodeName(), "newelem");
+ document.normalizeDocument();
+ String data = (someName.getUserData("mykey")).toString();
+ assertEquals(data, "dd");
}
/**
* Check the UTF-16 XMLEncoding xml file.
+ *
+ * @throws Exception If any errors occur.
* @see <a href="content/movies.xml">movies.xml</a>
*/
- @Test
- public void testCheckingEncoding() {
+ @Test(groups = {"readLocalFiles"})
+ public void testCheckingEncoding() throws Exception {
// Note since movies.xml is UTF-16 encoding. We're not using stanard XML
// file suffix.
String xmlFile = XML_DIR + "movies.xml.data";
- //try (FileInputStream is = new FileInputStream(xmlFile)) {
- try {
+ try (InputStream source = bomStream("UTF-16", xmlFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
- InputStream source = bomStream("UTF-16", xmlFile);
Document document = dbf.newDocumentBuilder().parse(source);
assertEquals(document.getXmlEncoding(), "UTF-16");
assertEquals(document.getXmlStandalone(), true);
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
}
}
/**
* Check validation API features. A schema which is including in Bug 4909119
* used to be testing for the functionalities.
+ *
+ * @throws Exception If any errors occur.
* @see <a href="content/userDetails.xsd">userDetails.xsd</a>
*/
- @Test
- public void testGetOwnerInfo() {
+ @Test(groups = {"readLocalFiles"})
+ public void testGetOwnerInfo() throws Exception {
String schemaFile = XML_DIR + "userDetails.xsd";
String xmlFile = XML_DIR + "userDetails.xml";
- try {
+ try(FileInputStream fis = new FileInputStream(xmlFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
@@ -244,27 +226,27 @@
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
docBuilder.setErrorHandler(eh);
- Document document = docBuilder.parse(new FileInputStream(xmlFile));
+ Document document = docBuilder.parse(fis);
DOMResult dResult = new DOMResult();
DOMSource domSource = new DOMSource(document);
validator.validate(domSource, dResult);
assertFalse(eh.isAnyError());
- } catch (SAXException | ParserConfigurationException | IOException e) {
- failUnexpected(e);
}
}
/**
* Check grammar caching with imported schemas.
+ *
+ * @throws Exception If any errors occur.
* @see <a href="content/coins.xsd">coins.xsd</a>
* @see <a href="content/coinsImportMe.xsd">coinsImportMe.xsd</a>
*/
- @Test
- public void testGetOwnerItemList() {
+ @Test(groups = {"readLocalFiles"})
+ public void testGetOwnerItemList() throws Exception {
String xsdFile = XML_DIR + "coins.xsd";
String xmlFile = XML_DIR + "coins.xml";
- try {
+ try(FileInputStream fis = new FileInputStream(xmlFile)) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
@@ -278,11 +260,9 @@
validator.setErrorHandler(eh);
DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- Document document = docBuilder.parse(new FileInputStream(xmlFile));
+ Document document = docBuilder.parse(fis);
validator.validate(new DOMSource(document), new DOMResult());
assertFalse(eh.isAnyError());
- } catch (SAXException | ParserConfigurationException | IOException e) {
- failUnexpected(e);
}
}
@@ -291,96 +271,88 @@
* Check for the same imported schemas but will use SAXParserFactory and try
* parsing using the SAXParser. SCHEMA_SOURCE attribute is using for this
* test.
+ *
+ * @throws Exception If any errors occur.
* @see <a href="content/coins.xsd">coins.xsd</a>
* @see <a href="content/coinsImportMe.xsd">coinsImportMe.xsd</a>
*/
- @Test
- public void testGetOwnerItemList1() {
+ @Test(groups = {"readLocalFiles"})
+ public void testGetOwnerItemList1() throws Exception {
String xsdFile = XML_DIR + "coins.xsd";
String xmlFile = XML_DIR + "coins.xml";
-
- try {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- spf.setValidating(true);
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.setValidating(true);
- SAXParser sp = spf.newSAXParser();
- sp.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
- sp.setProperty(JAXP_SCHEMA_SOURCE, xsdFile);
+ SAXParser sp = spf.newSAXParser();
+ sp.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
+ sp.setProperty(JAXP_SCHEMA_SOURCE, xsdFile);
- MyErrorHandler eh = new MyErrorHandler();
- sp.parse(new File(xmlFile), eh);
- assertFalse(eh.isAnyError());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ MyErrorHandler eh = new MyErrorHandler();
+ sp.parse(new File(xmlFile), eh);
+ assertFalse(eh.isAnyError());
}
/**
* Check usage of javax.xml.datatype.Duration class.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testGetItemDuration() {
+ @Test(groups = {"readLocalFiles"})
+ public void testGetItemDuration() throws Exception {
String xmlFile = XML_DIR + "itemsDuration.xml";
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- Document document = dbf.newDocumentBuilder().parse(xmlFile);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ Document document = dbf.newDocumentBuilder().parse(xmlFile);
- Element durationElement = (Element) document.getElementsByTagName("sellDuration").item(0);
-
- NodeList childList = durationElement.getChildNodes();
+ Element durationElement = (Element) document.getElementsByTagName("sellDuration").item(0);
- for (int i = 0; i < childList.getLength(); i++) {
- System.out.println("child " + i + childList.item(i));
- }
+ NodeList childList = durationElement.getChildNodes();
- Duration duration = DatatypeFactory.newInstance().newDuration("P365D");
- Duration sellDuration = DatatypeFactory.newInstance().newDuration(childList.item(0).getNodeValue());
- assertFalse(sellDuration.isShorterThan(duration));
- assertFalse(sellDuration.isLongerThan(duration));
- assertEquals(sellDuration.getField(DatatypeConstants.DAYS), BigInteger.valueOf(365));
- assertEquals(sellDuration.normalizeWith(new GregorianCalendar(1999, 2, 22)), duration);
+ for (int i = 0; i < childList.getLength(); i++) {
+ System.out.println("child " + i + childList.item(i));
+ }
- Duration myDuration = sellDuration.add(duration);
- assertEquals(myDuration.normalizeWith(new GregorianCalendar(2003, 2, 22)),
- DatatypeFactory.newInstance().newDuration("P730D"));
- } catch (ParserConfigurationException | DatatypeConfigurationException
- | SAXException | IOException e) {
- failUnexpected(e);
- }
+ Duration duration = DatatypeFactory.newInstance().newDuration("P365D");
+ Duration sellDuration = DatatypeFactory.newInstance().newDuration(childList.item(0).getNodeValue());
+ assertFalse(sellDuration.isShorterThan(duration));
+ assertFalse(sellDuration.isLongerThan(duration));
+ assertEquals(sellDuration.getField(DatatypeConstants.DAYS), BigInteger.valueOf(365));
+ assertEquals(sellDuration.normalizeWith(new GregorianCalendar(1999, 2, 22)), duration);
+
+ Duration myDuration = sellDuration.add(duration);
+ assertEquals(myDuration.normalizeWith(new GregorianCalendar(2003, 2, 22)),
+ DatatypeFactory.newInstance().newDuration("P730D"));
}
/**
* Check usage of TypeInfo interface introduced in DOM L3.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testGetTypeInfo() {
+ @Test(groups = {"readLocalFiles"})
+ public void testGetTypeInfo() throws Exception {
String xmlFile = XML_DIR + "accountInfo.xml";
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- dbf.setValidating(true);
- dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(true);
+ dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- docBuilder.setErrorHandler(new MyErrorHandler());
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ docBuilder.setErrorHandler(new MyErrorHandler());
- Document document = docBuilder.parse(xmlFile);
- Element userId = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "UserID").item(0);
- TypeInfo typeInfo = userId.getSchemaTypeInfo();
- assertTrue(typeInfo.getTypeName().equals("nonNegativeInteger"));
- assertTrue(typeInfo.getTypeNamespace().equals(W3C_XML_SCHEMA_NS_URI));
+ Document document = docBuilder.parse(xmlFile);
+ Element userId = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "UserID").item(0);
+ TypeInfo typeInfo = userId.getSchemaTypeInfo();
+ assertTrue(typeInfo.getTypeName().equals("nonNegativeInteger"));
+ assertTrue(typeInfo.getTypeNamespace().equals(W3C_XML_SCHEMA_NS_URI));
- Element role = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Role").item(0);
- TypeInfo roletypeInfo = role.getSchemaTypeInfo();
- assertTrue(roletypeInfo.getTypeName().equals("BuyOrSell"));
- assertTrue(roletypeInfo.getTypeNamespace().equals(PORTAL_ACCOUNT_NS));
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ Element role = (Element)document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Role").item(0);
+ TypeInfo roletypeInfo = role.getSchemaTypeInfo();
+ assertTrue(roletypeInfo.getTypeName().equals("BuyOrSell"));
+ assertTrue(roletypeInfo.getTypeNamespace().equals(PORTAL_ACCOUNT_NS));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/AuctionItemRepository.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/AuctionItemRepository.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,39 +30,31 @@
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
-import java.io.IOException;
+import java.io.FilePermission;
import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import static javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
-import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareDocumentWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertFalse;
-
import org.testng.annotations.Test;
import org.w3c.dom.Document;
-import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
-import static test.auctionportal.HiBidConstants.CLASS_DIR;
import static test.auctionportal.HiBidConstants.GOLDEN_DIR;
import static test.auctionportal.HiBidConstants.XML_DIR;
/**
* This is a test class for the Auction portal HiBid.com.
*/
-public class AuctionItemRepository {
+public class AuctionItemRepository extends JAXPFileBaseTest {
/**
* XML file for parsing.
*/
@@ -78,94 +70,92 @@
* document that has more than two levels of entity expansion is parsed or
* not. Previous system property was changed to jdk.xml.entityExpansionLimit
* see http://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testEntityExpansionSAXPos() {
- try {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- // Secure processing will limit XML processing to conform to
- // implementation limits.
- factory.setFeature(FEATURE_SECURE_PROCESSING, true);
- // Set entityExpansionLimit as 2 should expect fatalError
- System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(128000));
- SAXParser parser = factory.newSAXParser();
+ public void testEntityExpansionSAXPos() throws Exception {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ // Secure processing will limit XML processing to conform to
+ // implementation limits.
+ factory.setFeature(FEATURE_SECURE_PROCESSING, true);
+ // Set entityExpansionLimit as 2 should expect fatalError
+ setSystemProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(128000));
+ SAXParser parser = factory.newSAXParser();
- MyErrorHandler fatalHandler = new MyErrorHandler();
- parser.parse(new File(ENTITY_XML), fatalHandler);
- assertFalse(fatalHandler.isAnyError());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ MyErrorHandler fatalHandler = new MyErrorHandler();
+ setPermissions(new FilePermission(ENTITY_XML, "read"));
+ parser.parse(new File(ENTITY_XML), fatalHandler);
+ assertFalse(fatalHandler.isAnyError());
}
/**
* Setting the EntityExpansion Limit to 2 and checks if the XML
* document that has more than two levels of entity expansion is parsed or
* not. Previous system property was changed to jdk.xml.entityExpansionLimit
* see http://docs.oracle.com/javase/tutorial/jaxp/limits/limits.html.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = SAXParseException.class)
- public void testEntityExpansionSAXNeg() throws SAXParseException {
- //
- try {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- // Secure processing will limit XML processing to conform to
- // implementation limits.
- factory.setFeature(FEATURE_SECURE_PROCESSING, true);
- // Set entityExpansionLimit as 2 should expect SAXParseException
- System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(2));
- SAXParser parser = factory.newSAXParser();
+ public void testEntityExpansionSAXNeg() throws Exception {
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ // Secure processing will limit XML processing to conform to
+ // implementation limits.
+ factory.setFeature(FEATURE_SECURE_PROCESSING, true);
+ // Set entityExpansionLimit as 2 should expect SAXParseException.
+ setSystemProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(2));
- MyErrorHandler fatalHandler = new MyErrorHandler();
- parser.parse(new File(ENTITY_XML), fatalHandler);
- } catch (SAXParseException e) {
- throw e;
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ SAXParser parser = factory.newSAXParser();
+ MyErrorHandler fatalHandler = new MyErrorHandler();
+ setPermissions(new FilePermission(ENTITY_XML, "read"));
+ parser.parse(new File(ENTITY_XML), fatalHandler);
}
/**
* Testing set MaxOccursLimit to 10000 in the secure processing enabled for
* SAXParserFactory.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testMaxOccurLimitPos() {
+ public void testMaxOccurLimitPos() throws Exception {
String schema_file = XML_DIR + "toys.xsd";
String xml_file = XML_DIR + "toys.xml";
-
+ SAXParserFactory factory = SAXParserFactory.newInstance();
+ factory.setValidating(true);
+ factory.setFeature(FEATURE_SECURE_PROCESSING, true);
+ setSystemProperty(SP_MAX_OCCUR_LIMIT, String.valueOf(10000));
+ SAXParser parser = factory.newSAXParser();
+ parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
+ setPermissions(new FilePermission(XML_DIR + "-", "read"));
+ parser.setProperty(JAXP_SCHEMA_SOURCE, new File(schema_file));
try (InputStream is = new FileInputStream(xml_file)) {
- SAXParserFactory factory = SAXParserFactory.newInstance();
- factory.setValidating(true);
- factory.setFeature(FEATURE_SECURE_PROCESSING, true);
- System.setProperty(SP_MAX_OCCUR_LIMIT, String.valueOf(10000));
- SAXParser parser = factory.newSAXParser();
- parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
- parser.setProperty(JAXP_SCHEMA_SOURCE, new File(schema_file));
MyErrorHandler eh = new MyErrorHandler();
parser.parse(is, eh);
assertFalse(eh.isAnyError());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
}
}
/**
* Use a DocumentBuilder to create a DOM object and see if Secure Processing
* feature affects the entity expansion.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testEntityExpansionDOMPos() {
+ public void testEntityExpansionDOMPos() throws Exception {
+ DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
+ dfactory.setFeature(FEATURE_SECURE_PROCESSING, true);
+ setSystemProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(10000));
+ DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
+ MyErrorHandler eh = new MyErrorHandler();
+ dBuilder.setErrorHandler(eh);
try {
- DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
- dfactory.setFeature(FEATURE_SECURE_PROCESSING, true);
- System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(10000));
- DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
- MyErrorHandler eh = new MyErrorHandler();
- dBuilder.setErrorHandler(eh);
+ setPermissions(new FilePermission(ENTITY_XML, "read"));
dBuilder.parse(ENTITY_XML);
assertFalse(eh.isAnyError());
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
+ } finally {
+ setPermissions();
}
}
@@ -173,310 +163,209 @@
* Use a DocumentBuilder to create a DOM object and see how does the Secure
* Processing feature and entityExpansionLimit value affects output.
* Negative test that when entityExpansionLimit is too small.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = SAXParseException.class)
- public void testEntityExpansionDOMNeg() throws SAXParseException {
- try {
- DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
- dfactory.setFeature(FEATURE_SECURE_PROCESSING, true);
- System.setProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(2));
- DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
- MyErrorHandler eh = new MyErrorHandler();
- dBuilder.setErrorHandler(eh);
- dBuilder.parse(ENTITY_XML);
- } catch (SAXParseException e) {
- throw e;
- } catch (ParserConfigurationException | IOException | SAXException e) {
- failUnexpected(e);
- }
+ public void testEntityExpansionDOMNeg() throws Exception {
+ DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
+ dfactory.setFeature(FEATURE_SECURE_PROCESSING, true);
+ setSystemProperty(SP_ENTITY_EXPANSION_LIMIT, String.valueOf(2));
+ DocumentBuilder dBuilder = dfactory.newDocumentBuilder();
+ MyErrorHandler eh = new MyErrorHandler();
+ dBuilder.setErrorHandler(eh);
+ setPermissions(new FilePermission(ENTITY_XML, "read"));
+ dBuilder.parse(ENTITY_XML);
}
/**
* Test xi:include with a SAXParserFactory.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXIncludeSAXPos() {
- String resultFile = CLASS_DIR + "doc_xinclude.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXIncludeSAXPos() throws Exception {
+ String resultFile = USER_DIR + "doc_xinclude.out";
String goldFile = GOLDEN_DIR + "doc_xincludeGold.xml";
String xmlFile = XML_DIR + "doc_xinclude.xml";
- try {
- try(FileOutputStream fos = new FileOutputStream(resultFile)) {
- XInclHandler xh = new XInclHandler(fos, null);
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- spf.setXIncludeAware(true);
- spf.setFeature(FEATURE_NAME, true);
- spf.newSAXParser().parse(new File(xmlFile), xh);
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ try(FileOutputStream fos = new FileOutputStream(resultFile)) {
+ XInclHandler xh = new XInclHandler(fos, null);
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.setXIncludeAware(true);
+ spf.setFeature(FEATURE_NAME, true);
+ spf.newSAXParser().parse(new File(xmlFile), xh);
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
/**
* Test the simple case of including a document using xi:include using a
* DocumentBuilder.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXIncludeDOMPos() {
- String resultFile = CLASS_DIR + "doc_xincludeDOM.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXIncludeDOMPos() throws Exception {
+ String resultFile = USER_DIR + "doc_xincludeDOM.out";
String goldFile = GOLDEN_DIR + "doc_xincludeGold.xml";
String xmlFile = XML_DIR + "doc_xinclude.xml";
- try {
- try (FileOutputStream fos = new FileOutputStream(resultFile)) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setXIncludeAware(true);
- dbf.setNamespaceAware(true);
-
- Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
- doc.setXmlStandalone(true);
-
- TransformerFactory.newInstance().newTransformer().
- transform(new DOMSource(doc), new StreamResult(fos));
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ try (FileOutputStream fos = new FileOutputStream(resultFile)) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setXIncludeAware(true);
+ dbf.setNamespaceAware(true);
+ Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
+ doc.setXmlStandalone(true);
+ TransformerFactory.newInstance().newTransformer().
+ transform(new DOMSource(doc), new StreamResult(fos));
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
/**
* Test the simple case of including a document using xi:include within a
* xi:fallback using a DocumentBuilder.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXIncludeFallbackDOMPos() {
- String resultFile = CLASS_DIR + "doc_fallbackDOM.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXIncludeFallbackDOMPos() throws Exception {
+ String resultFile = USER_DIR + "doc_fallbackDOM.out";
String goldFile = GOLDEN_DIR + "doc_fallbackGold.xml";
String xmlFile = XML_DIR + "doc_fallback.xml";
- try{
- try (FileOutputStream fos = new FileOutputStream(resultFile)) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setXIncludeAware(true);
- dbf.setNamespaceAware(true);
+ try (FileOutputStream fos = new FileOutputStream(resultFile)) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setXIncludeAware(true);
+ dbf.setNamespaceAware(true);
- Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
- doc.setXmlStandalone(true);
- TransformerFactory.newInstance().newTransformer()
- .transform(new DOMSource(doc), new StreamResult(fos));
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
+ doc.setXmlStandalone(true);
+ TransformerFactory.newInstance().newTransformer()
+ .transform(new DOMSource(doc), new StreamResult(fos));
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
/**
* Test for xi:fallback where the fall back text is parsed as text. This
* test uses a nested xi:include for the fallback test.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXIncludeFallbackTextPos() {
- String resultFile = CLASS_DIR + "doc_fallback_text.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXIncludeFallbackTextPos() throws Exception {
+ String resultFile = USER_DIR + "doc_fallback_text.out";
String goldFile = GOLDEN_DIR + "doc_fallback_textGold.xml";
String xmlFile = XML_DIR + "doc_fallback_text.xml";
-
- try{
- try (FileOutputStream fos = new FileOutputStream(resultFile)) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setXIncludeAware(true);
- dbf.setNamespaceAware(true);
+ try (FileOutputStream fos = new FileOutputStream(resultFile)) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setXIncludeAware(true);
+ dbf.setNamespaceAware(true);
- Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
- doc.setXmlStandalone(true);
- TransformerFactory.newInstance().newTransformer()
- .transform(new DOMSource(doc), new StreamResult(fos));
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
+ doc.setXmlStandalone(true);
+ TransformerFactory.newInstance().newTransformer()
+ .transform(new DOMSource(doc), new StreamResult(fos));
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
/**
* Test the XPointer element() framework with XInclude.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXpointerElementPos() {
- String resultFile = CLASS_DIR + "doc_xpointer_element.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXpointerElementPos() throws Exception {
+ String resultFile = USER_DIR + "doc_xpointer_element.out";
String goldFile = GOLDEN_DIR + "doc_xpointerGold.xml";
String xmlFile = XML_DIR + "doc_xpointer_element.xml";
-
- try{
- try (FileOutputStream fos = new FileOutputStream(resultFile)) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setXIncludeAware(true);
- dbf.setNamespaceAware(true);
-
- DocumentBuilder db = dbf.newDocumentBuilder();
+ try (FileOutputStream fos = new FileOutputStream(resultFile)) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setXIncludeAware(true);
+ dbf.setNamespaceAware(true);
- TransformerFactory.newInstance().newTransformer()
- .transform(new DOMSource(db.parse(new File(xmlFile))),
- new StreamResult(fos));
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ DocumentBuilder db = dbf.newDocumentBuilder();
+
+ TransformerFactory.newInstance().newTransformer()
+ .transform(new DOMSource(db.parse(new File(xmlFile))),
+ new StreamResult(fos));
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
/**
* Test the XPointer framework with a SAX object.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXPointerPos() {
- String resultFile = CLASS_DIR + "doc_xpointer.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXPointerPos() throws Exception {
+ String resultFile = USER_DIR + "doc_xpointer.out";
String goldFile = GOLDEN_DIR + "doc_xpointerGold.xml";
String xmlFile = XML_DIR + "doc_xpointer.xml";
- try{
- try (FileOutputStream fos = new FileOutputStream(resultFile)) {
- SAXParserFactory spf = SAXParserFactory.newInstance();
- spf.setNamespaceAware(true);
- spf.setXIncludeAware(true);
- spf.setFeature(FEATURE_NAME, true);
- // parse the file
- spf.newSAXParser().parse(new File(xmlFile), new XInclHandler(fos, null));
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ try (FileOutputStream fos = new FileOutputStream(resultFile)) {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ spf.setNamespaceAware(true);
+ spf.setXIncludeAware(true);
+ spf.setFeature(FEATURE_NAME, true);
+ // parse the file
+ spf.newSAXParser().parse(new File(xmlFile), new XInclHandler(fos, null));
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
/**
* Test if xi:include may reference the doc containing the include if the
* parse type is text.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXIncludeLoopPos() {
- String resultFile = CLASS_DIR + "doc_xinc_loops.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXIncludeLoopPos() throws Exception {
+ String resultFile = USER_DIR + "doc_xinc_loops.out";
String goldFile = GOLDEN_DIR + "doc_xinc_loopGold.xml";
String xmlFile = XML_DIR + "doc_xinc_loops.xml";
- try{
- try (FileOutputStream fos = new FileOutputStream(resultFile)) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setXIncludeAware(true);
- dbf.setNamespaceAware(true);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document doc = db.parse(new File(xmlFile));
- doc.normalizeDocument();
- doc.setXmlStandalone(true);
+ try (FileOutputStream fos = new FileOutputStream(resultFile)) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setXIncludeAware(true);
+ dbf.setNamespaceAware(true);
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ Document doc = db.parse(new File(xmlFile));
+ doc.normalizeDocument();
+ doc.setXmlStandalone(true);
- TransformerFactory.newInstance().newTransformer()
- .transform(new DOMSource(doc), new StreamResult(fos));
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ TransformerFactory.newInstance().newTransformer()
+ .transform(new DOMSource(doc), new StreamResult(fos));
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
/**
* Test if two non nested xi:include elements can include the same document
* with an xi:include statement.
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testXIncludeNestedPos() {
- String resultFile = CLASS_DIR + "schedule.out";
+ @Test(groups = {"readWriteLocalFiles"})
+ public void testXIncludeNestedPos() throws Exception {
+ String resultFile = USER_DIR + "schedule.out";
String goldFile = GOLDEN_DIR + "scheduleGold.xml";
String xmlFile = XML_DIR + "schedule.xml";
- try{
- try (FileOutputStream fos = new FileOutputStream(resultFile)) {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setXIncludeAware(true);
- dbf.setNamespaceAware(true);
+ try (FileOutputStream fos = new FileOutputStream(resultFile)) {
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setXIncludeAware(true);
+ dbf.setNamespaceAware(true);
- Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
- doc.setXmlStandalone(true);
- TransformerFactory.newInstance().newTransformer()
- .transform(new DOMSource(doc), new StreamResult(fos));
- }
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ParserConfigurationException | SAXException | IOException
- | TransformerException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
+ Document doc = dbf.newDocumentBuilder().parse(new File(xmlFile));
+ doc.setXmlStandalone(true);
+ TransformerFactory.newInstance().newTransformer()
+ .transform(new DOMSource(doc), new StreamResult(fos));
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/MyDOMErrorHandler.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please 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 test.auctionportal;
-
-import org.w3c.dom.DOMErrorHandler;
-import org.w3c.dom.DOMError;
-
-/**
- * Error handler for recording DOM processing error.
- */
-public class MyDOMErrorHandler implements DOMErrorHandler {
- /**
- * flag shows if there is any error.
- */
- private volatile boolean errorOccured = false;
-
- /**
- * Set errorOcurred to true when an error occurs.
- * @param error The error object that describes the error. This object
- * may be reused by the DOM implementation across multiple calls to
- * the handleError method.
- * @return true that processing may continue depending on.
- */
- @Override
- public boolean handleError (DOMError error) {
- System.err.println( "ERROR" + error.getMessage());
- System.err.println( "ERROR" + error.getRelatedData());
- errorOccured = true;
- return true;
- }
-
- /**
- * Showing if any error was handled.
- * @return true if there is one or more error.
- * false no error occurs.
- */
- public boolean isError() {
- return errorOccured;
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/MyDOMOutput.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please 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 test.auctionportal;
-
-import org.w3c.dom.ls.LSOutput;
-import java.io.OutputStream;
-import java.io.Writer;
-
-/**
- * A Thread-safe LS output destination for DOM processing. LSOutput objects
- * belong to the application. The DOM implementation will never modify them
- * (though it may make copies and modify the copies, if necessary).
- */
-public class MyDOMOutput implements LSOutput {
- /**
- * An attribute of a language and binding dependent type that represents a
- * writable stream of bytes.
- */
- private OutputStream bytestream;
-
- /**
- * character encoding to use for the output.
- */
- private String encoding;
-
- /**
- * The system identifier.
- */
- private String sysId;
-
- /**
- * Writable stream to which 16-bit units can be output.
- */
- private Writer writer;
-
- /**
- * An attribute of a language and binding dependent type that represents a
- * writable stream of bytes.
- *
- * @return a writable stream.
- */
- @Override
- public OutputStream getByteStream() {
- return bytestream;
- }
-
- /**
- * An attribute of a language and binding dependent type that represents a
- * writable stream to which 16-bit units can be output.
- *
- * @return writable stream instance.
- */
- @Override
- public Writer getCharacterStream() {
- return writer;
- }
-
- /**
- * The character encoding to use for the output.
- *
- * @return the character encoding.
- */
- @Override
- public String getEncoding() {
- return encoding;
- }
-
- /**
- * The system identifier for this output destination.
- *
- * @return system identifier.
- */
- @Override
- public String getSystemId() {
- return sysId;
- }
-
- /**
- * Set writable stream of bytes.
- *
- * @param bs OutputStream instance
- */
- @Override
- public void setByteStream(OutputStream bs) {
- bytestream = bs;
- }
-
- /**
- * Set 16 bits unit writable stream.
- *
- * @param bs a Writer instance
- */
- @Override
- public void setCharacterStream(Writer cs) {
- writer = cs;
- }
-
- /**
- * Set character encoding to use for the output.
- *
- * @param encoding encoding set to the output
- */
- @Override
- public void setEncoding(String encoding) {
- this.encoding = encoding;
- }
-
- /**
- * Set the system identifier for the output.
- *
- * @param sysId system identifier string.
- */
- @Override
- public void setSystemId(String sysId) {
- this.sysId = sysId;
- }
-}
--- a/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/MyErrorHandler.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please 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 test.auctionportal;
-
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * ErrorHandler for error handling. Set state if any method in error, warning
- * or fatalError was called.
- */
-public final class MyErrorHandler extends DefaultHandler {
- /**
- * Enumeration for ErrorHandler's state.
- */
- private enum STATE { ERROR, FATAL, WARNING, NORMAL};
-
- /**
- * Set state as normal by default.
- */
- private volatile STATE state = STATE.NORMAL;
-
- /**
- * Keep exception for further investigation.
- */
- private volatile SAXParseException exception;
-
- /**
- * Save exception and set state to ERROR.
- * @param e exception wrap error.
- */
- @Override
- public void error (SAXParseException e) {
- state = STATE.ERROR;
- exception = e;
- }
-
- /**
- * Save exception and set state to FATAL.
- * @param e exception wrap error.
- */
- @Override
- public void fatalError (SAXParseException e) {
- state = STATE.FATAL;
- exception = e;
- }
-
- /**
- * Save exception and set state to WARNING.
- * @param e exception wrap error.
- */
- @Override
- public void warning (SAXParseException e) {
- state = STATE.WARNING;
- exception = e;
- }
-
- /**
- * return ErrorHandle's state .
- * @return true No error, fatalError and warning.
- * false there is any error, fatalError or warning in processing.
- */
- public boolean isAnyError() {
- if (state != STATE.NORMAL)
- System.out.println(exception);
- return state != STATE.NORMAL;
- }
-
- /**
- * return whether fatalError is the only error.
- * @return true fatalError is the only error.
- * false there is no error, or other error besides fatalError.
- */
- public boolean isFatalError() {
- if (state == STATE.FATAL)
- System.out.println(exception);
- return state == STATE.FATAL;
- }
-
-}
--- a/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/UserController.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/UserController.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,21 +25,17 @@
import static com.sun.org.apache.xerces.internal.jaxp.JAXPConstants.JAXP_SCHEMA_LANGUAGE;
import static org.testng.Assert.assertFalse;
import java.io.FileOutputStream;
-import java.io.IOException;
import java.nio.file.Files;
-import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
+import jaxp.library.JAXPFileBaseTest;
+import static jaxp.library.JAXPTestUtilities.USER_DIR;
import static jaxp.library.JAXPTestUtilities.compareDocumentWithGold;
-import static jaxp.library.JAXPTestUtilities.failCleanup;
-import static jaxp.library.JAXPTestUtilities.failUnexpected;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
-
import org.testng.annotations.Test;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
@@ -50,8 +46,6 @@
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSParser;
import org.w3c.dom.ls.LSSerializer;
-import org.xml.sax.SAXException;
-import static test.auctionportal.HiBidConstants.CLASS_DIR;
import static test.auctionportal.HiBidConstants.GOLDEN_DIR;
import static test.auctionportal.HiBidConstants.PORTAL_ACCOUNT_NS;
import static test.auctionportal.HiBidConstants.XML_DIR;
@@ -59,141 +53,127 @@
/**
* This is the user controller class for the Auction portal HiBid.com.
*/
-public class UserController {
+public class UserController extends JAXPFileBaseTest {
/**
* Checking when creating an XML document using DOM Level 2 validating
* it without having a schema source or a schema location It must throw a
* sax parse exception.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testCreateNewUser() {
- String resultFile = CLASS_DIR + "accountInfoOut.xml";
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- dbf.setValidating(true);
+ public void testCreateNewUser() throws Exception {
+ String resultFile = USER_DIR + "accountInfoOut.xml";
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- MyErrorHandler eh = new MyErrorHandler();
- docBuilder.setErrorHandler(eh);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ MyErrorHandler eh = new MyErrorHandler();
+ docBuilder.setErrorHandler(eh);
- Document document = docBuilder.newDocument();
+ Document document = docBuilder.newDocument();
- Element account = document.createElementNS(PORTAL_ACCOUNT_NS, "acc:Account");
- Attr accountID = document.createAttributeNS(PORTAL_ACCOUNT_NS, "acc:accountID");
- account.setAttributeNode(accountID);
+ Element account = document.createElementNS(PORTAL_ACCOUNT_NS, "acc:Account");
+ Attr accountID = document.createAttributeNS(PORTAL_ACCOUNT_NS, "acc:accountID");
+ account.setAttributeNode(accountID);
- account.appendChild(document.createElement("FirstName"));
- account.appendChild(document.createElementNS(PORTAL_ACCOUNT_NS, "acc:LastName"));
- account.appendChild(document.createElement("UserID"));
+ account.appendChild(document.createElement("FirstName"));
+ account.appendChild(document.createElementNS(PORTAL_ACCOUNT_NS, "acc:LastName"));
+ account.appendChild(document.createElement("UserID"));
- DOMImplementationLS impl
- = (DOMImplementationLS) DOMImplementationRegistry
- .newInstance().getDOMImplementation("LS");
- LSSerializer writer = impl.createLSSerializer();
- LSParser builder = impl.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
- FileOutputStream output = new FileOutputStream(resultFile);
+ DOMImplementationLS impl
+ = (DOMImplementationLS) DOMImplementationRegistry
+ .newInstance().getDOMImplementation("LS");
+ LSSerializer writer = impl.createLSSerializer();
+ LSParser builder = impl.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
+ try(FileOutputStream output = new FileOutputStream(resultFile)) {
MyDOMOutput domOutput = new MyDOMOutput();
-
domOutput.setByteStream(output);
writer.write(account, domOutput);
docBuilder.parse(resultFile);
-
- assertTrue(eh.isAnyError());
- } catch (ParserConfigurationException | ClassNotFoundException |
- InstantiationException | IllegalAccessException
- | ClassCastException | SAXException | IOException e) {
- failUnexpected(e);
}
+ assertTrue(eh.isAnyError());
}
/**
* Checking conflicting namespaces and use renameNode and normalizeDocument.
* @see <a href="content/accountInfo.xml">accountInfo.xml</a>
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testAddUser() {
- String resultFile = CLASS_DIR + "accountRole.out";
+ public void testAddUser() throws Exception {
+ String resultFile = USER_DIR + "accountRole.out";
String xmlFile = XML_DIR + "accountInfo.xml";
- try {
- // Copy schema for outputfile
- Files.copy(Paths.get(XML_DIR, "accountInfo.xsd"),
- Paths.get(CLASS_DIR, "accountInfo.xsd"),
- StandardCopyOption.REPLACE_EXISTING);
- MyErrorHandler eh = new MyErrorHandler();
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ // Copy schema for outputfile
+ Files.copy(Paths.get(XML_DIR, "accountInfo.xsd"),
+ Paths.get(USER_DIR, "accountInfo.xsd"),
+ StandardCopyOption.REPLACE_EXISTING);
+ MyErrorHandler eh = new MyErrorHandler();
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
- dbf.setNamespaceAware(true);
- dbf.setValidating(true);
+ dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- docBuilder.setErrorHandler(eh);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ docBuilder.setErrorHandler(eh);
- Document document = docBuilder.parse(xmlFile);
- Element sell = (Element) document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Sell").item(0);
- Element role = (Element) sell.getParentNode();
+ Document document = docBuilder.parse(xmlFile);
+ Element sell = (Element) document.getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Sell").item(0);
+ Element role = (Element) sell.getParentNode();
- Element buy = (Element) document.renameNode(sell, PORTAL_ACCOUNT_NS, "acc:Buy");
- role.appendChild(buy);
+ Element buy = (Element) document.renameNode(sell, PORTAL_ACCOUNT_NS, "acc:Buy");
+ role.appendChild(buy);
- DOMImplementationLS impl
- = (DOMImplementationLS) DOMImplementationRegistry
- .newInstance().getDOMImplementation("LS");
- LSSerializer writer = impl.createLSSerializer();
+ DOMImplementationLS impl
+ = (DOMImplementationLS) DOMImplementationRegistry
+ .newInstance().getDOMImplementation("LS");
+ LSSerializer writer = impl.createLSSerializer();
- try(FileOutputStream output = new FileOutputStream(resultFile)) {
- MyDOMOutput mydomoutput = new MyDOMOutput();
- mydomoutput.setByteStream(output);
- writer.write(document, mydomoutput);
- }
+ try(FileOutputStream output = new FileOutputStream(resultFile)) {
+ MyDOMOutput mydomoutput = new MyDOMOutput();
+ mydomoutput.setByteStream(output);
+ writer.write(document, mydomoutput);
+ }
- docBuilder.parse(resultFile);
- assertFalse(eh.isAnyError());
- } catch (ParserConfigurationException | SAXException | IOException
- | ClassNotFoundException | InstantiationException
- | IllegalAccessException | ClassCastException e) {
- failUnexpected(e);
- }
+ docBuilder.parse(resultFile);
+ assertFalse(eh.isAnyError());
}
/**
* Checking Text content in XML file.
* @see <a href="content/accountInfo.xml">accountInfo.xml</a>
+ *
+ * @throws Exception If any errors occur.
*/
- @Test
- public void testMoreUserInfo() {
+ @Test(groups = {"readLocalFiles"})
+ public void testMoreUserInfo() throws Exception {
String xmlFile = XML_DIR + "accountInfo.xml";
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- try {
- System.out.println("Checking additional user info");
-
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-
- dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
- dbf.setNamespaceAware(true);
- dbf.setValidating(true);
+ dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(true);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- MyErrorHandler eh = new MyErrorHandler();
- docBuilder.setErrorHandler(eh);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ MyErrorHandler eh = new MyErrorHandler();
+ docBuilder.setErrorHandler(eh);
- Document document = docBuilder.parse(xmlFile);
- Element account = (Element)document
- .getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
- String textContent = account.getTextContent();
- assertTrue(textContent.trim().regionMatches(0, "Rachel", 0, 6));
- assertEquals(textContent, "RachelGreen744");
+ Document document = docBuilder.parse(xmlFile);
+ Element account = (Element)document
+ .getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "Account").item(0);
+ String textContent = account.getTextContent();
+ assertTrue(textContent.trim().regionMatches(0, "Rachel", 0, 6));
+ assertEquals(textContent, "RachelGreen744");
- Attr accountID = account.getAttributeNodeNS(PORTAL_ACCOUNT_NS, "accountID");
- assertTrue(accountID.getTextContent().trim().equals("1"));
+ Attr accountID = account.getAttributeNodeNS(PORTAL_ACCOUNT_NS, "accountID");
+ assertTrue(accountID.getTextContent().trim().equals("1"));
- assertFalse(eh.isAnyError());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ assertFalse(eh.isAnyError());
}
/**
@@ -204,83 +184,73 @@
* into an XML file which is validated by the schema This covers Row 5
* for the table
* http://javaweb.sfbay/~jsuttor/JSR206/jsr-206-html/ch03s05.html. Filed
- * bug 4893745 because there was a difference in behavior
+ * bug 4893745 because there was a difference in behavior.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testCreateUserAccount() {
- System.out.println("Creating user account");
+ public void testCreateUserAccount() throws Exception {
String userXmlFile = XML_DIR + "userInfo.xml";
String accountXmlFile = XML_DIR + "accountInfo.xml";
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(true);
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- dbf.setValidating(true);
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ MyErrorHandler eh = new MyErrorHandler();
+ docBuilder.setErrorHandler(eh);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- MyErrorHandler eh = new MyErrorHandler();
- docBuilder.setErrorHandler(eh);
-
- Document document = docBuilder.parse(userXmlFile);
- Element user = (Element) document.getElementsByTagName("FirstName").item(0);
- // Set schema after parsing userInfo.xml. Otherwise it will conflict
- // with DTD validation.
- dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
- DocumentBuilder docBuilder1 = dbf.newDocumentBuilder();
- docBuilder1.setErrorHandler(eh);
- Document accDocument = docBuilder1.parse(accountXmlFile);
+ Document document = docBuilder.parse(userXmlFile);
+ Element user = (Element) document.getElementsByTagName("FirstName").item(0);
+ // Set schema after parsing userInfo.xml. Otherwise it will conflict
+ // with DTD validation.
+ dbf.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA_NS_URI);
+ DocumentBuilder docBuilder1 = dbf.newDocumentBuilder();
+ docBuilder1.setErrorHandler(eh);
+ Document accDocument = docBuilder1.parse(accountXmlFile);
- Element firstName = (Element) accDocument
- .getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "FirstName").item(0);
- Element adoptedAccount = (Element) accDocument.adoptNode(user);
+ Element firstName = (Element) accDocument
+ .getElementsByTagNameNS(PORTAL_ACCOUNT_NS, "FirstName").item(0);
+ Element adoptedAccount = (Element) accDocument.adoptNode(user);
- Element parent = (Element) firstName.getParentNode();
- parent.replaceChild(adoptedAccount, firstName);
-
- DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
- DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
- LSSerializer writer = impl.createLSSerializer();
+ Element parent = (Element) firstName.getParentNode();
+ parent.replaceChild(adoptedAccount, firstName);
- MyDOMOutput mydomoutput = new MyDOMOutput();
- mydomoutput.setByteStream(System.out);
-
- writer.write(document, mydomoutput);
- writer.write(accDocument, mydomoutput);
+ DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
+ DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
+ LSSerializer writer = impl.createLSSerializer();
- assertFalse(eh.isAnyError());
- } catch (ParserConfigurationException | SAXException | IOException
- | ClassNotFoundException | InstantiationException
- | IllegalAccessException | ClassCastException e) {
- failUnexpected(e);
- }
+ MyDOMOutput mydomoutput = new MyDOMOutput();
+ mydomoutput.setByteStream(System.out);
+
+ writer.write(document, mydomoutput);
+ writer.write(accDocument, mydomoutput);
+
+ assertFalse(eh.isAnyError());
}
/**
* Checking for Row 8 from the schema table when setting the schemaSource
* without the schemaLanguage must report an error.
+ *
+ * @throws Exception If any errors occur.
*/
@Test(expectedExceptions = IllegalArgumentException.class)
- public void testUserError() throws IllegalArgumentException {
- System.out.println("Creating an error in user account");
-
+ public void testUserError() throws Exception {
String xmlFile = XML_DIR + "userInfo.xml";
String schema = "http://java.sun.com/xml/jaxp/properties/schemaSource";
String schemaValue = "http://dummy.com/dummy.xsd";
- try {
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- dbf.setValidating(true);
- dbf.setAttribute(schema, schemaValue);
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ dbf.setNamespaceAware(true);
+ dbf.setValidating(true);
+ dbf.setAttribute(schema, schemaValue);
- DocumentBuilder docBuilder = dbf.newDocumentBuilder();
- MyErrorHandler eh = new MyErrorHandler();
- docBuilder.setErrorHandler(eh);
- Document document = docBuilder.parse(xmlFile);
- assertFalse(eh.isAnyError());
- } catch (ParserConfigurationException | SAXException | IOException e) {
- failUnexpected(e);
- }
+ DocumentBuilder docBuilder = dbf.newDocumentBuilder();
+ MyErrorHandler eh = new MyErrorHandler();
+ docBuilder.setErrorHandler(eh);
+ docBuilder.parse(xmlFile);
+ assertFalse(eh.isAnyError());
}
/**
@@ -288,10 +258,12 @@
* @see <a href="content/screenName.xml">screenName.xml</a> has prefix of
* userName is bound to "http://hibid.com/user" namespace normalization
* will create a namespace of prefix us and attach userEmail.
+ *
+ * @throws Exception If any errors occur.
*/
@Test
- public void testCheckScreenNameExists() {
- String resultFile = CLASS_DIR + "screenName.out";
+ public void testCheckScreenNameExists() throws Exception {
+ String resultFile = USER_DIR + "screenName.out";
String xmlFile = XML_DIR + "screenName.xml";
String goldFile = GOLDEN_DIR + "screenNameGold.xml";
@@ -318,21 +290,7 @@
MyDOMOutput domoutput = new MyDOMOutput();
domoutput.setByteStream(output);
writer.write(document, domoutput);
-
- assertTrue(compareDocumentWithGold(goldFile, resultFile));
- } catch (ClassNotFoundException | InstantiationException
- | IllegalAccessException | ClassCastException | IOException
- | ParserConfigurationException | SAXException e) {
- failUnexpected(e);
- } finally {
- try {
- Path resultPath = Paths.get(resultFile);
- if (Files.exists(resultPath)) {
- Files.delete(resultPath);
- }
- } catch (IOException ex) {
- failCleanup(ex, resultFile);
- }
}
+ assertTrue(compareDocumentWithGold(goldFile, resultFile));
}
}
--- a/jaxp/test/javax/xml/jaxp/functional/test/auctionportal/XInclHandler.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,382 +0,0 @@
-/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please 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 test.auctionportal;
-
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.util.stream.Collectors;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * A SAX2 event handlers.
- * This SAX2 ContentHandler receives callback event then print whole document
- * that is parsed.
- */
-public class XInclHandler extends DefaultHandler implements LexicalHandler {
- /**
- * Print writer.
- */
- private final PrintWriter fOut;
-
- /**
- * Canonical output.
- */
- private volatile boolean fCanonical;
-
- /**
- * Element depth.
- */
- private volatile int fElementDepth;
-
- /**
- * Sets whether output is canonical.
- */
- public void setCanonical(boolean canonical) {
- fCanonical = canonical;
- }
-
- /**
- * Sets the output stream for printing.
- * @param stream OutputStream for message output.
- * @param encoding File encoding for message output.
- */
- public XInclHandler(OutputStream stream, String encoding)
- throws UnsupportedEncodingException {
- // At least set one encoding.
- if (encoding == null) {
- encoding = "UTF8";
- }
-
- fOut = new PrintWriter(new OutputStreamWriter(stream, encoding), false);
- }
-
- /**
- * Receive notification of the beginning of the document. Write the start
- * document tag if it's not canonical mode.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
- */
- @Override
- public void startDocument() throws SAXException {
- fElementDepth = 0;
-
- if (!fCanonical) {
- writeFlush("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
- }
- }
-
- /**
- * Receive notification of a processing instruction.
- * @param target The processing instruction target.
- * @param data The processing instruction data, or null if
- * none is supplied.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
- */
- @Override
- public void processingInstruction (String target, String data)
- throws SAXException {
- if (fElementDepth > 0) {
- StringBuilder instruction = new StringBuilder("<?").append(target);
- if (data != null && data.length() > 0) {
- instruction.append(' ').append(data);
- }
- instruction.append("?>");
- writeFlush(instruction.toString());
- }
- }
-
- /**
- * Receive notification of the start of an element then write the normalized
- * output to the file.
- * @param uri The Namespace URI, or the empty string if the
- * element has no Namespace URI or if Namespace
- * processing is not being performed.
- * @param localName The local name (without prefix), or the
- * empty string if Namespace processing is not being
- * performed.
- * @param qName The qualified name (with prefix), or the
- * empty string if qualified names are not available.
- * @param attributes The attributes attached to the element. If
- * there are no attributes, it shall be an empty
- * Attributes object.
- */
- @Override
- public void startElement(String uri, String local, String raw,
- Attributes attrs) throws SAXException {
- fElementDepth++;
- StringBuilder start = new StringBuilder().append('<').append(raw);
- if (attrs != null) {
- for (int i = 0; i < attrs.getLength(); i++) {
- start.append(' ').append(attrs.getQName(i)).append("=\"").
- append(normalizeAndPrint(attrs.getValue(i))).append('"');
- }
- }
- start.append('>');
- writeFlush(start.toString());
- }
-
- /**
- * Receive notification of character data inside an element and write
- * normalized characters to file.
- * @param ch The characters.
- * @param start The start position in the character array.
- * @param length The number of characters to use from the
- * character array.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
- */
- @Override
- public void characters(char ch[], int start, int length)
- throws SAXException {
- writeFlush(normalizeAndPrint(ch, start, length));
- }
-
- /**
- * Receiving notification of ignorable whitespace in element content and
- * writing normalized ignorable characters to file.
- * @param ch The characters.
- * @param start The start position in the character array.
- * @param length The number of characters to use from the
- * character array.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
- */
- @Override
- public void ignorableWhitespace(char ch[], int start, int length)
- throws SAXException {
- characters(ch, start, length);
- }
-
- /**
- * Receive notification of the end of an element and print end element.
- *
- * @param uri The Namespace URI, or the empty string if the
- * element has no Namespace URI or if Namespace
- * processing is not being performed.
- * @param localName The local name (without prefix), or the
- * empty string if Namespace processing is not being
- * performed.
- * @param qName The qualified name (with prefix), or the
- * empty string if qualified names are not available.
- */
- @Override
- public void endElement(String uri, String local, String raw)
- throws SAXException {
- fElementDepth--;
- writeFlush("</" + raw + ">");
- }
-
- /**
- * Receive notification of a parser warning and print it out.
- * @param e The warning information encoded as an exception.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
- */
- @Override
- public void warning(SAXParseException ex) throws SAXException {
- printError("Warning", ex);
- }
-
- /**
- * Receive notification of a parser error and print it out.
- * @param e The error information encoded as an exception.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
-
- */
- @Override
- public void error(SAXParseException ex) throws SAXException {
- printError("Error", ex);
- }
-
- /**
- * Receive notification of a parser fatal error. Throw out fatal error
- * following print fatal error message.
- * @param e The fatal error information encoded as an exception.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
-
- */
- @Override
- public void fatalError(SAXParseException ex) throws SAXException {
- printError("Fatal Error", ex);
- throw ex;
- }
-
- /**
- * Do nothing on start DTD.
- * @param name The document type name.
- * @param publicId The declared public identifier for the
- * external DTD subset, or null if none was declared.
- * @param systemId The declared system identifier for the
- * external DTD subset, or null if none was declared.
- * (Note that this is not resolved against the document
- * base URI.)
- * @exception SAXException The application may raise an
- * exception.
- */
- @Override
- public void startDTD(String name, String publicId, String systemId)
- throws SAXException {
- }
-
- /**
- * Do nothing on end DTD.
- * @exception SAXException The application may raise an exception.
- */
- @Override
- public void endDTD() throws SAXException {
- }
-
- /**
- * Do nothing on start entity.
- * @param name The name of the entity. If it is a parameter
- * entity, the name will begin with '%', and if it is the
- * external DTD subset, it will be "[dtd]".
- * @exception SAXException The application may raise an exception.
- */
- @Override
- public void startEntity(String name) throws SAXException {
- }
-
- /**
- * Do nothing on end entity.
- * @param name The name of the entity. If it is a parameter
- * entity, the name will begin with '%', and if it is the
- * external DTD subset, it will be "[dtd]".
- * @exception SAXException The application may raise an exception.
- */
- @Override
- public void endEntity(String name) throws SAXException {
- }
-
- /**
- * Do nothing on start CDATA section.
- * @exception SAXException The application may raise an exception.
- */
- @Override
- public void startCDATA() throws SAXException {
- }
-
- /**
- * Do nothing on end CDATA section.
- * @exception SAXException The application may raise an exception.
- */
- @Override
- public void endCDATA() throws SAXException {
- }
-
- /**
- * Report an normalized XML comment when receive a comment in the document.
- *
- * @param ch An array holding the characters in the comment.
- * @param start The starting position in the array.
- * @param length The number of characters to use from the array.
- * @exception SAXException The application may raise an exception.
- */
- @Override
- public void comment(char ch[], int start, int length) throws SAXException {
- if (!fCanonical && fElementDepth > 0) {
- writeFlush("<!--" + normalizeAndPrint(ch, start, length) + "-->");
- }
- }
-
- /**
- * Normalizes and prints the given string.
- * @param s String to be normalized
- */
- private String normalizeAndPrint(String s) {
- return s.chars().mapToObj(c -> normalizeAndPrint((char)c)).
- collect(Collectors.joining());
- }
-
- /**
- * Normalizes and prints the given array of characters.
- * @param ch The characters to be normalized.
- * @param start The start position in the character array.
- * @param length The number of characters to use from the
- * character array.
- */
- private String normalizeAndPrint(char[] ch, int offset, int length) {
- return normalizeAndPrint(new String(ch, offset, length));
- }
-
- /**
- * Normalizes given character.
- * @param c char to be normalized.
- */
- private String normalizeAndPrint(char c) {
- switch (c) {
- case '<':
- return "<";
- case '>':
- return ">";
- case '&':
- return "&";
- case '"':
- return """;
- case '\r':
- case '\n':
- return fCanonical ? "&#" + Integer.toString(c) + ";" : String.valueOf(c);
- default:
- return String.valueOf(c);
- }
- }
-
- /**
- * Prints the error message.
- * @param type error type
- * @param ex exception that need to be printed
- */
- private void printError(String type, SAXParseException ex) {
- System.err.print("[" + type + "] ");
- String systemId = ex.getSystemId();
- if (systemId != null) {
- int index = systemId.lastIndexOf('/');
- if (index != -1)
- systemId = systemId.substring(index + 1);
- System.err.print(systemId);
- }
- System.err.print(':' + ex.getLineNumber());
- System.err.print(':' + ex.getColumnNumber());
- System.err.println(": " + ex.getMessage());
- System.err.flush();
- }
-
- /**
- * Write out and flush.
- * @param out string to be written.
- */
- private void writeFlush(String out) {
- fOut.print(out);
- fOut.flush();
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/javax/xml/parsers/ptests/MyCHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,173 @@
+/*
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package javax.xml.parsers.ptests;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import static jaxp.library.JAXPTestUtilities.ERROR_MSG_HEADER;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.LocatorImpl;
+
+/**
+ * Customized DefaultHandler which writes output document when methods are
+ * called by Transformer. Test may use output document to compare with golden
+ * file for verification.
+ */
+class MyCHandler extends DefaultHandler implements AutoCloseable {
+
+ private final BufferedWriter bWriter;
+ private final Locator locator = new LocatorImpl();
+
+ private MyCHandler(File file) throws IOException {
+ bWriter = new BufferedWriter(new FileWriter(file));
+ }
+
+ public static MyCHandler newInstance(File file) throws IOException {
+ MyCHandler handler = new MyCHandler(file);
+ return handler;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) {
+ String s = new String(ch, start, length);
+ String str = String.format("characters...length is:%d\n<%s>", s.length(), s);
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void endDocument() {
+ String str = "endDocument...";
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ bWriter.flush();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void endElement(String namespaceURI, String localName, String qName) {
+ String str = String.format("endElement...\nnamespaceURI: <%s> localName: <%s> qName: <%s>", namespaceURI, localName, qName);
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void endPrefixMapping(String prefix) {
+ String str = String.format("endPrefixMapping...\nprefix: <%s>", prefix);
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void ignorableWhitespace(char[] ch, int start, int length) {
+ String s = new String(ch, start, length);
+ String str = String.format("ignorableWhitespace...\n%s ignorable white space string length: %d", s, s.length());
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void processingInstruction(String target, String data) {
+ String str = String.format("processingInstruction...target:<%s> data: <%s>", target, data);
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void skippedEntity(String name) {
+ String str = String.format("skippedEntity...\nname: <%s>", name);
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void startDocument() {
+ String str = "startDocument...";
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void startElement(String namespaceURI, String localName, String qName, Attributes atts) {
+ String str = String.format("startElement...\nnamespaceURI: <%s> localName: <%s> qName: <%s> Number of Attributes: <%d> Line# <%d>", namespaceURI,
+ localName, qName, atts.getLength(), locator.getLineNumber());
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void startPrefixMapping(String prefix, String uri) {
+ String str = String.format("startPrefixMapping...\nprefix: <%s> uri: <%s>", prefix, uri);
+ try {
+ bWriter.write(str, 0, str.length());
+ bWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException(ERROR_MSG_HEADER, e);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (bWriter != null)
+ bWriter.close();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/javax/xml/parsers/ptests/MyErrorHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package javax.xml.parsers.ptests;
+
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Customized DefaultHandler used for SAXParseException testing.
+ */
+class MyErrorHandler extends DefaultHandler {
+ /**
+ * Flag whether any event was received.
+ */
+ private volatile boolean errorOccured;
+
+ /**
+ * Set no event received on constructor.
+ */
+ private MyErrorHandler() {
+ errorOccured = false;
+ }
+
+ /**
+ * Factory method to create a MyErrorHandler instance.
+ * @return a MyErrorHandler instance.
+ */
+ public static MyErrorHandler newInstance() {
+ return new MyErrorHandler();
+ }
+
+ /**
+ * Receive notification of a recoverable error.
+ * @param e a recoverable parser exception error.
+ */
+ @Override
+ public void error(SAXParseException e) {
+ errorOccured = true;
+ }
+
+ /**
+ * Receive notification of a parser warning.
+ * @param e a parser warning event.
+ */
+ @Override
+ public void warning(SAXParseException e) {
+ errorOccured = true;
+ }
+
+ /**
+ * Report a fatal XML parsing error.
+ * @param e The error information encoded as an exception.
+ */
+ @Override
+ public void fatalError(SAXParseException e) {
+ errorOccured = true;
+ }
+
+ /**
+ * Has any event been received.
+ *
+ * @return true if any event has been received.
+ * false if no event has been received.
+ */
+ public boolean isErrorOccured() {
+ return errorOccured;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/javax/xml/parsers/ptests/ParserTestConst.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package javax.xml.parsers.ptests;
+
+import static jaxp.library.JAXPTestUtilities.FILE_SEP;
+import static jaxp.library.JAXPTestUtilities.getPathByClassName;
+
+
+/**
+ * Utility interface which includes final variables of XML, golden file
+ * directories.
+ */
+public class ParserTestConst {
+ /**
+ * XML source file directory.
+ */
+ public static final String XML_DIR = getPathByClassName(ParserTestConst.class,
+ ".." + FILE_SEP + "xmlfiles");
+
+
+ /**
+ * Golden validation files directory.
+ */
+ public static final String GOLDEN_DIR = getPathByClassName(ParserTestConst.class,
+ ".." + FILE_SEP + "xmlfiles" + FILE_SEP + "out");
+}
--- a/jaxp/test/javax/xml/jaxp/libs/javax/xml/transform/ptests/MyContentHandler.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/libs/javax/xml/transform/ptests/MyContentHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
--- a/jaxp/test/javax/xml/jaxp/libs/javax/xml/transform/ptests/TransformerTestConst.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/libs/javax/xml/transform/ptests/TransformerTestConst.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,40 +23,22 @@
package javax.xml.transform.ptests;
import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.getPathByClassName;
/**
* This is the Base test class provide basic support for JAXP functional test
*/
public class TransformerTestConst {
/**
- * Current test directory.
+ * XML source file directory.
*/
- public static final String CLASS_DIR
- = System.getProperty("test.classes", ".") + FILE_SEP;
+ public static final String XML_DIR = getPathByClassName(TransformerTestConst.class,
+ ".." + FILE_SEP + "xmlfiles");
- /**
- * Package name that separates by slash.
- */
- public static final String PACKAGE_NAME = FILE_SEP +
- TransformerTestConst.class.getPackage().getName().replaceAll("[.]", FILE_SEP);
/**
- * Test base directory. Every package has its own test package directory.
- */
- public static final String BASE_DIR
- = System.getProperty("test.src", USER_DIR).replaceAll("\\" + System.getProperty("file.separator"), "/")
- + PACKAGE_NAME + FILE_SEP + "..";
-
- /**
- * Source XML file directory.
+ * Golden validation files directory.
*/
- public static final String XML_DIR = BASE_DIR + FILE_SEP + "xmlfiles" + FILE_SEP;
-
- /**
- * Golden output file directory. We pre-define all expected output in golden
- * output file. Test verifies whether the standard output is same as content
- * of golden file.
- */
- public static final String GOLDEN_DIR = XML_DIR + FILE_SEP + "out" + FILE_SEP;
+ public static final String GOLDEN_DIR = getPathByClassName(TransformerTestConst.class,
+ ".." + FILE_SEP + "xmlfiles" + FILE_SEP + "out");
}
--- a/jaxp/test/javax/xml/jaxp/libs/javax/xml/xpath/ptests/XPathTestConst.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/libs/javax/xml/xpath/ptests/XPathTestConst.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,27 +23,15 @@
package javax.xml.xpath.ptests;
import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.getPathByClassName;
/**
* This is the Base test class provide basic support for XPath functional test
*/
public class XPathTestConst {
/**
- * Package name that separates by slash.
- */
- public static final String PACKAGE_NAME = FILE_SEP +
- XPathTestConst.class.getPackage().getName().replaceAll("[.]", FILE_SEP);
-
- /**
- * Test base directory. Every package has its own test package directory.
+ * XML source file directory.
*/
- public static final String BASE_DIR
- = System.getProperty("test.src", USER_DIR).replaceAll("\\" + System.getProperty("file.separator"), "/")
- + PACKAGE_NAME + FILE_SEP + "..";
-
- /**
- * Source XML file directory.
- */
- public static final String XML_DIR = BASE_DIR + FILE_SEP + "xmlfiles" + FILE_SEP;
+ public static final String XML_DIR = getPathByClassName(XPathTestConst.class,
+ ".." + FILE_SEP + "xmlfiles");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JAXPBaseTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 jaxp.library;
+
+import java.security.Permission;
+import java.security.Permissions;
+import java.security.Policy;
+import java.util.PropertyPermission;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+
+/**
+ * This is a base class that every test class must extend if it needs to be run
+ * with security mode.
+ */
+public class JAXPBaseTest {
+ /**
+ * Backing up policy.
+ */
+ protected static Policy policy;
+
+ /**
+ * Backing up security manager.
+ */
+ private static SecurityManager sm;
+
+ /*
+ * Install a SecurityManager along with a base Policy to allow testNG to
+ * run when there is a security manager.
+ */
+ @BeforeClass
+ public void setUpClass() throws Exception {
+ setPolicy(new TestPolicy());
+ System.setSecurityManager(new SecurityManager());
+ }
+
+ /*
+ * Install the original Policy and SecurityManager when there is a security
+ * manager.
+ */
+ @AfterClass
+ public void tearDownClass() throws Exception {
+ System.setSecurityManager(sm);
+ setPolicy(policy);
+ }
+
+ /*
+ * Utility Method used to set the current Policy.
+ */
+ protected static void setPolicy(Policy p) {
+ Policy.setPolicy(p);
+ }
+
+ /*
+ * Add the specified permission(s) to the test policy.
+ * Note there is no way to add permissions to current permissions. Reset
+ * test policy by setting minimal permmisons in addition to specified
+ * permissions when calling this method.
+ */
+ protected static void setPermissions(Permission... ps) {
+ Policy.setPolicy(new TestPolicy(ps));
+ }
+
+ /*
+ * Add the specified permission(s) to the test policy.
+ * Note there is no way to add permissions to current permissions. Reset
+ * test policy by setting minimal permmisons in addition to specified
+ * permissions when calling this method.
+ */
+ protected static void setPermissions(Permissions ps) {
+ Policy.setPolicy(new TestPolicy(ps));
+ }
+
+ /**
+ * Backing up policy and security manager for restore when there is a
+ * security manager.
+ */
+ public JAXPBaseTest() {
+ policy = Policy.getPolicy();
+ sm = System.getSecurityManager();
+ }
+
+ /**
+ * Safety acquire a system property.
+ * Note invocation of this method will restore permission to limited
+ * minimal permission of tests. If there is additional permission set
+ * already, you need restore permission by yourself.
+ * @param propName System property name to be acquired.
+ * @return property value
+ */
+ protected String getSystemProperty(final String propName) {
+ setPermissions(new PropertyPermission(propName, "read"));
+ try {
+ return System.getProperty(propName);
+ } finally {
+ setPermissions();
+ }
+ }
+
+ /**
+ * Safety set a system property by given system value.
+ *
+ * @param propName System property name to be set.
+ * @param propValue System property value to be set.
+ */
+ protected void setSystemProperty(final String propName, final String propValue) {
+ setPermissions(new PropertyPermission(propName, "write"));
+ try {
+ if (propValue == null) {
+ System.clearProperty(propName);
+ } else {
+ System.setProperty(propName, propValue);
+ }
+ } finally {
+ setPermissions();
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JAXPFileBaseTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jaxp.library;
+
+import java.io.FilePermission;
+import java.security.Permission;
+import java.security.Permissions;
+import java.security.Policy;
+import static jaxp.library.JAXPBaseTest.setPolicy;
+import org.testng.annotations.BeforeClass;
+
+/**
+ * This is a base class that every test class that need to access local XML
+ * files must extend if it needs to be run with security mode.
+ */
+public class JAXPFileBaseTest extends JAXPBaseTest {
+ /*
+ * Install a SecurityManager along with a base Policy to allow testNG to
+ * run when there is a security manager.
+ */
+ @BeforeClass
+ @Override
+ public void setUpClass() throws Exception {
+ setPolicy(new FileTestPolicy());
+ System.setSecurityManager(new SecurityManager());
+ }
+
+ /*
+ * Add the specified permission(s) to the test policy.
+ * Note there is no way to add permissions to current permissions. Reset
+ * test policy by setting minimal permmisons in addition to specified
+ * permissions when calling this method.
+ */
+ protected static void setPermissions(Permission... ps) {
+ Policy.setPolicy(new FileTestPolicy(ps));
+ }
+
+ /*
+ * Add the specified permission(s) to the test policy.
+ * Note there is no way to add permissions to current permissions. Reset
+ * test policy by setting minimal permmisons in addition to specified
+ * permissions when calling this method.
+ */
+ protected static void setPermissions(Permissions ps) {
+ Policy.setPolicy(new FileTestPolicy(ps));
+ }
+}
+
+/**
+ * This policy is only given to tests that need access local files. Additional
+ * permissions for accessing local files have been granted by default.
+ * @author HaiboYan
+ */
+class FileTestPolicy extends TestPolicy {
+ /**
+ * Constructor which sets the minimum permissions by default allowing testNG
+ * to work with a SecurityManager.
+ * @param ps permissions to be added.
+ */
+ public FileTestPolicy(Permissions ps) {
+ super(ps);
+ }
+
+ /**
+ * Constructor which sets the minimum permissions by default allowing testNG
+ * to work with a SecurityManager.
+ * @param ps permission array to be added.
+ */
+ public FileTestPolicy(Permission... ps) {
+ super(ps);
+ }
+
+ /**
+ * Defines the minimal permissions required by testNG when running these
+ * tests
+ */
+ @Override
+ protected void setMinimalPermissions() {
+ super.setMinimalPermissions();
+ permissions.add(new FilePermission(System.getProperty("user.dir") + "/-",
+ "read, write"));
+ permissions.add(new FilePermission(System.getProperty("test.src") + "/-",
+ "read"));
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JAXPFileReadOnlyBaseTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jaxp.library;
+
+import java.io.FilePermission;
+import static jaxp.library.JAXPBaseTest.setPermissions;
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.BeforeGroups;
+
+/**
+ * This is a base class that every test class that need to reading local XML
+ * files must extend if it needs to be run with security mode.
+ */
+public class JAXPFileReadOnlyBaseTest extends JAXPBaseTest {
+ /**
+ * Source files/XML files directory.
+ */
+ private final String SRC_DIR = getSystemProperty("test.src");
+
+ /**
+ * Allowing access local file system for this group.
+ */
+ @BeforeGroups (groups = {"readLocalFiles"})
+ public void setFilePermissions() {
+ setPermissions(new FilePermission(SRC_DIR + "/-", "read"));
+ }
+
+ /**
+ * Restore the system property.
+ */
+ @AfterGroups (groups = {"readLocalFiles"})
+ public void restoreFilePermissions() {
+ setPermissions();
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JAXPTestUtilities.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/JAXPTestUtilities.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,21 +23,34 @@
package jaxp.library;
import java.io.ByteArrayInputStream;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.io.StringWriter;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
import java.nio.charset.UnsupportedCharsetException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
import static org.testng.Assert.fail;
import org.w3c.dom.Document;
+import org.w3c.dom.Node;
import org.xml.sax.SAXException;
/**
@@ -61,14 +74,17 @@
public static final String FILE_SEP = "/";
/**
- * User home.
+ * Current test directory.
*/
- public static final String USER_DIR = System.getProperty("user.dir", ".");
+ public static final String USER_DIR =
+ System.getProperty("user.dir", ".") + FILE_SEP;;
/**
- * TEMP file directory.
+ * A map storing every test's current test file pointer. File number should
+ * be incremental and it's a thread-safe reading on this file number.
*/
- public static final String TEMP_DIR = System.getProperty("java.io.tmpdir", ".");
+ private static final ConcurrentHashMap<Class, Integer> currentFileNumber
+ = new ConcurrentHashMap<>();
/**
* BOM table for storing BOM header.
@@ -94,12 +110,60 @@
* @return true if two files are identical.
* false if two files are not identical.
* @throws IOException if an I/O error occurs reading from the file or a
- * malformed or unmappable byte sequence is read
+ * malformed or unmappable byte sequence is read.
*/
public static boolean compareWithGold(String goldfile, String outputfile)
throws IOException {
+ return compareWithGold(goldfile, outputfile, StandardCharsets.UTF_8);
+ }
+
+ /**
+ * Compare contents of golden file with test output file line by line.
+ * return true if they're identical.
+ * @param goldfile Golden output file name.
+ * @param outputfile Test output file name.
+ * @param cs the charset to use for decoding.
+ * @return true if two files are identical.
+ * false if two files are not identical.
+ * @throws IOException if an I/O error occurs reading from the file or a
+ * malformed or unmappable byte sequence is read.
+ */
+ public static boolean compareWithGold(String goldfile, String outputfile,
+ Charset cs) throws IOException {
return Files.readAllLines(Paths.get(goldfile)).
- equals(Files.readAllLines(Paths.get(outputfile)));
+ equals(Files.readAllLines(Paths.get(outputfile), cs));
+ }
+
+ /**
+ * Compare contents of golden file with test output list line by line.
+ * return true if they're identical.
+ * @param goldfile Golden output file name.
+ * @param lines test output list.
+ * @return true if file's content is identical to given list.
+ * false if file's content is not identical to given list.
+ * @throws IOException if an I/O error occurs reading from the file or a
+ * malformed or unmappable byte sequence is read
+ */
+ public static boolean compareLinesWithGold(String goldfile, List<String> lines)
+ throws IOException {
+ return Files.readAllLines(Paths.get(goldfile)).equals(lines);
+ }
+
+ /**
+ * Compare contents of golden file with a test output string.
+ * return true if they're identical.
+ * @param goldfile Golden output file name.
+ * @param string test string.
+ * @return true if file's content is identical to given string.
+ * false if file's content is not identical to given string.
+ * @throws IOException if an I/O error occurs reading from the file or a
+ * malformed or unmappable byte sequence is read
+ */
+ public static boolean compareStringWithGold(String goldfile, String string)
+ throws IOException {
+ return Files.readAllLines(Paths.get(goldfile)).stream().collect(
+ Collectors.joining(System.getProperty("line.separator")))
+ .equals(string);
}
/**
@@ -132,6 +196,35 @@
resultD.normalizeDocument();
return goldD.isEqualNode(resultD);
}
+
+ /**
+ * Compare contents of golden file with the serialization represent by given
+ * DOM node.
+ * Here we ignore the white space and comments. return true if they're
+ * lexical identical.
+ * @param goldfile Golden output file name.
+ * @param node A DOM node instance.
+ * @return true if file's content is identical to given node's serialization
+ * represent.
+ * false if file's content is not identical to given node's
+ * serialization represent.
+ * @throws TransformerException If an unrecoverable error occurs during the
+ * course of the transformation..
+ * @throws IOException if an I/O error occurs reading from the file or a
+ * malformed or unmappable byte sequence is read .
+ */
+ public static boolean compareSerializeDOMWithGold(String goldfile, Node node)
+ throws TransformerException, IOException {
+ TransformerFactory factory = TransformerFactory.newInstance();
+ // Use identity transformer to serialize
+ Transformer identityTransformer = factory.newTransformer();
+ StringWriter sw = new StringWriter();
+ StreamResult streamResult = new StreamResult(sw);
+ DOMSource nodeSource = new DOMSource(node);
+ identityTransformer.transform(nodeSource, streamResult);
+ return compareStringWithGold(goldfile, sw.toString());
+ }
+
/**
* Convert stream to ByteArrayInputStream by given character set.
* @param charset target character set.
@@ -159,6 +252,36 @@
return new ByteArrayInputStream(bb.array());
}
+ /**
+ * Worker method to detect common absolute URLs.
+ *
+ * @param s String path\filename or URL (or any, really)
+ * @return true if s starts with a common URI scheme (namely
+ * the ones found in the examples of RFC2396); false otherwise
+ */
+ protected static boolean isCommonURL(String s) {
+ if (null == s)
+ return false;
+ return Pattern.compile("^(file:|http:|ftp:|gopher:|mailto:|news:|telnet:)")
+ .matcher(s).matches();
+ }
+
+ /**
+ * Utility method to translate a String filename to URL.
+ *
+ * If the name starts with a common URI scheme (namely the ones
+ * found in the examples of RFC2396), then simply return the
+ * name as-is (the assumption is that it's already a URL).
+ * Otherwise we attempt (cheaply) to convert to a file:/ URL.
+ *
+ * @param filename local path/filename of a file.
+ * @return a file:/ URL if filename represent a file, the same string if
+ * it appears to already be a URL.
+ */
+ public static String filenameToURL(String filename) {
+ return Paths.get(filename).toUri().toASCIIString();
+ }
+
/**
* Prints error message if an exception is thrown
* @param ex The exception is thrown by test.
@@ -175,4 +298,38 @@
public static void failCleanup(IOException ex, String name) {
fail(String.format(ERROR_MSG_CLEANUP, name), ex);
}
+
+ /**
+ * Retrieve next test output file name. This method is a thread-safe method.
+ * @param clazz test class.
+ * @return next test output file name.
+ */
+ public static String getNextFile(Class clazz) {
+ int nextNumber = currentFileNumber.contains(clazz)
+ ? currentFileNumber.get(clazz) + 1 : 1;
+ Integer i = currentFileNumber.putIfAbsent(clazz, nextNumber);
+ if (i != null && i != nextNumber) {
+ do {
+ nextNumber = currentFileNumber.get(clazz) + 1;
+ } while (currentFileNumber.replace(clazz, nextNumber -1, nextNumber));
+ }
+ return USER_DIR + clazz.getName() + nextNumber + ".out";
+ }
+
+ /**
+ * Acquire a full path string by given class name and relative path string.
+ * @param clazz Class name for the test.
+ * @param relativeDir relative path between java source file and expected
+ * path.
+ * @return a string represents the full path of accessing path.
+ */
+ public static String getPathByClassName(Class clazz, String relativeDir) {
+ String packageName = FILE_SEP +
+ clazz.getPackage().getName().replaceAll("[.]", FILE_SEP);
+ String javaSourcePath = System.getProperty("test.src").replaceAll("\\" + File.separator, FILE_SEP)
+ + packageName + FILE_SEP;
+ String normalizedPath = Paths.get(javaSourcePath, relativeDir).normalize().
+ toAbsolutePath().toString();
+ return normalizedPath.replace("\\", FILE_SEP) + FILE_SEP;
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/jaxp/library/TestPolicy.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 jaxp.library;
+
+import java.security.AllPermission;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.security.SecurityPermission;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.PropertyPermission;
+import java.util.StringJoiner;
+
+/*
+ * Simple Policy class that supports the required Permissions to validate the
+ * JAXP concrete classes.
+ * Note: permission can only be added. You may want to create a new TestPolicy
+ * instance if you need remove permissions.
+ */
+public class TestPolicy extends Policy {
+ protected final PermissionCollection permissions = new Permissions();
+
+ /**
+ * Constructor which sets the minimum permissions by default allowing testNG
+ * to work with a SecurityManager.
+ */
+ public TestPolicy() {
+ setMinimalPermissions();
+ }
+
+ /**
+ * Construct an instance with the minimal permissions required by the test
+ * environment and additional permission(s) as specified.
+ * @param ps permissions to be added.
+ */
+ public TestPolicy(Permissions ps) {
+ setMinimalPermissions();
+ TestPolicy.this.addPermissions(ps);
+ }
+
+ /**
+ * Construct an instance with the minimal permissions required by the test
+ * environment and additional permission(s) as specified.
+ * @param ps permission array to be added.
+ */
+ public TestPolicy(Permission... ps) {
+ setMinimalPermissions();
+ addPermissions(ps);
+ }
+
+ /**
+ * Defines the minimal permissions required by testNG when running these
+ * tests
+ */
+ protected void setMinimalPermissions() {
+ permissions.add(new SecurityPermission("getPolicy"));
+ permissions.add(new SecurityPermission("setPolicy"));
+ permissions.add(new RuntimePermission("getClassLoader"));
+ permissions.add(new RuntimePermission("setSecurityManager"));
+ permissions.add(new RuntimePermission("createSecurityManager"));
+ permissions.add(new PropertyPermission("testng.show.stack.frames",
+ "read"));
+ permissions.add(new PropertyPermission("user.dir", "read"));
+ permissions.add(new PropertyPermission("test.src", "read"));
+ permissions.add(new PropertyPermission("file.separator", "read"));
+ permissions.add(new PropertyPermission("line.separator", "read"));
+ permissions.add(new PropertyPermission("fileStringBuffer", "read"));
+ permissions.add(new PropertyPermission("dataproviderthreadcount", "read"));
+ }
+
+ /*
+ * Add permissions for your tests.
+ * @param permissions to be added.
+ */
+ private void addPermissions(Permissions ps) {
+ Collections.list(ps.elements()).forEach(p -> permissions.add(p));
+ }
+
+
+ /*
+ * Add permissions for your tests.
+ * @param permissions to be added.
+ */
+ private void addPermissions(Permission[] ps) {
+ Arrays.stream(ps).forEach(p -> permissions.add(p));
+ }
+
+ /**
+ * Set all permissions. Caution: this should not called carefully unless
+ * it's really needed.
+ */
+ private void setAllPermissions() {
+ permissions.add(new AllPermission());
+ }
+
+ /*
+ * Overloaded methods from the Policy class.
+ */
+ @Override
+ public String toString() {
+ StringJoiner sj = new StringJoiner("\n", "policy: ", "");
+ Enumeration<Permission> perms = permissions.elements();
+ while (perms.hasMoreElements()) {
+ sj.add(perms.nextElement().toString());
+ }
+ return sj.toString();
+
+ }
+
+ @Override
+ public PermissionCollection getPermissions(ProtectionDomain domain) {
+ return permissions;
+ }
+
+ @Override
+ public PermissionCollection getPermissions(CodeSource codesource) {
+ return permissions;
+ }
+
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission perm) {
+ return permissions.implies(perm);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/org/xml/sax/ptests/MyAttrCHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.xml.sax.ptests;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Simple attributes handler.
+ */
+public class MyAttrCHandler extends DefaultHandler {
+ /**
+ * FileWriter to write string to output file.
+ */
+ private final BufferedWriter bWriter;
+
+ /**
+ * Initiate FileWriter
+ * @param fileName output file name.
+ * @throws IOException
+ */
+ public MyAttrCHandler(String fileName) throws IOException {
+ bWriter = new BufferedWriter(new FileWriter(fileName));
+ }
+
+ /**
+ * Write element content before start access every element.
+ * @throws org.xml.sax.SAXException
+ */
+ @Override
+ public void startElement(String uri, String localName,
+ String qName, Attributes attributes) throws SAXException {
+ try {
+ String string = "uri <" + uri + "> localName <" + localName +
+ "> qName <" + qName + ">";
+
+ bWriter.write( string, 0, string.length());
+ bWriter.newLine();
+
+ int length = attributes.getLength();
+ string = "length: " + length;
+
+ bWriter.write( string, 0, string.length());
+ bWriter.newLine();
+
+ for (int ind=0; ind < length ; ind++) {
+ string = "For index = " + ind + "\n";
+ string += "getLocalName <" + attributes.getLocalName(ind)
+ +">" + "\n";
+ string += "getQName <" + attributes.getQName(ind) +">" + "\n";
+ string += "getType <" + attributes.getType(ind) +">" + "\n";
+ string += "getURI <" + attributes.getURI(ind) +">" + "\n";
+ string += "getValue <" + attributes.getValue(ind) +">" + "\n";
+
+ bWriter.write( string, 0, string.length());
+ bWriter.newLine();
+
+ String gotLocalName = attributes.getLocalName(ind);
+ String gotQName = attributes.getQName(ind);
+ String gotURI = attributes.getURI(ind);
+
+ string ="Using localName, qname and uri pertaining to index = "
+ + ind;
+ bWriter.write( string, 0, string.length());
+ bWriter.newLine();
+
+ string = "getIndex(qName) <" + attributes.getIndex(gotQName)
+ +">" + "\n";
+ string += "getIndex(uri, localName) <" +
+ attributes.getIndex(gotURI, gotLocalName) +">" + "\n";
+
+ string += "getType(qName) <" +
+ attributes.getType(gotQName) +">" + "\n";
+ string += "getType(uri, localName) <" +
+ attributes.getType(gotURI, gotLocalName) +">" + "\n";
+
+ string += "getValue(qName) <" +
+ attributes.getValue(gotQName) +">" + "\n";
+ string += "getValue(uri, localName) <" +
+ attributes.getValue(gotURI, gotLocalName) +">" + "\n";
+
+ bWriter.write( string, 0, string.length());
+ bWriter.newLine();
+ }
+ bWriter.newLine();
+ } catch(IOException ex){
+ throw new SAXException(ex);
+ }
+ }
+
+ /**
+ * Flush the stream and close the file.
+ * @throws IOException when writing or closing file failed.
+ */
+ public void flushAndClose() throws IOException {
+ bWriter.flush();
+ bWriter.close();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/org/xml/sax/ptests/MyNSContentHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package org.xml.sax.ptests;
+
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.helpers.LocatorImpl;
+import org.xml.sax.Locator;
+import org.xml.sax.Attributes;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.FileWriter;
+import org.xml.sax.SAXException;
+
+class MyNSContentHandler extends DefaultHandler implements AutoCloseable{
+ /**
+ * Prefix for written string.
+ */
+ private final static String WRITE_ERROR = "bWrite error";
+
+ /**
+ * FileWriter to write output file.
+ */
+ private final BufferedWriter bWriter;
+
+ /**
+ * Default locator.
+ */
+ Locator locator = new LocatorImpl();
+
+ /**
+ * Initiate FileWrite.
+ * @param outputFileName file name of output file.
+ * @throws SAXException when open output file failed.
+ */
+ public MyNSContentHandler(String outputFileName) throws SAXException {
+ try {
+ bWriter = new BufferedWriter(new FileWriter(outputFileName));
+ } catch (IOException ex) {
+ throw new SAXException(ex);
+ }
+ }
+
+ /**
+ * Write characters tag along with content of characters when meet
+ * characters event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void characters(char[] ch, int start, int length)
+ throws SAXException {
+ String s = new String(ch, start, length);
+ println("characters...length is:" + s.length() + "\n"
+ + "<" + s + ">");
+ }
+
+ /**
+ * Write endDocument tag then flush the content and close the file when meet
+ * endDocument event.
+ * @throws IOException error happen when writing file or closing file.
+ */
+ @Override
+ public void endDocument() throws SAXException {
+ try {
+ println("endDocument...");
+ bWriter.flush();
+ bWriter.close();
+ } catch (IOException ex) {
+ throw new SAXException(WRITE_ERROR, ex);
+ }
+ }
+
+ /**
+ * Write endElement tag with namespaceURI, localName, qName to the file when
+ * meet endElement event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void endElement(String namespaceURI, String localName, String qName)
+ throws SAXException {
+ println("endElement...\n" + "namespaceURI: <" + namespaceURI
+ + "> localName: <" + localName + "> qName: <" + qName + ">");
+ }
+
+ /**
+ * Write endPrefixMapping tag along with prefix to the file when meet
+ * endPrefixMapping event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void endPrefixMapping(String prefix) throws SAXException {
+ println("endPrefixMapping...\n" + "prefix: <" + prefix + ">");
+ }
+
+ /**
+ * Write ignorableWhitespace tag along with white spaces when meet
+ * ignorableWhitespace event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void ignorableWhitespace(char[] ch, int start, int length)
+ throws SAXException {
+ String s = new String(ch, start, length);
+ println("ignorableWhitespace...\n" + s
+ + " ignorable white space string length: " + s.length());
+ }
+
+ /**
+ * Write processingInstruction tag along with target name and target data
+ * when meet processingInstruction event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void processingInstruction(String target, String data)
+ throws SAXException {
+ println("processingInstruction...target:<" + target
+ + "> data: <" + data + ">");
+ }
+
+ /**
+ * Write setDocumentLocator tag when meet setDocumentLocator event.
+ */
+ @Override
+ public void setDocumentLocator(Locator locator) {
+ try {
+ this.locator = locator;
+ println("setDocumentLocator...");
+ } catch (SAXException ex) {
+ System.err.println(WRITE_ERROR + ex);
+ }
+ }
+
+ /**
+ * Write skippedEntity tag along with entity name when meet skippedEntity
+ * event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void skippedEntity(String name) throws SAXException {
+ println("skippedEntity...\n" + "name: <" + name + ">");
+ }
+
+ /**
+ * Write startDocument tag when meet startDocument event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void startDocument() throws SAXException {
+ println("startDocument...");
+ }
+
+ /**
+ * Write startElement tag along with namespaceURI, localName, qName, number
+ * of attributes and line number when meet startElement event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void startElement(String namespaceURI, String localName,
+ String qName, Attributes atts) throws SAXException {
+ println("startElement...\n" + "namespaceURI: <" + namespaceURI
+ + "> localName: <" + localName + "> qName: <" + qName
+ + "> Number of Attributes: <" + atts.getLength()
+ + "> Line# <" + locator.getLineNumber() + ">");
+ }
+
+ /**
+ * Write startPrefixMapping tag along with prefix and uri when meet
+ * startPrefixMapping event.
+ * @throws IOException error happen when writing file.
+ */
+ @Override
+ public void startPrefixMapping(String prefix, String uri)
+ throws SAXException {
+ println("startPrefixMapping...\n" + "prefix: <" + prefix
+ + "> uri: <" + uri + ">");
+ }
+ /**
+ * Write outString to output file.
+ * @param outString string to be written.
+ * @throws SAXException
+ */
+ private void println(String outString) throws SAXException {
+ try {
+ bWriter.write( outString, 0, outString.length());
+ bWriter.newLine();
+ } catch (IOException ex) {
+ throw new SAXException(WRITE_ERROR, ex);
+ }
+ }
+
+ /**
+ * Close writer if it's initiated.
+ * @throws IOException if any I/O error when close writer.
+ */
+ @Override
+ public void close() throws IOException {
+ if (bWriter != null)
+ bWriter.close();
+ }
+}
--- a/jaxp/test/javax/xml/jaxp/libs/org/xml/sax/ptests/SAXTestConst.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/libs/org/xml/sax/ptests/SAXTestConst.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
package org.xml.sax.ptests;
import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.getPathByClassName;
/**
* This is the Base test class provide basic support for JAXP SAX functional
@@ -32,33 +32,15 @@
*/
public class SAXTestConst {
/**
- * Current test directory.
+ * XML source file directory.
*/
- public static final String CLASS_DIR
- = System.getProperty("test.classes", ".") + FILE_SEP;
+ public static final String XML_DIR = getPathByClassName(SAXTestConst.class,
+ ".." + FILE_SEP + "xmlfiles");
- /**
- * Package name that separates by slash.
- */
- public static final String PACKAGE_NAME = FILE_SEP +
- SAXTestConst.class.getPackage().getName().replaceAll("[.]", FILE_SEP);
/**
- * Test base directory. Every package has its own test package directory.
- */
- public static final String BASE_DIR
- = System.getProperty("test.src", USER_DIR).replaceAll("\\" + System.getProperty("file.separator"), "/")
- + PACKAGE_NAME + FILE_SEP + "..";
-
- /**
- * Source XML file directory.
+ * Golden validation files directory.
*/
- public static final String XML_DIR = BASE_DIR + FILE_SEP + "xmlfiles" + FILE_SEP;
-
- /**
- * Golden output file directory. We pre-define all expected output in golden
- * output file. Test verifies whether the standard output is same as content
- * of golden file.
- */
- public static final String GOLDEN_DIR = XML_DIR + FILE_SEP + "out" + FILE_SEP;
+ public static final String GOLDEN_DIR = getPathByClassName(SAXTestConst.class,
+ ".." + FILE_SEP + "xmlfiles" + FILE_SEP + "out");
}
--- a/jaxp/test/javax/xml/jaxp/libs/test/auctionportal/HiBidConstants.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxp/test/javax/xml/jaxp/libs/test/auctionportal/HiBidConstants.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -22,44 +22,21 @@
*/
package test.auctionportal;
-import static jaxp.library.JAXPTestUtilities.FILE_SEP;
-import static jaxp.library.JAXPTestUtilities.USER_DIR;
+import static jaxp.library.JAXPTestUtilities.getPathByClassName;
/**
* This is the Base test class provide basic support for Auction portal test.
*/
public class HiBidConstants {
/**
- * Current test directory.
+ * XML source file directory.
*/
- public static final String CLASS_DIR
- = System.getProperty("test.classes", ".") + FILE_SEP;
-
- /**
- * Package name that separates by slash.
- */
- public static final String PACKAGE_NAME = FILE_SEP +
- HiBidConstants.class.getPackage().getName().replaceAll("[.]", FILE_SEP);
-
+ public static final String XML_DIR = getPathByClassName(HiBidConstants.class, "content");
/**
- * Java source directory.
- */
- public static final String SRC_DIR = System.getProperty("test.src", USER_DIR)
- .replaceAll("\\" + System.getProperty("file.separator"), "/")
- + PACKAGE_NAME + FILE_SEP;
-
- /**
- * Source XML file directory.
+ * Golden validation files directory.
*/
- public static final String XML_DIR = SRC_DIR + "content" + FILE_SEP;
-
- /**
- * Golden output file directory.
- * We pre-define all expected output in golden output file. Test verifies
- * whether the standard output is same as content of golden file.
- */
- public static final String GOLDEN_DIR = SRC_DIR + "golden" + FILE_SEP;
+ public static final String GOLDEN_DIR = getPathByClassName(HiBidConstants.class, "golden");
/**
* Name space for account operation.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/test/auctionportal/MyDOMErrorHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test.auctionportal;
+
+import org.w3c.dom.DOMErrorHandler;
+import org.w3c.dom.DOMError;
+
+/**
+ * Error handler for recording DOM processing error.
+ */
+public class MyDOMErrorHandler implements DOMErrorHandler {
+ /**
+ * flag shows if there is any error.
+ */
+ private volatile boolean errorOccured = false;
+
+ /**
+ * Set errorOcurred to true when an error occurs.
+ * @param error The error object that describes the error. This object
+ * may be reused by the DOM implementation across multiple calls to
+ * the handleError method.
+ * @return true that processing may continue depending on.
+ */
+ @Override
+ public boolean handleError (DOMError error) {
+ System.err.println( "ERROR" + error.getMessage());
+ System.err.println( "ERROR" + error.getRelatedData());
+ errorOccured = true;
+ return true;
+ }
+
+ /**
+ * Showing if any error was handled.
+ * @return true if there is one or more error.
+ * false no error occurs.
+ */
+ public boolean isError() {
+ return errorOccured;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/test/auctionportal/MyDOMOutput.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test.auctionportal;
+
+import org.w3c.dom.ls.LSOutput;
+import java.io.OutputStream;
+import java.io.Writer;
+
+/**
+ * A Thread-safe LS output destination for DOM processing. LSOutput objects
+ * belong to the application. The DOM implementation will never modify them
+ * (though it may make copies and modify the copies, if necessary).
+ */
+public class MyDOMOutput implements LSOutput {
+ /**
+ * An attribute of a language and binding dependent type that represents a
+ * writable stream of bytes.
+ */
+ private OutputStream bytestream;
+
+ /**
+ * character encoding to use for the output.
+ */
+ private String encoding;
+
+ /**
+ * The system identifier.
+ */
+ private String sysId;
+
+ /**
+ * Writable stream to which 16-bit units can be output.
+ */
+ private Writer writer;
+
+ /**
+ * An attribute of a language and binding dependent type that represents a
+ * writable stream of bytes.
+ *
+ * @return a writable stream.
+ */
+ @Override
+ public OutputStream getByteStream() {
+ return bytestream;
+ }
+
+ /**
+ * An attribute of a language and binding dependent type that represents a
+ * writable stream to which 16-bit units can be output.
+ *
+ * @return writable stream instance.
+ */
+ @Override
+ public Writer getCharacterStream() {
+ return writer;
+ }
+
+ /**
+ * The character encoding to use for the output.
+ *
+ * @return the character encoding.
+ */
+ @Override
+ public String getEncoding() {
+ return encoding;
+ }
+
+ /**
+ * The system identifier for this output destination.
+ *
+ * @return system identifier.
+ */
+ @Override
+ public String getSystemId() {
+ return sysId;
+ }
+
+ /**
+ * Set writable stream of bytes.
+ *
+ * @param bs OutputStream instance
+ */
+ @Override
+ public void setByteStream(OutputStream bs) {
+ bytestream = bs;
+ }
+
+ /**
+ * Set 16 bits unit writable stream.
+ *
+ * @param cs a Writer instance
+ */
+ @Override
+ public void setCharacterStream(Writer cs) {
+ writer = cs;
+ }
+
+ /**
+ * Set character encoding to use for the output.
+ *
+ * @param encoding encoding set to the output
+ */
+ @Override
+ public void setEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ /**
+ * Set the system identifier for the output.
+ *
+ * @param sysId system identifier string.
+ */
+ @Override
+ public void setSystemId(String sysId) {
+ this.sysId = sysId;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/test/auctionportal/MyErrorHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test.auctionportal;
+
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * ErrorHandler for error handling. Set state if any method in error, warning
+ * or fatalError was called.
+ */
+public final class MyErrorHandler extends DefaultHandler {
+ /**
+ * Enumeration for ErrorHandler's state.
+ */
+ private enum STATE { ERROR, FATAL, WARNING, NORMAL};
+
+ /**
+ * Set state as normal by default.
+ */
+ private volatile STATE state = STATE.NORMAL;
+
+ /**
+ * Keep exception for further investigation.
+ */
+ private volatile SAXParseException exception;
+
+ /**
+ * Save exception and set state to ERROR.
+ * @param e exception wrap error.
+ */
+ @Override
+ public void error (SAXParseException e) {
+ state = STATE.ERROR;
+ exception = e;
+ }
+
+ /**
+ * Save exception and set state to FATAL.
+ * @param e exception wrap error.
+ */
+ @Override
+ public void fatalError (SAXParseException e) {
+ state = STATE.FATAL;
+ exception = e;
+ }
+
+ /**
+ * Save exception and set state to WARNING.
+ * @param e exception wrap error.
+ */
+ @Override
+ public void warning (SAXParseException e) {
+ state = STATE.WARNING;
+ exception = e;
+ }
+
+ /**
+ * return ErrorHandle's state .
+ * @return true No error, fatalError and warning.
+ * false there is any error, fatalError or warning in processing.
+ */
+ public boolean isAnyError() {
+ if (state != STATE.NORMAL)
+ System.out.println(exception);
+ return state != STATE.NORMAL;
+ }
+
+ /**
+ * return whether fatalError is the only error.
+ * @return true fatalError is the only error.
+ * false there is no error, or other error besides fatalError.
+ */
+ public boolean isFatalError() {
+ if (state == STATE.FATAL)
+ System.out.println(exception);
+ return state == STATE.FATAL;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jaxp/test/javax/xml/jaxp/libs/test/auctionportal/XInclHandler.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,389 @@
+/*
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test.auctionportal;
+
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
+import java.util.stream.Collectors;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * A SAX2 event handlers.
+ * This SAX2 ContentHandler receives callback event then print whole document
+ * that is parsed.
+ */
+public class XInclHandler extends DefaultHandler implements LexicalHandler {
+ /**
+ * Print writer.
+ */
+ private final PrintWriter fOut;
+
+ /**
+ * Canonical output.
+ */
+ private volatile boolean fCanonical;
+
+ /**
+ * Element depth.
+ */
+ private volatile int fElementDepth;
+
+ /**
+ * Sets whether output is canonical.
+ *
+ * @param canonical if the output is canonical format.
+ */
+ public void setCanonical(boolean canonical) {
+ fCanonical = canonical;
+ }
+
+ /**
+ * Sets the output stream for printing.
+ * @param stream OutputStream for message output.
+ * @param encoding File encoding for message output.
+ * @throws UnsupportedEncodingException if given encoding is an unsupported
+ * encoding name or invalid encoding name.
+ */
+ public XInclHandler(OutputStream stream, String encoding)
+ throws UnsupportedEncodingException {
+ // At least set one encoding.
+ if (encoding == null) {
+ encoding = "UTF8";
+ }
+
+ fOut = new PrintWriter(new OutputStreamWriter(stream, encoding), false);
+ }
+
+ /**
+ * Receive notification of the beginning of the document. Write the start
+ * document tag if it's not canonical mode.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ @Override
+ public void startDocument() throws SAXException {
+ fElementDepth = 0;
+
+ if (!fCanonical) {
+ writeFlush("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+ }
+ }
+
+ /**
+ * Receive notification of a processing instruction.
+ * @param target The processing instruction target.
+ * @param data The processing instruction data, or null if
+ * none is supplied.
+ * @exception SAXException Any SAX exception, possibly wrapping another
+ * exception.
+ */
+ @Override
+ public void processingInstruction (String target, String data)
+ throws SAXException {
+ if (fElementDepth > 0) {
+ StringBuilder instruction = new StringBuilder("<?").append(target);
+ if (data != null && data.length() > 0) {
+ instruction.append(' ').append(data);
+ }
+ instruction.append("?>");
+ writeFlush(instruction.toString());
+ }
+ }
+
+ /**
+ * Receive notification of the start of an element then write the normalized
+ * output to the file.
+ * @param uri The Namespace URI, or the empty string if the
+ * element has no Namespace URI or if Namespace
+ * processing is not being performed.
+ * @param local The local name (without prefix), or the
+ * empty string if Namespace processing is not being
+ * performed.
+ * @param raw The qualified name (with prefix), or the
+ * empty string if qualified names are not available.
+ * @param attrs The attributes attached to the element. If
+ * there are no attributes, it shall be an empty
+ * Attributes object.
+ * @throws SAXException Any SAX exception, possibly wrapping another
+ * exception.
+ */
+ @Override
+ public void startElement(String uri, String local, String raw,
+ Attributes attrs) throws SAXException {
+ fElementDepth++;
+ StringBuilder start = new StringBuilder().append('<').append(raw);
+ if (attrs != null) {
+ for (int i = 0; i < attrs.getLength(); i++) {
+ start.append(' ').append(attrs.getQName(i)).append("=\"").
+ append(normalizeAndPrint(attrs.getValue(i))).append('"');
+ }
+ }
+ start.append('>');
+ writeFlush(start.toString());
+ }
+
+ /**
+ * Receive notification of character data inside an element and write
+ * normalized characters to file.
+ * @param ch The characters.
+ * @param start The start position in the character array.
+ * @param length The number of characters to use from the
+ * character array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ @Override
+ public void characters(char ch[], int start, int length)
+ throws SAXException {
+ writeFlush(normalizeAndPrint(ch, start, length));
+ }
+
+ /**
+ * Receiving notification of ignorable whitespace in element content and
+ * writing normalized ignorable characters to file.
+ * @param ch The characters.
+ * @param start The start position in the character array.
+ * @param length The number of characters to use from the
+ * character array.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ @Override
+ public void ignorableWhitespace(char ch[], int start, int length)
+ throws SAXException {
+ characters(ch, start, length);
+ }
+
+ /**
+ * Receive notification of the end of an element and print end element.
+ *
+ * @param uri The Namespace URI, or the empty string if the
+ * element has no Namespace URI or if Namespace
+ * processing is not being performed.
+ * @param local The local name (without prefix), or the
+ * empty string if Namespace processing is not being
+ * performed.
+ * @param raw The qualified name (with prefix), or the
+ * empty string if qualified names are not available.
+ * @throws org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ @Override
+ public void endElement(String uri, String local, String raw)
+ throws SAXException {
+ fElementDepth--;
+ writeFlush("</" + raw + ">");
+ }
+
+ /**
+ * Receive notification of a parser warning and print it out.
+ * @param ex The warning information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ @Override
+ public void warning(SAXParseException ex) throws SAXException {
+ printError("Warning", ex);
+ }
+
+ /**
+ * Receive notification of a parser error and print it out.
+ * @param ex The error information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+ */
+ @Override
+ public void error(SAXParseException ex) throws SAXException {
+ printError("Error", ex);
+ }
+
+ /**
+ * Receive notification of a parser fatal error. Throw out fatal error
+ * following print fatal error message.
+ * @param ex The fatal error information encoded as an exception.
+ * @exception org.xml.sax.SAXException Any SAX exception, possibly
+ * wrapping another exception.
+
+ */
+ @Override
+ public void fatalError(SAXParseException ex) throws SAXException {
+ printError("Fatal Error", ex);
+ throw ex;
+ }
+
+ /**
+ * Do nothing on start DTD.
+ * @param name The document type name.
+ * @param publicId The declared public identifier for the
+ * external DTD subset, or null if none was declared.
+ * @param systemId The declared system identifier for the
+ * external DTD subset, or null if none was declared.
+ * (Note that this is not resolved against the document
+ * base URI.)
+ * @exception SAXException The application may raise an
+ * exception.
+ */
+ @Override
+ public void startDTD(String name, String publicId, String systemId)
+ throws SAXException {
+ }
+
+ /**
+ * Do nothing on end DTD.
+ * @exception SAXException The application may raise an exception.
+ */
+ @Override
+ public void endDTD() throws SAXException {
+ }
+
+ /**
+ * Do nothing on start entity.
+ * @param name The name of the entity. If it is a parameter
+ * entity, the name will begin with '%', and if it is the
+ * external DTD subset, it will be "[dtd]".
+ * @exception SAXException The application may raise an exception.
+ */
+ @Override
+ public void startEntity(String name) throws SAXException {
+ }
+
+ /**
+ * Do nothing on end entity.
+ * @param name The name of the entity. If it is a parameter
+ * entity, the name will begin with '%', and if it is the
+ * external DTD subset, it will be "[dtd]".
+ * @exception SAXException The application may raise an exception.
+ */
+ @Override
+ public void endEntity(String name) throws SAXException {
+ }
+
+ /**
+ * Do nothing on start CDATA section.
+ * @exception SAXException The application may raise an exception.
+ */
+ @Override
+ public void startCDATA() throws SAXException {
+ }
+
+ /**
+ * Do nothing on end CDATA section.
+ * @exception SAXException The application may raise an exception.
+ */
+ @Override
+ public void endCDATA() throws SAXException {
+ }
+
+ /**
+ * Report an normalized XML comment when receive a comment in the document.
+ *
+ * @param ch An array holding the characters in the comment.
+ * @param start The starting position in the array.
+ * @param length The number of characters to use from the array.
+ * @exception SAXException The application may raise an exception.
+ */
+ @Override
+ public void comment(char ch[], int start, int length) throws SAXException {
+ if (!fCanonical && fElementDepth > 0) {
+ writeFlush("<!--" + normalizeAndPrint(ch, start, length) + "-->");
+ }
+ }
+
+ /**
+ * Normalizes and prints the given string.
+ * @param s String to be normalized
+ */
+ private String normalizeAndPrint(String s) {
+ return s.chars().mapToObj(c -> normalizeAndPrint((char)c)).
+ collect(Collectors.joining());
+ }
+
+ /**
+ * Normalizes and prints the given array of characters.
+ * @param ch The characters to be normalized.
+ * @param start The start position in the character array.
+ * @param length The number of characters to use from the
+ * character array.
+ */
+ private String normalizeAndPrint(char[] ch, int offset, int length) {
+ return normalizeAndPrint(new String(ch, offset, length));
+ }
+
+ /**
+ * Normalizes given character.
+ * @param c char to be normalized.
+ */
+ private String normalizeAndPrint(char c) {
+ switch (c) {
+ case '<':
+ return "<";
+ case '>':
+ return ">";
+ case '&':
+ return "&";
+ case '"':
+ return """;
+ case '\r':
+ case '\n':
+ return fCanonical ? "&#" + Integer.toString(c) + ";" : String.valueOf(c);
+ default:
+ return String.valueOf(c);
+ }
+ }
+
+ /**
+ * Prints the error message.
+ * @param type error type
+ * @param ex exception that need to be printed
+ */
+ private void printError(String type, SAXParseException ex) {
+ System.err.print("[" + type + "] ");
+ String systemId = ex.getSystemId();
+ if (systemId != null) {
+ int index = systemId.lastIndexOf('/');
+ if (index != -1)
+ systemId = systemId.substring(index + 1);
+ System.err.print(systemId);
+ }
+ System.err.print(':' + ex.getLineNumber());
+ System.err.print(':' + ex.getColumnNumber());
+ System.err.println(": " + ex.getMessage());
+ System.err.flush();
+ }
+
+ /**
+ * Write out and flush.
+ * @param out string to be written.
+ */
+ private void writeFlush(String out) {
+ fOut.print(out);
+ fOut.flush();
+ }
+}
--- a/jaxws/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -291,3 +291,5 @@
edc13d27dc871be57d7ca77eef77e6d04972fee2 jdk9-b43
2a03baa4d849818ff6d635f110c2813b12fc2326 jdk9-b44
e529374fbe526dbd668e5e98fc047b42b3bc6d33 jdk9-b45
+64ca52b0bda8028636e4ccafbe1107befcdda47d jdk9-b46
+6c17d648d03e4bf4729c3645f8db55d34115e0b7 jdk9-b47
--- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/api/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/api/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -38,6 +38,9 @@
/**
* Utils class.
+ *
+ * WARNING: If you are doing any changes don't forget to change other Utils classes in different packages.
+ *
* Has *package private* access to avoid inappropriate usage.
*/
final class Utils {
@@ -51,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -69,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/model/impl/RuntimeBuiltinLeafInfoImpl.java Tue Jan 27 13:58:55 2015 -0500
@@ -205,7 +205,15 @@
static {
- QName[] qnames = (System.getProperty(MAP_ANYURI_TO_URI) == null) ? new QName[] {
+ String MAP_ANYURI_TO_URI_VALUE = AccessController.doPrivileged(
+ new PrivilegedAction<String>() {
+ @Override
+ public String run() {
+ return System.getProperty(MAP_ANYURI_TO_URI);
+ }
+ }
+ );
+ QName[] qnames = (MAP_ANYURI_TO_URI_VALUE == null) ? new QName[] {
createXS("string"),
createXS("anySimpleType"),
createXS("normalizedString"),
@@ -318,7 +326,7 @@
return v.toExternalForm();
}
});
- if (System.getProperty(MAP_ANYURI_TO_URI) == null) {
+ if (MAP_ANYURI_TO_URI_VALUE == null) {
secondaryList.add(
new StringImpl<URI>(URI.class, createXS("string")) {
public URI parse(CharSequence text) throws SAXException {
@@ -782,17 +790,18 @@
}
});
primaryList.add(
- new StringImpl<BigDecimal>(BigDecimal.class,
- createXS("decimal")
+ new StringImpl<BigDecimal>(BigDecimal.class,
+ createXS("decimal")
) {
- public BigDecimal parse(CharSequence text) {
- return DatatypeConverterImpl._parseDecimal(text.toString());
+ public BigDecimal parse(CharSequence text) {
+ return DatatypeConverterImpl._parseDecimal(text.toString());
+ }
+
+ public String print(BigDecimal v) {
+ return DatatypeConverterImpl._printDecimal(v);
+ }
}
-
- public String print(BigDecimal v) {
- return DatatypeConverterImpl._printDecimal(v);
- }
- });
+ );
primaryList.add(
new StringImpl<QName>(QName.class,
createXS("QName")
@@ -820,7 +829,7 @@
w.getNamespaceContext().declareNamespace(v.getNamespaceURI(),v.getPrefix(),false);
}
});
- if (System.getProperty(MAP_ANYURI_TO_URI) != null) {
+ if (MAP_ANYURI_TO_URI_VALUE != null) {
primaryList.add(
new StringImpl<URI>(URI.class, createXS("anyURI")) {
public URI parse(CharSequence text) throws SAXException {
@@ -838,16 +847,17 @@
});
}
primaryList.add(
- new StringImpl<Duration>(Duration.class, createXS("duration")) {
- public String print(Duration duration) {
- return duration.toString();
- }
+ new StringImpl<Duration>(Duration.class, createXS("duration")) {
+ public String print(Duration duration) {
+ return duration.toString();
+ }
- public Duration parse(CharSequence lexical) {
- TODO.checkSpec("JSR222 Issue #42");
- return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString());
+ public Duration parse(CharSequence lexical) {
+ TODO.checkSpec("JSR222 Issue #42");
+ return DatatypeConverterImpl.getDatatypeFactory().newDuration(lexical.toString());
+ }
}
- });
+ );
primaryList.add(
new StringImpl<Void>(Void.class) {
// 'void' binding isn't defined by the spec, but when the JAX-RPC processes user-defined
--- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/model/impl/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/model/impl/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -38,6 +38,9 @@
/**
* Utils class.
+ *
+ * WARNING: If you are doing any changes don't forget to change other Utils classes in different packages.
+ *
* Has *package private* access to avoid inappropriate usage.
*/
final class Utils {
@@ -51,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -69,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -38,6 +38,9 @@
/**
* Utils class.
+ *
+ * WARNING: If you are doing any changes don't forget to change other Utils classes in different packages.
+ *
* Has *package private* access to avoid inappropriate usage.
*/
final class Utils {
@@ -51,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -69,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/property/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/property/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -38,6 +38,9 @@
/**
* Utils class.
+ *
+ * WARNING: If you are doing any changes don't forget to change other Utils classes in different packages.
+ *
* Has *package private* access to avoid inappropriate usage.
*/
final class Utils {
@@ -51,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -69,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/reflect/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/runtime/reflect/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -38,6 +38,9 @@
/**
* Utils class.
+ *
+ * WARNING: If you are doing any changes don't forget to change other Utils classes in different packages.
+ *
* Has *package private* access to avoid inappropriate usage.
*/
final class Utils {
@@ -51,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -69,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/util/XmlFactory.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.bind/share/classes/com/sun/xml/internal/bind/v2/util/XmlFactory.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,10 @@
package com.sun.xml.internal.bind.v2.util;
-import com.sun.xml.internal.bind.Util;
import com.sun.xml.internal.bind.v2.Messages;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.XMLConstants;
@@ -43,8 +45,6 @@
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
-import static com.sun.xml.internal.bind.Util.getSystemProperty;
-
/**
* Provides helper methods for creating properly configured XML parser
* factory instances with namespace support turned on and configured for
@@ -68,7 +68,14 @@
*/
private static final String DISABLE_XML_SECURITY = "com.sun.xml.internal.bind.disableXmlSecurity";
- public static final boolean XML_SECURITY_DISABLED = Boolean.parseBoolean(getSystemProperty(DISABLE_XML_SECURITY));
+ private static final boolean XML_SECURITY_DISABLED = AccessController.doPrivileged(
+ new PrivilegedAction<Boolean>() {
+ @Override
+ public Boolean run() {
+ return Boolean.getBoolean(DISABLE_XML_SECURITY);
+ }
+ }
+ );
private static boolean isXMLSecurityDisabled(boolean runtimeSetting) {
return XML_SECURITY_DISABLED || runtimeSetting;
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/model/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/model/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -54,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -72,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/spi/ProviderImpl.java Tue Jan 27 13:58:55 2015 -0500
@@ -147,19 +147,12 @@
}
public EndpointReference readEndpointReference(final Source eprInfoset) {
- // EPR constructors are private, so we need privilege escalation.
- // this unmarshalling can only access instances of a fixed, known set of classes,
- // so doing that shouldn't introduce security vulnerability.
- return AccessController.doPrivileged(new PrivilegedAction<EndpointReference>() {
- public EndpointReference run() {
- try {
- Unmarshaller unmarshaller = eprjc.get().createUnmarshaller();
- return (EndpointReference) unmarshaller.unmarshal(eprInfoset);
- } catch (JAXBException e) {
- throw new WebServiceException("Error creating Marshaller or marshalling.", e);
- }
- }
- });
+ try {
+ Unmarshaller unmarshaller = eprjc.get().createUnmarshaller();
+ return (EndpointReference) unmarshaller.unmarshal(eprInfoset);
+ } catch (JAXBException e) {
+ throw new WebServiceException("Error creating Marshaller or marshalling.", e);
+ }
}
public <T> T getPort(EndpointReference endpointReference, Class<T> clazz, WebServiceFeature... webServiceFeatures) {
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/spi/db/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/spi/db/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -54,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -72,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/java.xml.ws/share/classes/com/sun/xml/internal/ws/util/xml/XmlUtil.java Tue Jan 27 13:58:55 2015 -0500
@@ -63,6 +63,8 @@
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
@@ -84,12 +86,16 @@
private static final Logger LOGGER = Logger.getLogger(XmlUtil.class.getName());
- private static boolean XML_SECURITY_DISABLED;
+ private static final String DISABLE_XML_SECURITY = "com.sun.xml.internal.ws.disableXmlSecurity";
- static {
- String disableXmlSecurity = System.getProperty("com.sun.xml.internal.ws.disableXmlSecurity");
- XML_SECURITY_DISABLED = disableXmlSecurity == null || !Boolean.valueOf(disableXmlSecurity);
- }
+ private static boolean XML_SECURITY_DISABLED = AccessController.doPrivileged(
+ new PrivilegedAction<Boolean>() {
+ @Override
+ public Boolean run() {
+ return Boolean.getBoolean(DISABLE_XML_SECURITY);
+ }
+ }
+ );
public static String getPrefix(String s) {
int i = s.indexOf(':');
--- a/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/model/nav/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jaxws/src/jdk.xml.bind/share/classes/com/sun/tools/internal/xjc/model/nav/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -38,6 +38,9 @@
/**
* Utils class.
+ *
+ * WARNING: If you are doing any changes don't forget to change other Utils classes in different packages.
+ *
* Has *package private* access to avoid inappropriate usage.
*/
final class Utils {
@@ -51,17 +54,20 @@
static { // we statically initializing REFLECTION_NAVIGATOR property
try {
- Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
- //noinspection unchecked
- final Method getInstance = refNav.getDeclaredMethod("getInstance");
+ final Class refNav = Class.forName("com.sun.xml.internal.bind.v2.model.nav.ReflectionNavigator");
// requires accessClassInPackage privilege
- AccessController.doPrivileged(
- new PrivilegedAction<Object>() {
+ final Method getInstance = AccessController.doPrivileged(
+ new PrivilegedAction<Method>() {
@Override
- public Object run() {
- getInstance.setAccessible(true);
- return null;
+ public Method run() {
+ try {
+ Method getInstance = refNav.getDeclaredMethod("getInstance");
+ getInstance.setAccessible(true);
+ return getInstance;
+ } catch (NoSuchMethodException e) {
+ throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
+ }
}
}
);
@@ -69,16 +75,10 @@
//noinspection unchecked
REFLECTION_NAVIGATOR = (Navigator<Type, Class, Field, Method>) getInstance.invoke(null);
} catch (ClassNotFoundException e) {
- e.printStackTrace();
throw new IllegalStateException("Can't find ReflectionNavigator class");
} catch (InvocationTargetException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance throws the exception");
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- throw new IllegalStateException("ReflectionNavigator.getInstance can't be found");
} catch (IllegalAccessException e) {
- e.printStackTrace();
throw new IllegalStateException("ReflectionNavigator.getInstance method is inaccessible");
} catch (SecurityException e) {
LOGGER.log(Level.FINE, "Unable to access ReflectionNavigator.getInstance", e);
--- a/jdk/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -288,3 +288,5 @@
8c6ad41974f9ab6c33d544b088648314963f2a50 jdk9-b43
8cc4dc300041eb70a7a40e4b2431a8f4d4965ea4 jdk9-b44
9acaa4f57b0b9e3757a7b4576ca9418a75ea8287 jdk9-b45
+efedac7f44ed41cea2b1038138047271f55aacba jdk9-b46
+b641c14730ac05d9ec8b4f66e6fca3dc21adb403 jdk9-b47
--- a/jdk/make/gendata/GendataPolicyJars.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/make/gendata/GendataPolicyJars.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -35,65 +35,62 @@
US_EXPORT_POLICY_JAR_DST := \
$(SUPPORT_OUTPUTDIR)/modules_libs/java.base/security/US_export_policy.jar
-ifneq ($(BUILD_CRYPTO), no)
-
- US_EXPORT_POLICY_JAR_LIMITED := \
- $(SUPPORT_OUTPUTDIR)/jce/policy/limited/US_export_policy.jar
- US_EXPORT_POLICY_JAR_UNLIMITED := \
- $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/US_export_policy.jar
+US_EXPORT_POLICY_JAR_LIMITED := \
+ $(SUPPORT_OUTPUTDIR)/jce/policy/limited/US_export_policy.jar
+US_EXPORT_POLICY_JAR_UNLIMITED := \
+ $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/US_export_policy.jar
- ifndef OPENJDK
- #
- # In past releases, Oracle JDK has had a separately downloadable set of
- # policy files which has been a nightmare for deployment.
- #
- # Now if we're closed and limited (default for Oracle JDK), create
- # an "unlimited_policy" directory that contains the unlimited policy
- # files. It will be up to the user/deployer to make an informed choice
- # as to whether they are legally entitled to use the unlimited policy
- # file in their environment. Users/deployers simply need to overwrite
- # the files. Consult README.txt (below) for more info.
- #
- UNLIMITED_POLICY_DIR := \
- $(SUPPORT_OUTPUTDIR)/modules_libs/java.base/security/unlimited_policy
- endif
+ifndef OPENJDK
+ #
+ # In past releases, Oracle JDK has had a separately downloadable set of
+ # policy files which has been a nightmare for deployment.
+ #
+ # Now if we're closed and limited (default for Oracle JDK), create
+ # an "unlimited_policy" directory that contains the unlimited policy
+ # files. It will be up to the user/deployer to make an informed choice
+ # as to whether they are legally entitled to use the unlimited policy
+ # file in their environment. Users/deployers simply need to overwrite
+ # the files. Consult README.txt (below) for more info.
+ #
+ UNLIMITED_POLICY_DIR := \
+ $(SUPPORT_OUTPUTDIR)/modules_libs/java.base/security/unlimited_policy
+endif
- #
- # TODO fix so that SetupArchive does not write files into SRCS
- # then we don't need this extra copying
- #
- # NOTE: We currently do not place restrictions on our limited export
- # policy. This was not a typo. This means we are shipping the same file
- # for both limited and unlimited US_export_policy.jar. Only the local
- # policy file currently has restrictions.
- #
- US_EXPORT_POLICY_JAR_SRC_DIR := \
- $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited
- US_EXPORT_POLICY_JAR_TMP := \
- $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/US_export_policy_jar.tmp
+#
+# TODO fix so that SetupArchive does not write files into SRCS
+# then we don't need this extra copying
+#
+# NOTE: We currently do not place restrictions on our limited export
+# policy. This was not a typo. This means we are shipping the same file
+# for both limited and unlimited US_export_policy.jar. Only the local
+# policy file currently has restrictions.
+#
+US_EXPORT_POLICY_JAR_SRC_DIR := \
+ $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited
+US_EXPORT_POLICY_JAR_TMP := \
+ $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/US_export_policy_jar.tmp
- $(US_EXPORT_POLICY_JAR_TMP)/%: $(US_EXPORT_POLICY_JAR_SRC_DIR)/%
+$(US_EXPORT_POLICY_JAR_TMP)/%: $(US_EXPORT_POLICY_JAR_SRC_DIR)/%
$(install-file)
- US_EXPORT_POLICY_JAR_DEPS := \
- $(US_EXPORT_POLICY_JAR_TMP)/default_US_export.policy
+US_EXPORT_POLICY_JAR_DEPS := \
+ $(US_EXPORT_POLICY_JAR_TMP)/default_US_export.policy
- $(eval $(call SetupArchive,BUILD_US_EXPORT_POLICY_JAR, \
- $(US_EXPORT_POLICY_JAR_DEPS), \
- SRCS := $(US_EXPORT_POLICY_JAR_TMP), \
- SUFFIXES := .policy, \
- JAR := $(US_EXPORT_POLICY_JAR_UNLIMITED), \
- EXTRA_MANIFEST_ATTR := Crypto-Strength: unlimited, \
- SKIP_METAINF := true))
+$(eval $(call SetupArchive,BUILD_US_EXPORT_POLICY_JAR, \
+ $(US_EXPORT_POLICY_JAR_DEPS), \
+ SRCS := $(US_EXPORT_POLICY_JAR_TMP), \
+ SUFFIXES := .policy, \
+ JAR := $(US_EXPORT_POLICY_JAR_UNLIMITED), \
+ EXTRA_MANIFEST_ATTR := Crypto-Strength: unlimited, \
+ SKIP_METAINF := true))
- $(US_EXPORT_POLICY_JAR_LIMITED): \
- $(US_EXPORT_POLICY_JAR_UNLIMITED)
- $(ECHO) $(LOG_INFO) \
- Copying unlimited $(patsubst $(OUTPUT_ROOT)/%,%,$@)
- $(install-file)
+$(US_EXPORT_POLICY_JAR_LIMITED): \
+ $(US_EXPORT_POLICY_JAR_UNLIMITED)
+ $(ECHO) $(LOG_INFO) \
+ Copying unlimited $(patsubst $(OUTPUT_ROOT)/%,%,$@)
+ $(install-file)
- TARGETS += $(US_EXPORT_POLICY_JAR_LIMITED) $(US_EXPORT_POLICY_JAR_UNLIMITED)
-endif
+TARGETS += $(US_EXPORT_POLICY_JAR_LIMITED) $(US_EXPORT_POLICY_JAR_UNLIMITED)
ifeq ($(UNLIMITED_CRYPTO), true)
$(US_EXPORT_POLICY_JAR_DST): $(US_EXPORT_POLICY_JAR_UNLIMITED)
@@ -119,57 +116,54 @@
LOCAL_POLICY_JAR_DST := \
$(SUPPORT_OUTPUTDIR)/modules_libs/java.base/security/local_policy.jar
-ifneq ($(BUILD_CRYPTO), no)
+LOCAL_POLICY_JAR_LIMITED := \
+ $(SUPPORT_OUTPUTDIR)/jce/policy/limited/local_policy.jar
+LOCAL_POLICY_JAR_UNLIMITED := \
+ $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/local_policy.jar
- LOCAL_POLICY_JAR_LIMITED := \
- $(SUPPORT_OUTPUTDIR)/jce/policy/limited/local_policy.jar
- LOCAL_POLICY_JAR_UNLIMITED := \
- $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/local_policy.jar
+#
+# TODO fix so that SetupArchive does not write files into SRCS
+# then we don't need this extra copying
+#
+LOCAL_POLICY_JAR_LIMITED_TMP := \
+ $(SUPPORT_OUTPUTDIR)/jce/policy/limited/local_policy_jar.tmp
+LOCAL_POLICY_JAR_UNLIMITED_TMP := \
+ $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/local_policy_jar.tmp
+
+$(LOCAL_POLICY_JAR_LIMITED_TMP)/%: \
+ $(JDK_TOPDIR)/make/data/cryptopolicy/limited/%
+ $(install-file)
+
+$(LOCAL_POLICY_JAR_UNLIMITED_TMP)/%: \
+ $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited/%
+ $(install-file)
- #
- # TODO fix so that SetupArchive does not write files into SRCS
- # then we don't need this extra copying
- #
- LOCAL_POLICY_JAR_LIMITED_TMP := \
- $(SUPPORT_OUTPUTDIR)/jce/policy/limited/local_policy_jar.tmp
- LOCAL_POLICY_JAR_UNLIMITED_TMP := \
- $(SUPPORT_OUTPUTDIR)/jce/policy/unlimited/local_policy_jar.tmp
+$(eval $(call SetupArchive,BUILD_LOCAL_POLICY_JAR_LIMITED, \
+ $(LOCAL_POLICY_JAR_LIMITED_TMP)/exempt_local.policy \
+ $(LOCAL_POLICY_JAR_LIMITED_TMP)/default_local.policy, \
+ SRCS := $(LOCAL_POLICY_JAR_LIMITED_TMP), \
+ SUFFIXES := .policy, \
+ JAR := $(LOCAL_POLICY_JAR_LIMITED), \
+ EXTRA_MANIFEST_ATTR := Crypto-Strength: limited, \
+ SKIP_METAINF := true))
- $(LOCAL_POLICY_JAR_LIMITED_TMP)/%: \
- $(JDK_TOPDIR)/make/data/cryptopolicy/limited/%
- $(install-file)
+$(eval $(call SetupArchive,BUILD_LOCAL_POLICY_JAR_UNLIMITED, \
+ $(LOCAL_POLICY_JAR_UNLIMITED_TMP)/default_local.policy, \
+ SRCS := $(LOCAL_POLICY_JAR_UNLIMITED_TMP), \
+ SUFFIXES := .policy, \
+ JAR := $(LOCAL_POLICY_JAR_UNLIMITED), \
+ EXTRA_MANIFEST_ATTR := Crypto-Strength: unlimited, \
+ SKIP_METAINF := true))
- $(LOCAL_POLICY_JAR_UNLIMITED_TMP)/%: \
- $(JDK_TOPDIR)/make/data/cryptopolicy/unlimited/%
+TARGETS += $(LOCAL_POLICY_JAR_LIMITED) $(LOCAL_POLICY_JAR_UNLIMITED)
+
+ifndef OPENJDK
+ ifneq ($(UNLIMITED_CRYPTO), true)
+ $(UNLIMITED_POLICY_DIR)/README.txt: \
+ $(JDK_TOPDIR)/make/closed/data/cryptopolicy/README.txt
$(install-file)
- $(eval $(call SetupArchive,BUILD_LOCAL_POLICY_JAR_LIMITED, \
- $(LOCAL_POLICY_JAR_LIMITED_TMP)/exempt_local.policy \
- $(LOCAL_POLICY_JAR_LIMITED_TMP)/default_local.policy, \
- SRCS := $(LOCAL_POLICY_JAR_LIMITED_TMP), \
- SUFFIXES := .policy, \
- JAR := $(LOCAL_POLICY_JAR_LIMITED), \
- EXTRA_MANIFEST_ATTR := Crypto-Strength: limited, \
- SKIP_METAINF := true))
-
- $(eval $(call SetupArchive,BUILD_LOCAL_POLICY_JAR_UNLIMITED, \
- $(LOCAL_POLICY_JAR_UNLIMITED_TMP)/default_local.policy, \
- SRCS := $(LOCAL_POLICY_JAR_UNLIMITED_TMP), \
- SUFFIXES := .policy, \
- JAR := $(LOCAL_POLICY_JAR_UNLIMITED), \
- EXTRA_MANIFEST_ATTR := Crypto-Strength: unlimited, \
- SKIP_METAINF := true))
-
- TARGETS += $(LOCAL_POLICY_JAR_LIMITED) $(LOCAL_POLICY_JAR_UNLIMITED)
-
- ifndef OPENJDK
- ifneq ($(UNLIMITED_CRYPTO), true)
- $(UNLIMITED_POLICY_DIR)/README.txt: \
- $(JDK_TOPDIR)/make/closed/data/cryptopolicy/README.txt
- $(install-file)
-
- TARGETS += $(UNLIMITED_POLICY_DIR)/README.txt
- endif
+ TARGETS += $(UNLIMITED_POLICY_DIR)/README.txt
endif
endif
--- a/jdk/make/lib/Awt2dLibraries.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/make/lib/Awt2dLibraries.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -300,7 +300,6 @@
LIBAWT_XAWT_DIRS := \
$(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/libawt_xawt \
- $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/libjawt \
$(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/debug \
$(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/utility \
$(JDK_TOPDIR)/src/java.desktop/share/native/common/font \
--- a/jdk/make/src/classes/build/tools/module/ext.modules Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/make/src/classes/build/tools/module/ext.modules Tue Jan 27 13:58:55 2015 -0500
@@ -6,4 +6,4 @@
jdk.naming.dns
jdk.scripting.nashorn
jdk.zipfs
-oracle.accessbridge
+jdk.accessbridge
--- a/jdk/src/java.base/macosx/classes/java/lang/ClassLoaderHelper.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/macosx/classes/java/lang/ClassLoaderHelper.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,11 @@
private ClassLoaderHelper() {}
/**
+ * Indicates, whether PATH env variable is allowed to contain quoted entries.
+ */
+ static final boolean allowsQuotedPathElements = false;
+
+ /**
* Returns an alternate path name for the given file
* such that if the original pathname did not exist, then the
* file may be located at the alternate location.
--- a/jdk/src/java.base/share/classes/java/io/BufferedWriter.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/io/BufferedWriter.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -73,12 +73,6 @@
private static int defaultCharBufferSize = 8192;
/**
- * Line separator string. This is the value of the line.separator
- * property at the moment that the stream was created.
- */
- private String lineSeparator;
-
- /**
* Creates a buffered character-output stream that uses a default-sized
* output buffer.
*
@@ -105,9 +99,6 @@
cb = new char[sz];
nChars = sz;
nextChar = 0;
-
- lineSeparator = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("line.separator"));
}
/** Checks to make sure that the stream has not been closed */
@@ -240,7 +231,7 @@
* @exception IOException If an I/O error occurs
*/
public void newLine() throws IOException {
- write(lineSeparator);
+ write(System.lineSeparator());
}
/**
--- a/jdk/src/java.base/share/classes/java/io/PrintWriter.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/io/PrintWriter.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,12 +69,6 @@
private PrintStream psOut = null;
/**
- * Line separator string. This is the value of the line.separator
- * property at the moment that the stream was created.
- */
- private final String lineSeparator;
-
- /**
* Returns a charset object for the given charset name.
* @throws NullPointerException is csn is null
* @throws UnsupportedEncodingException if the charset is not supported
@@ -113,8 +107,6 @@
super(out);
this.out = out;
this.autoFlush = autoFlush;
- lineSeparator = java.security.AccessController.doPrivileged(
- new sun.security.action.GetPropertyAction("line.separator"));
}
/**
@@ -477,7 +469,7 @@
try {
synchronized (lock) {
ensureOpen();
- out.write(lineSeparator);
+ out.write(System.lineSeparator());
if (autoFlush)
out.flush();
}
--- a/jdk/src/java.base/share/classes/java/lang/Class.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/Class.java Tue Jan 27 13:58:55 2015 -0500
@@ -149,7 +149,8 @@
* {@code getName}. If this {@code Class} object represents a
* primitive type, this method returns the name of the primitive type. If
* this {@code Class} object represents void this method returns
- * "void".
+ * "void". If this {@code Class} object represents an array type,
+ * this method returns "class " followed by {@code getName}.
*
* @return a string representation of this class object.
*/
@@ -174,6 +175,12 @@
* occur in canonical order. If there are no type parameters, the
* type parameter list is elided.
*
+ * For an array type, the string starts with the type name,
+ * followed by an angle-bracketed comma-separated list of the
+ * type's type parameters, if any, followed by a sequence of
+ * {@code []} characters, one set of brackets per dimension of
+ * the array.
+ *
* <p>Note that since information about the runtime representation
* of a type is being generated, modifiers not present on the
* originating source code or illegal on the originating source
@@ -189,29 +196,39 @@
return toString();
} else {
StringBuilder sb = new StringBuilder();
-
- // Class modifiers are a superset of interface modifiers
- int modifiers = getModifiers() & Modifier.classModifiers();
- if (modifiers != 0) {
- sb.append(Modifier.toString(modifiers));
+ Class<?> component = this;
+ int arrayDepth = 0;
+
+ if (isArray()) {
+ do {
+ arrayDepth++;
+ component = component.getComponentType();
+ } while (component.isArray());
+ sb.append(component.getName());
+ } else {
+ // Class modifiers are a superset of interface modifiers
+ int modifiers = getModifiers() & Modifier.classModifiers();
+ if (modifiers != 0) {
+ sb.append(Modifier.toString(modifiers));
+ sb.append(' ');
+ }
+
+ if (isAnnotation()) {
+ sb.append('@');
+ }
+ if (isInterface()) { // Note: all annotation types are interfaces
+ sb.append("interface");
+ } else {
+ if (isEnum())
+ sb.append("enum");
+ else
+ sb.append("class");
+ }
sb.append(' ');
- }
-
- if (isAnnotation()) {
- sb.append('@');
+ sb.append(getName());
}
- if (isInterface()) { // Note: all annotation types are interfaces
- sb.append("interface");
- } else {
- if (isEnum())
- sb.append("enum");
- else
- sb.append("class");
- }
- sb.append(' ');
- sb.append(getName());
-
- TypeVariable<?>[] typeparms = getTypeParameters();
+
+ TypeVariable<?>[] typeparms = component.getTypeParameters();
if (typeparms.length > 0) {
boolean first = true;
sb.append('<');
@@ -224,6 +241,9 @@
sb.append('>');
}
+ for (int i = 0; i < arrayDepth; i++)
+ sb.append("[]");
+
return sb.toString();
}
}
--- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2014 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1360,7 +1360,10 @@
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
- checkClassLoaderPermission(this, Reflection.getCallerClass());
+ // Check access to the parent class loader
+ // If the caller's class loader is same as this class loader,
+ // permission check is performed.
+ checkClassLoaderPermission(parent, Reflection.getCallerClass());
}
return parent;
}
@@ -1503,6 +1506,11 @@
return caller.getClassLoader0();
}
+ /*
+ * Checks RuntimePermission("getClassLoader") permission
+ * if caller's class loader is not null and caller's class loader
+ * is not the same as or an ancestor of the given cl argument.
+ */
static void checkClassLoaderPermission(ClassLoader cl, Class<?> caller) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
@@ -1747,35 +1755,54 @@
private static String usr_paths[];
private static String sys_paths[];
- private static String[] initializePath(String propname) {
- String ldpath = System.getProperty(propname, "");
- String ps = File.pathSeparator;
- int ldlen = ldpath.length();
- int i, j, n;
- // Count the separators in the path
- i = ldpath.indexOf(ps);
- n = 0;
- while (i >= 0) {
- n++;
- i = ldpath.indexOf(ps, i + 1);
+ private static String[] initializePath(String propName) {
+ String ldPath = System.getProperty(propName, "");
+ int ldLen = ldPath.length();
+ char ps = File.pathSeparatorChar;
+ int psCount = 0;
+
+ if (ClassLoaderHelper.allowsQuotedPathElements &&
+ ldPath.indexOf('\"') >= 0) {
+ // First, remove quotes put around quoted parts of paths.
+ // Second, use a quotation mark as a new path separator.
+ // This will preserve any quoted old path separators.
+ char[] buf = new char[ldLen];
+ int bufLen = 0;
+ for (int i = 0; i < ldLen; ++i) {
+ char ch = ldPath.charAt(i);
+ if (ch == '\"') {
+ while (++i < ldLen &&
+ (ch = ldPath.charAt(i)) != '\"') {
+ buf[bufLen++] = ch;
+ }
+ } else {
+ if (ch == ps) {
+ psCount++;
+ ch = '\"';
+ }
+ buf[bufLen++] = ch;
+ }
+ }
+ ldPath = new String(buf, 0, bufLen);
+ ldLen = bufLen;
+ ps = '\"';
+ } else {
+ for (int i = ldPath.indexOf(ps); i >= 0;
+ i = ldPath.indexOf(ps, i + 1)) {
+ psCount++;
+ }
}
- // allocate the array of paths - n :'s = n + 1 path elements
- String[] paths = new String[n + 1];
-
- // Fill the array with paths from the ldpath
- n = i = 0;
- j = ldpath.indexOf(ps);
- while (j >= 0) {
- if (j - i > 0) {
- paths[n++] = ldpath.substring(i, j);
- } else if (j - i == 0) {
- paths[n++] = ".";
- }
- i = j + 1;
- j = ldpath.indexOf(ps, i);
+ String[] paths = new String[psCount + 1];
+ int pathStart = 0;
+ for (int j = 0; j < psCount; ++j) {
+ int pathEnd = ldPath.indexOf(ps, pathStart);
+ paths[j] = (pathStart < pathEnd) ?
+ ldPath.substring(pathStart, pathEnd) : ".";
+ pathStart = pathEnd + 1;
}
- paths[n] = ldpath.substring(i, ldlen);
+ paths[psCount] = (pathStart < ldLen) ?
+ ldPath.substring(pathStart, ldLen) : ".";
return paths;
}
--- a/jdk/src/java.base/share/classes/java/lang/String.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/String.java Tue Jan 27 13:58:55 2015 -0500
@@ -135,7 +135,7 @@
* unnecessary since Strings are immutable.
*/
public String() {
- this.value = new char[0];
+ this.value = "".value;
}
/**
@@ -175,7 +175,7 @@
* not affect the newly created string.
*
* @param value
- * Array that is the source of characters
+ * Array that is the source of characters
*
* @param offset
* The initial offset
@@ -191,8 +191,14 @@
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
- if (count < 0) {
- throw new StringIndexOutOfBoundsException(count);
+ if (count <= 0) {
+ if (count < 0) {
+ throw new StringIndexOutOfBoundsException(count);
+ }
+ if (offset <= value.length) {
+ this.value = "".value;
+ return;
+ }
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
@@ -233,8 +239,14 @@
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
- if (count < 0) {
- throw new StringIndexOutOfBoundsException(count);
+ if (count <= 0) {
+ if (count < 0) {
+ throw new StringIndexOutOfBoundsException(count);
+ }
+ if (offset <= codePoints.length) {
+ this.value = "".value;
+ return;
+ }
}
// Note: offset or count might be near -1>>>1.
if (offset > codePoints.length - count) {
@@ -246,11 +258,11 @@
// Pass 1: Compute precise size of char[]
int n = count;
for (int i = offset; i < end; i++) {
- int c = codePoints[i];
- if (Character.isBmpCodePoint(c))
- continue;
- else if (Character.isValidCodePoint(c))
- n++;
+ int c = codePoints[i];
+ if (Character.isBmpCodePoint(c))
+ continue;
+ else if (Character.isValidCodePoint(c))
+ n++;
else throw new IllegalArgumentException(Integer.toString(c));
}
@@ -783,7 +795,7 @@
* subarray of {@code dst} starting at index {@code dstBegin}
* and ending at index:
* <blockquote><pre>
- * dstbegin + (srcEnd-srcBegin) - 1
+ * dstBegin + (srcEnd-srcBegin) - 1
* </pre></blockquote>
*
* @param srcBegin index of the first character in the string
@@ -828,7 +840,7 @@
* dst} starting at index {@code dstBegin} and ending at index:
*
* <blockquote><pre>
- * dstbegin + (srcEnd-srcBegin) - 1
+ * dstBegin + (srcEnd-srcBegin) - 1
* </pre></blockquote>
*
* @deprecated This method does not properly convert characters into
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Executable.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -588,22 +588,29 @@
return AnnotationParser.toArray(declaredAnnotations());
}
- private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
+ private transient volatile Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
- private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
- if (declaredAnnotations == null) {
- Executable root = getRoot();
- if (root != null) {
- declaredAnnotations = root.declaredAnnotations();
- } else {
- declaredAnnotations = AnnotationParser.parseAnnotations(
- getAnnotationBytes(),
- sun.misc.SharedSecrets.getJavaLangAccess().
- getConstantPool(getDeclaringClass()),
- getDeclaringClass());
+ private Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
+ Map<Class<? extends Annotation>, Annotation> declAnnos;
+ if ((declAnnos = declaredAnnotations) == null) {
+ synchronized (this) {
+ if ((declAnnos = declaredAnnotations) == null) {
+ Executable root = getRoot();
+ if (root != null) {
+ declAnnos = root.declaredAnnotations();
+ } else {
+ declAnnos = AnnotationParser.parseAnnotations(
+ getAnnotationBytes(),
+ sun.misc.SharedSecrets.getJavaLangAccess().
+ getConstantPool(getDeclaringClass()),
+ getDeclaringClass()
+ );
+ }
+ declaredAnnotations = declAnnos;
+ }
}
}
- return declaredAnnotations;
+ return declAnnos;
}
/**
--- a/jdk/src/java.base/share/classes/java/lang/reflect/Field.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/lang/reflect/Field.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1139,21 +1139,28 @@
return AnnotationParser.toArray(declaredAnnotations());
}
- private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
+ private transient volatile Map<Class<? extends Annotation>, Annotation> declaredAnnotations;
- private synchronized Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
- if (declaredAnnotations == null) {
- Field root = this.root;
- if (root != null) {
- declaredAnnotations = root.declaredAnnotations();
- } else {
- declaredAnnotations = AnnotationParser.parseAnnotations(
- annotations,
- sun.misc.SharedSecrets.getJavaLangAccess().getConstantPool(getDeclaringClass()),
- getDeclaringClass());
+ private Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {
+ Map<Class<? extends Annotation>, Annotation> declAnnos;
+ if ((declAnnos = declaredAnnotations) == null) {
+ synchronized (this) {
+ if ((declAnnos = declaredAnnotations) == null) {
+ Field root = this.root;
+ if (root != null) {
+ declAnnos = root.declaredAnnotations();
+ } else {
+ declAnnos = AnnotationParser.parseAnnotations(
+ annotations,
+ sun.misc.SharedSecrets.getJavaLangAccess()
+ .getConstantPool(getDeclaringClass()),
+ getDeclaringClass());
+ }
+ declaredAnnotations = declAnnos;
+ }
}
}
- return declaredAnnotations;
+ return declAnnos;
}
private native byte[] getTypeAnnotationBytes0();
--- a/jdk/src/java.base/share/classes/java/net/MulticastSocket.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/net/MulticastSocket.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -569,7 +569,7 @@
public NetworkInterface getNetworkInterface() throws SocketException {
NetworkInterface ni
= (NetworkInterface)getImpl().getOption(SocketOptions.IP_MULTICAST_IF2);
- if (ni.getIndex() == 0) {
+ if ((ni.getIndex() == 0) || (ni.getIndex() == -1)) {
InetAddress[] addrs = new InetAddress[1];
addrs[0] = InetAddress.anyLocalAddress();
return new NetworkInterface(addrs[0].getHostName(), 0, addrs);
--- a/jdk/src/java.base/share/classes/java/net/URI.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/net/URI.java Tue Jan 27 13:58:55 2015 -0500
@@ -2637,6 +2637,11 @@
private static final long H_URIC_NO_SLASH
= H_UNRESERVED | H_ESCAPED | highMask(";?:@&=+$,");
+ // scope_id = alpha | digit | "_" | "."
+ private static final long L_SCOPE_ID
+ = L_ALPHANUM | lowMask("_.");
+ private static final long H_SCOPE_ID
+ = H_ALPHANUM | highMask("_.");
// -- Escaping and encoding --
@@ -3226,7 +3231,7 @@
if (r+1 == q) {
fail ("scope id expected");
}
- checkChars (r+1, q, L_ALPHANUM, H_ALPHANUM,
+ checkChars (r+1, q, L_SCOPE_ID, H_SCOPE_ID,
"scope id");
} else {
parseIPv6Reference(p, q);
--- a/jdk/src/java.base/share/classes/java/nio/channels/Channels.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/nio/channels/Channels.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -579,12 +579,13 @@
* charset and writes the resulting bytes to the given channel.
*
* <p> An invocation of this method of the form
- * <p>
+ *
* <pre> {@code
* Channels.newWriter(ch, csname)
* } </pre>
+ *
* behaves in exactly the same way as the expression
- * <p>
+ *
* <pre> {@code
* Channels.newWriter(ch, Charset.forName(csName).newEncoder(), -1)
* } </pre>
--- a/jdk/src/java.base/share/classes/java/util/Formatter.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Formatter.java Tue Jan 27 13:58:55 2015 -0500
@@ -1835,7 +1835,7 @@
* <p> The maximum number of arguments is limited by the maximum dimension of a
* Java array as defined by
* <cite>The Java™ Virtual Machine Specification</cite>.
- * If the argument index is does not correspond to an
+ * If the argument index does not correspond to an
* available argument, then a {@link MissingFormatArgumentException} is thrown.
*
* <p> If there are more arguments than format specifiers, the extra arguments
--- a/jdk/src/java.base/share/classes/java/util/Hashtable.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Hashtable.java Tue Jan 27 13:58:55 2015 -0500
@@ -1137,10 +1137,10 @@
Entry<Object, Object> entryStack = null;
synchronized (this) {
- // Write out the length, threshold, loadfactor
+ // Write out the threshold and loadFactor
s.defaultWriteObject();
- // Write out length, count of elements
+ // Write out the length and count of elements
s.writeInt(table.length);
s.writeInt(count);
@@ -1169,22 +1169,33 @@
private void readObject(java.io.ObjectInputStream s)
throws IOException, ClassNotFoundException
{
- // Read in the length, threshold, and loadfactor
+ // Read in the threshold and loadFactor
s.defaultReadObject();
+ // Validate loadFactor (ignore threshold - it will be re-computed)
+ if (loadFactor <= 0 || Float.isNaN(loadFactor))
+ throw new StreamCorruptedException("Illegal Load: " + loadFactor);
+
// Read the original length of the array and number of elements
int origlength = s.readInt();
int elements = s.readInt();
- // Compute new size with a bit of room 5% to grow but
- // no larger than the original size. Make the length
+ // Validate # of elements
+ if (elements < 0)
+ throw new StreamCorruptedException("Illegal # of Elements: " + elements);
+
+ // Clamp original length to be more than elements / loadFactor
+ // (this is the invariant enforced with auto-growth)
+ origlength = Math.max(origlength, (int)(elements / loadFactor) + 1);
+
+ // Compute new length with a bit of room 5% + 3 to grow but
+ // no larger than the clamped original length. Make the length
// odd if it's large enough, this helps distribute the entries.
// Guard against the length ending up zero, that's not valid.
- int length = (int)(elements * loadFactor) + (elements / 20) + 3;
+ int length = (int)((elements + elements / 20) / loadFactor) + 3;
if (length > elements && (length & 1) == 0)
length--;
- if (origlength > 0 && length > origlength)
- length = origlength;
+ length = Math.min(length, origlength);
table = new Entry<?,?>[length];
threshold = (int)Math.min(length * loadFactor, MAX_ARRAY_SIZE + 1);
count = 0;
@@ -1195,7 +1206,7 @@
K key = (K)s.readObject();
@SuppressWarnings("unchecked")
V value = (V)s.readObject();
- // synch could be eliminated for performance
+ // sync is eliminated for performance
reconstitutionPut(table, key, value);
}
}
@@ -1207,9 +1218,9 @@
*
* <p>This differs from the regular put method in several ways. No
* checking for rehashing is necessary since the number of elements
- * initially in the table is known. The modCount is not incremented
- * because we are creating a new instance. Also, no return value
- * is needed.
+ * initially in the table is known. The modCount is not incremented and
+ * there's no synchronization because we are creating a new instance.
+ * Also, no return value is needed.
*/
private void reconstitutionPut(Entry<?,?>[] tab, K key, V value)
throws StreamCorruptedException
--- a/jdk/src/java.base/share/classes/java/util/Spliterator.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/Spliterator.java Tue Jan 27 13:58:55 2015 -0500
@@ -125,7 +125,7 @@
* are encountered.
*
* @apiNote
- * <p>Spliterators, like {@code Iterators}s, are for traversing the elements of
+ * <p>Spliterators, like {@code Iterator}s, are for traversing the elements of
* a source. The {@code Spliterator} API was designed to support efficient
* parallel traversal in addition to sequential traversal, by supporting
* decomposition as well as single-element iteration. In addition, the
--- a/jdk/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/concurrent/CompletableFuture.java Tue Jan 27 13:58:55 2015 -0500
@@ -978,7 +978,15 @@
}
try {
@SuppressWarnings("unchecked") T t = (T) r;
- return f.apply(t).toCompletableFuture();
+ CompletableFuture<V> g = f.apply(t).toCompletableFuture();
+ Object s = g.result;
+ if (s != null)
+ return new CompletableFuture<V>(encodeRelay(s));
+ CompletableFuture<V> d = new CompletableFuture<V>();
+ UniRelay<V> copy = new UniRelay<V>(d, g);
+ g.push(copy);
+ copy.tryFire(SYNC);
+ return d;
} catch (Throwable ex) {
return new CompletableFuture<V>(encodeThrowable(ex));
}
--- a/jdk/src/java.base/share/classes/java/util/stream/Collectors.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/java/util/stream/Collectors.java Tue Jan 27 13:58:55 2015 -0500
@@ -990,7 +990,7 @@
* function.
*
* <p>There are no guarantees on the type, mutability, or serializability
- * of the {@code Map} or {@code List} objects returned, or of the
+ * of the {@code ConcurrentMap} or {@code List} objects returned, or of the
* thread-safety of the {@code List} objects returned.
* @implSpec
* This produces a result similar to:
@@ -1028,6 +1028,9 @@
* produces a result of type {@code D}. The resulting collector produces a
* {@code Map<K, D>}.
*
+ * <p>There are no guarantees on the type, mutability, or serializability
+ * of the {@code ConcurrentMap} returned.
+ *
* <p>For example, to compute the set of last names of people in each city,
* where the city names are sorted:
* <pre>{@code
@@ -1143,7 +1146,8 @@
* {@code Map<Boolean, List<T>>}.
*
* There are no guarantees on the type, mutability,
- * serializability, or thread-safety of the {@code Map} returned.
+ * serializability, or thread-safety of the {@code Map} or {@code List}
+ * returned.
*
* @param <T> the type of the input elements
* @param predicate a predicate used for classifying input elements
@@ -1212,6 +1216,9 @@
* may have duplicates, use {@link #toMap(Function, Function, BinaryOperator)}
* instead.
*
+ * <p>There are no guarantees on the type, mutability, serializability,
+ * or thread-safety of the {@code Map} returned.
+ *
* @apiNote
* It is common for either the key or the value to be the input elements.
* In this case, the utility method
@@ -1271,6 +1278,9 @@
* the value mapping function is applied to each equal element, and the
* results are merged using the provided merging function.
*
+ * <p>There are no guarantees on the type, mutability, serializability,
+ * or thread-safety of the {@code Map} returned.
+ *
* @apiNote
* There are multiple ways to deal with collisions between multiple elements
* mapping to the same key. The other forms of {@code toMap} simply use
@@ -1382,6 +1392,9 @@
* may have duplicates, use
* {@link #toConcurrentMap(Function, Function, BinaryOperator)} instead.
*
+ * <p>There are no guarantees on the type, mutability, or serializability
+ * of the {@code ConcurrentMap} returned.
+ *
* @apiNote
* It is common for either the key or the value to be the input elements.
* In this case, the utility method
@@ -1436,6 +1449,9 @@
* the value mapping function is applied to each equal element, and the
* results are merged using the provided merging function.
*
+ * <p>There are no guarantees on the type, mutability, or serializability
+ * of the {@code ConcurrentMap} returned.
+ *
* @apiNote
* There are multiple ways to deal with collisions between multiple elements
* mapping to the same key. The other forms of {@code toConcurrentMap} simply use
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java Tue Jan 27 13:58:55 2015 -0500
@@ -337,6 +337,7 @@
/* try auth without calling Authenticator. Used for transparent NTLM authentication */
private boolean tryTransparentNTLMServer = true;
private boolean tryTransparentNTLMProxy = true;
+ private boolean useProxyResponseCode = false;
/* Used by Windows specific code */
private Object authObj;
@@ -2239,6 +2240,15 @@
if (tryTransparentNTLMProxy) {
tryTransparentNTLMProxy =
NTLMAuthenticationProxy.supportsTransparentAuth;
+ /* If the platform supports transparent authentication
+ * then normally it's ok to do transparent auth to a proxy
+ * because we generally trust proxies (chosen by the user)
+ * But not in the case of 305 response where the server
+ * chose it. */
+ if (tryTransparentNTLMProxy && useProxyResponseCode) {
+ tryTransparentNTLMProxy = false;
+ }
+
}
a = null;
if (tryTransparentNTLMProxy) {
@@ -2610,6 +2620,10 @@
requests.set(0, method + " " + getRequestURI()+" " +
httpVersion, null);
connected = true;
+ // need to remember this in case NTLM proxy authentication gets
+ // used. We can't use transparent authentication when user
+ // doesn't know about proxy.
+ useProxyResponseCode = true;
} else {
// maintain previous headers, just change the name
// of the file we're getting
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/https/HttpsClient.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/https/HttpsClient.java Tue Jan 27 13:58:55 2015 -0500
@@ -192,22 +192,6 @@
return userAgent;
}
- // should remove once HttpClient.newHttpProxy is putback
- private static Proxy newHttpProxy(String proxyHost, int proxyPort) {
- InetSocketAddress saddr = null;
- final String phost = proxyHost;
- final int pport = proxyPort < 0 ? httpsPortNumber : proxyPort;
- try {
- saddr = java.security.AccessController.doPrivileged(new
- java.security.PrivilegedExceptionAction<InetSocketAddress>() {
- public InetSocketAddress run() {
- return new InetSocketAddress(phost, pport);
- }});
- } catch (java.security.PrivilegedActionException pae) {
- }
- return new Proxy(Proxy.Type.HTTP, saddr);
- }
-
// CONSTRUCTOR, FACTORY
@@ -251,7 +235,7 @@
throws IOException {
this(sf, url,
(proxyHost == null? null:
- HttpsClient.newHttpProxy(proxyHost, proxyPort)),
+ HttpClient.newHttpProxy(proxyHost, proxyPort, "https")),
connectTimeout);
}
@@ -261,6 +245,11 @@
HttpsClient(SSLSocketFactory sf, URL url, Proxy proxy,
int connectTimeout)
throws IOException {
+ PlatformLogger logger = HttpURLConnection.getHttpLogger();
+ if (logger.isLoggable(PlatformLogger.Level.FINEST)) {
+ logger.finest("Creating new HttpsClient with url:" + url + " and proxy:" + proxy +
+ " with connect timeout:" + connectTimeout);
+ }
this.proxy = proxy;
setSSLSocketFactory(sf);
this.proxyDisabled = true;
@@ -317,7 +306,7 @@
return HttpsClient.New(sf, url, hv,
(proxyHost == null? null :
- HttpsClient.newHttpProxy(proxyHost, proxyPort)),
+ HttpClient.newHttpProxy(proxyHost, proxyPort, "https")),
useCache, connectTimeout, httpuc);
}
@@ -329,6 +318,11 @@
if (p == null) {
p = Proxy.NO_PROXY;
}
+ PlatformLogger logger = HttpURLConnection.getHttpLogger();
+ if (logger.isLoggable(PlatformLogger.Level.FINEST)) {
+ logger.finest("Looking for HttpClient for URL " + url +
+ " and proxy value of " + p);
+ }
HttpsClient ret = null;
if (useCache) {
/* see if one's already around */
@@ -342,14 +336,13 @@
if (ret != null) {
if ((ret.proxy != null && ret.proxy.equals(p)) ||
- (ret.proxy == null && p == null)) {
+ (ret.proxy == null && p == Proxy.NO_PROXY)) {
synchronized (ret) {
ret.cachedHttpClient = true;
assert ret.inCache;
ret.inCache = false;
if (httpuc != null && ret.needsTunneling())
httpuc.setTunnelState(TUNNELING);
- PlatformLogger logger = HttpURLConnection.getHttpLogger();
if (logger.isLoggable(PlatformLogger.Level.FINEST)) {
logger.finest("KeepAlive stream retrieved from the cache, " + ret);
}
@@ -360,6 +353,9 @@
// This should be fine as it is very rare that a connection
// to the same host will not use the same proxy.
synchronized(ret) {
+ if (logger.isLoggable(PlatformLogger.Level.FINEST)) {
+ logger.finest("Not returning this connection to cache: " + ret);
+ }
ret.inCache = false;
ret.closeServer();
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/FileInputStreamPool.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package sun.security.provider;
+
+import java.io.*;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * A pool of {@code InputStream}s opened from distinct files. Only a single
+ * instance is ever opened from the same file. This is used to read special
+ * infinite files like {@code /dev/random} where the current file pointer is not
+ * relevant, so multiple readers can share the same file descriptor and
+ * consequently the same {@code InputStream}.
+ */
+class FileInputStreamPool {
+
+ /**
+ * a pool of: StreamRef -> UnclosableInputStream -> FileInputStream(s)
+ */
+ private static final ConcurrentMap<File, StreamRef> pool =
+ new ConcurrentHashMap<>();
+
+ /**
+ * a reference queue of cleared StreamRef(s)
+ */
+ private static final ReferenceQueue<UnclosableInputStream> refQueue =
+ new ReferenceQueue<>();
+
+ /**
+ * This method opens an underlying {@link java.io.FileInputStream} for a
+ * given {@code file} and returns a wrapper over it. The wrapper is shared
+ * among multiple readers of the same {@code file} and ignores
+ * {@link java.io.InputStream#close()} requests. The underlying stream is
+ * closed when all references to the wrapper are relinquished.
+ *
+ * @param file the file to be opened for reading.
+ * @return a shared {@link java.io.InputStream} instance opened from given
+ * file.
+ * @throws FileNotFoundException if the file does not exist, is a directory
+ * rather than a regular file, or for some
+ * other reason cannot be opened for reading.
+ * @throws SecurityException if a security manager exists and its
+ * <code>checkRead</code> method denies read
+ * access to the file.
+ */
+ static InputStream getInputStream(File file) throws IOException {
+
+ // expunge any cleared references
+ StreamRef oldRref;
+ while ((oldRref = (StreamRef) refQueue.poll()) != null) {
+ pool.remove(oldRref.file, oldRref);
+ }
+
+ // canonicalize the path
+ // (this also checks the read permission on the file if SecurityManager
+ // is present, so no checking is needed later when we just return the
+ // already opened stream)
+ File cfile = file.getCanonicalFile();
+
+ // check if it exists in pool
+ oldRref = pool.get(cfile);
+ UnclosableInputStream oldStream = (oldRref == null)
+ ? null
+ : oldRref.get();
+ StreamRef newRef = null;
+ UnclosableInputStream newStream = null;
+
+ // retry loop
+ while (true) {
+ if (oldStream != null) {
+ // close our optimistically opened stream 1st (if we opened it)
+ if (newStream != null) {
+ try {
+ newStream.getWrappedStream().close();
+ } catch (IOException ignore) {
+ // can't do anything here
+ }
+ }
+ // return it
+ return oldStream;
+ } else {
+ // we need to open new stream optimistically (if not already)
+ if (newStream == null) {
+ newStream = new UnclosableInputStream(
+ new FileInputStream(cfile));
+ newRef = new StreamRef(cfile, newStream, refQueue);
+ }
+ // either try to install newRef or replace oldRef with newRef
+ if (oldRref == null) {
+ oldRref = pool.putIfAbsent(cfile, newRef);
+ } else {
+ oldRref = pool.replace(cfile, oldRref, newRef)
+ ? null
+ : pool.get(cfile);
+ }
+ if (oldRref == null) {
+ // success
+ return newStream;
+ } else {
+ // lost race
+ oldStream = oldRref.get();
+ // another loop
+ }
+ }
+ }
+ }
+
+ private static class StreamRef extends WeakReference<UnclosableInputStream> {
+ final File file;
+
+ StreamRef(File file,
+ UnclosableInputStream stream,
+ ReferenceQueue<UnclosableInputStream> refQueue) {
+ super(stream, refQueue);
+ this.file = file;
+ }
+ }
+
+ private static final class UnclosableInputStream extends FilterInputStream {
+ UnclosableInputStream(InputStream in) {
+ super(in);
+ }
+
+ @Override
+ public void close() throws IOException {
+ // Ignore close attempts since underlying InputStream is shared.
+ }
+
+ InputStream getWrappedStream() {
+ return in;
+ }
+ }
+}
--- a/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/provider/SeedGenerator.java Tue Jan 27 13:58:55 2015 -0500
@@ -504,9 +504,10 @@
@Override
public InputStream run() throws IOException {
/*
- * return a FileInputStream for file URLs and
- * avoid buffering. The openStream() call wraps
- * InputStream in a BufferedInputStream which
+ * return a shared InputStream for file URLs and
+ * avoid buffering.
+ * The URL.openStream() call wraps InputStream in a
+ * BufferedInputStream which
* can buffer up to 8K bytes. This read is a
* performance issue for entropy sources which
* can be slow to replenish.
@@ -514,7 +515,8 @@
if (device.getProtocol().equalsIgnoreCase("file")) {
File deviceFile =
SunEntries.getDeviceFile(device);
- return new FileInputStream(deviceFile);
+ return FileInputStreamPool
+ .getInputStream(deviceFile);
} else {
return device.openStream();
}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ClientHandshaker.java Tue Jan 27 13:58:55 2015 -0500
@@ -345,6 +345,13 @@
break;
case HandshakeMessage.ht_finished:
+ // A ChangeCipherSpec record must have been received prior to
+ // reception of the Finished message (RFC 5246, 7.4.9).
+ if (!receivedChangeCipherSpec()) {
+ fatalSE(Alerts.alert_handshake_failure,
+ "Received Finished message before ChangeCipherSpec");
+ }
+
this.serverFinished(
new Finished(protocolVersion, input, cipherSuite));
break;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -243,6 +243,7 @@
protocolVersion = ProtocolVersion.valueOf(s.getInt8(), s.getInt8());
clnt_random = new RandomCookie(s);
sessionId = new SessionId(s.getBytes8());
+ sessionId.checkLength(protocolVersion);
cipherSuites = new CipherSuiteList(s);
compression_methods = s.getBytes8();
if (messageLength() != messageLength) {
@@ -355,6 +356,7 @@
input.getInt8());
svr_random = new RandomCookie(input);
sessionId = new SessionId(input.getBytes8());
+ sessionId.checkLength(protocolVersion);
cipherSuite = CipherSuite.valueOf(input.getInt8(), input.getInt8());
compression_method = (byte)input.getInt8();
if (messageLength() != messageLength) {
--- a/jdk/src/java.base/share/classes/sun/security/ssl/Handshaker.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/Handshaker.java Tue Jan 27 13:58:55 2015 -0500
@@ -95,8 +95,6 @@
Collection<SignatureAndHashAlgorithm> peerSupportedSignAlgs;
/*
-
- /*
* List of active protocols
*
* Active protocols is a subset of enabled protocols, and will
@@ -114,10 +112,8 @@
private CipherSuiteList activeCipherSuites;
// The server name indication and matchers
- List<SNIServerName> serverNames =
- Collections.<SNIServerName>emptyList();
- Collection<SNIMatcher> sniMatchers =
- Collections.<SNIMatcher>emptyList();
+ List<SNIServerName> serverNames = Collections.<SNIServerName>emptyList();
+ Collection<SNIMatcher> sniMatchers = Collections.<SNIMatcher>emptyList();
private boolean isClient;
private boolean needCertVerify;
@@ -139,12 +135,16 @@
// current key exchange. Never null, initially K_NULL
KeyExchange keyExchange;
- /* True if this session is being resumed (fast handshake) */
+ // True if this session is being resumed (fast handshake)
boolean resumingSession;
- /* True if it's OK to start a new SSL session */
+ // True if it's OK to start a new SSL session
boolean enableNewSession;
+ // True if session keys have been calculated and the caller may receive
+ // and process a ChangeCipherSpec message
+ private boolean sessKeysCalculated;
+
// Whether local cipher suites preference should be honored during
// handshaking?
//
@@ -253,6 +253,7 @@
this.serverVerifyData = serverVerifyData;
enableNewSession = true;
invalidated = false;
+ sessKeysCalculated = false;
setCipherSuite(CipherSuite.C_NULL);
setEnabledProtocols(enabledProtocols);
@@ -359,6 +360,14 @@
}
}
+ final boolean receivedChangeCipherSpec() {
+ if (conn != null) {
+ return conn.receivedChangeCipherSpec();
+ } else {
+ return engine.receivedChangeCipherSpec();
+ }
+ }
+
String getEndpointIdentificationAlgorithmSE() {
SSLParameters paras;
if (conn != null) {
@@ -491,7 +500,9 @@
if (activeProtocols.collection().isEmpty() ||
activeProtocols.max.v == ProtocolVersion.NONE.v) {
- throw new SSLHandshakeException("No appropriate protocol");
+ throw new SSLHandshakeException(
+ "No appropriate protocol (protocol is disabled or " +
+ "cipher suites are inappropriate)");
}
if (activeCipherSuites == null) {
@@ -676,6 +687,17 @@
continue;
}
+ if (!algorithmConstraints.permits(
+ EnumSet.of(CryptoPrimitive.KEY_AGREEMENT),
+ protocol.name, null)) {
+ if (debug != null && Debug.isOn("verbose")) {
+ System.out.println(
+ "Ignoring disabled protocol: " + protocol);
+ }
+
+ continue;
+ }
+
boolean found = false;
for (CipherSuite suite : enabledCipherSuites.collection()) {
if (suite.isAvailable() && suite.obsoleted > protocol.v &&
@@ -1081,7 +1103,6 @@
calculateConnectionKeys(master);
}
-
/*
* Calculate the master secret from its various components. This is
* used for key exchange by all cipher suites.
@@ -1226,6 +1247,10 @@
throw new ProviderException(e);
}
+ // Mark a flag that allows outside entities (like SSLSocket/SSLEngine)
+ // determine if a ChangeCipherSpec message could be processed.
+ sessKeysCalculated = true;
+
//
// Dump the connection keys as they're generated.
//
@@ -1280,6 +1305,15 @@
}
}
+ /**
+ * Return whether or not the Handshaker has derived session keys for
+ * this handshake. This is used for determining readiness to process
+ * an incoming ChangeCipherSpec message.
+ */
+ boolean sessionKeysCalculated() {
+ return sessKeysCalculated;
+ }
+
private static void printHex(HexDumpEncoder dump, byte[] bytes) {
if (bytes == null) {
System.out.println("(key bytes not available)");
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ProtocolVersion.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ProtocolVersion.java Tue Jan 27 13:58:55 2015 -0500
@@ -25,6 +25,9 @@
package sun.security.ssl;
+import java.util.*;
+import java.security.CryptoPrimitive;
+
/**
* Type safe enum for an SSL/TLS protocol version. Instances are obtained
* using the static factory methods or by referencing the static members
@@ -86,6 +89,11 @@
// Default version for hello messages (SSLv2Hello)
final static ProtocolVersion DEFAULT_HELLO = FIPS ? TLS10 : SSL30;
+ // Available protocols
+ //
+ // Including all supported protocols except the disabled ones.
+ final static Set<ProtocolVersion> availableProtocols;
+
// version in 16 bit MSB format as it appears in records and
// messages, i.e. 0x0301 for TLS 1.0
public final int v;
@@ -96,6 +104,25 @@
// name used in JSSE (e.g. TLSv1 for TLS 1.0)
final String name;
+ // Initialize the available protocols.
+ static {
+ Set<ProtocolVersion> protocols = new HashSet<>(5);
+
+ ProtocolVersion[] pvs = new ProtocolVersion[] {
+ SSL20Hello, SSL30, TLS10, TLS11, TLS12};
+ EnumSet<CryptoPrimitive> cryptoPrimitives =
+ EnumSet.<CryptoPrimitive>of(CryptoPrimitive.KEY_AGREEMENT);
+ for (ProtocolVersion p : pvs) {
+ if (SSLAlgorithmConstraints.DEFAULT_SSL_ONLY.permits(
+ cryptoPrimitives, p.name, null)) {
+ protocols.add(p);
+ }
+ }
+
+ availableProtocols =
+ Collections.<ProtocolVersion>unmodifiableSet(protocols);
+ }
+
// private
private ProtocolVersion(int v, String name) {
this.v = v;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLAlgorithmConstraints.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -55,6 +55,14 @@
private boolean enabledX509DisabledAlgConstraints = true;
+ // the default algorithm constraints
+ final static AlgorithmConstraints DEFAULT =
+ new SSLAlgorithmConstraints(null);
+
+ // the default SSL only algorithm constraints
+ final static AlgorithmConstraints DEFAULT_SSL_ONLY =
+ new SSLAlgorithmConstraints((SSLSocket)null, false);
+
SSLAlgorithmConstraints(AlgorithmConstraints algorithmConstraints) {
userAlgConstraints = algorithmConstraints;
}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -52,10 +52,6 @@
private X509TrustManager trustManager;
private SecureRandom secureRandom;
- // The default algrithm constraints
- private AlgorithmConstraints defaultAlgorithmConstraints =
- new SSLAlgorithmConstraints(null);
-
// supported and default protocols
private ProtocolList defaultServerProtocolList;
private ProtocolList defaultClientProtocolList;
@@ -350,7 +346,7 @@
if (suite.isAvailable() &&
suite.obsoleted > protocols.min.v &&
suite.supported <= protocols.max.v) {
- if (defaultAlgorithmConstraints.permits(
+ if (SSLAlgorithmConstraints.DEFAULT.permits(
EnumSet.of(CryptoPrimitive.KEY_AGREEMENT),
suite.name, null)) {
suites.add(suite);
@@ -431,11 +427,16 @@
*/
private abstract static class AbstractSSLContext extends SSLContextImpl {
// parameters
- private final static SSLParameters defaultServerSSLParams;
- private final static SSLParameters supportedSSLParams;
+ private static final SSLParameters defaultServerSSLParams;
+ private static final SSLParameters supportedSSLParams;
static {
+ // supported SSL parameters
supportedSSLParams = new SSLParameters();
+
+ // candidates for available protocols
+ ProtocolVersion[] candidates;
+
if (SunJSSE.isFIPS()) {
supportedSSLParams.setProtocols(new String[] {
ProtocolVersion.TLS10.name,
@@ -443,7 +444,11 @@
ProtocolVersion.TLS12.name
});
- defaultServerSSLParams = supportedSSLParams;
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11,
+ ProtocolVersion.TLS12
+ };
} else {
supportedSSLParams.setProtocols(new String[] {
ProtocolVersion.SSL20Hello.name,
@@ -453,8 +458,18 @@
ProtocolVersion.TLS12.name
});
- defaultServerSSLParams = supportedSSLParams;
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.SSL20Hello,
+ ProtocolVersion.SSL30,
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11,
+ ProtocolVersion.TLS12
+ };
}
+
+ defaultServerSSLParams = new SSLParameters();
+ defaultServerSSLParams.setProtocols(
+ getAvailableProtocols(candidates));
}
@Override
@@ -466,6 +481,22 @@
SSLParameters getSupportedSSLParams() {
return supportedSSLParams;
}
+
+ static String[] getAvailableProtocols(
+ ProtocolVersion[] protocolCandidates) {
+
+ List<String> availableProtocols = Collections.<String>emptyList();
+ if (protocolCandidates != null && protocolCandidates.length != 0) {
+ availableProtocols = new ArrayList<>(protocolCandidates.length);
+ for (ProtocolVersion p : protocolCandidates) {
+ if (ProtocolVersion.availableProtocols.contains(p)) {
+ availableProtocols.add(p.name);
+ }
+ }
+ }
+
+ return availableProtocols.toArray(new String[0]);
+ }
}
/*
@@ -474,21 +505,25 @@
* @see SSLContext
*/
public static final class TLS10Context extends AbstractSSLContext {
- private final static SSLParameters defaultClientSSLParams;
+ private static final SSLParameters defaultClientSSLParams;
static {
- defaultClientSSLParams = new SSLParameters();
+ // candidates for available protocols
+ ProtocolVersion[] candidates;
if (SunJSSE.isFIPS()) {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.TLS10.name
- });
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.TLS10
+ };
+ } else {
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.SSL30,
+ ProtocolVersion.TLS10
+ };
+ }
- } else {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.SSL30.name,
- ProtocolVersion.TLS10.name
- });
- }
+ defaultClientSSLParams = new SSLParameters();
+ defaultClientSSLParams.setProtocols(
+ getAvailableProtocols(candidates));
}
@Override
@@ -503,23 +538,27 @@
* @see SSLContext
*/
public static final class TLS11Context extends AbstractSSLContext {
- private final static SSLParameters defaultClientSSLParams;
+ private static final SSLParameters defaultClientSSLParams;
static {
- defaultClientSSLParams = new SSLParameters();
+ // candidates for available protocols
+ ProtocolVersion[] candidates;
if (SunJSSE.isFIPS()) {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.TLS10.name,
- ProtocolVersion.TLS11.name
- });
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11
+ };
+ } else {
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.SSL30,
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11
+ };
+ }
- } else {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.SSL30.name,
- ProtocolVersion.TLS10.name,
- ProtocolVersion.TLS11.name
- });
- }
+ defaultClientSSLParams = new SSLParameters();
+ defaultClientSSLParams.setProtocols(
+ getAvailableProtocols(candidates));
}
@Override
@@ -534,25 +573,29 @@
* @see SSLContext
*/
public static final class TLS12Context extends AbstractSSLContext {
- private final static SSLParameters defaultClientSSLParams;
+ private static final SSLParameters defaultClientSSLParams;
static {
- defaultClientSSLParams = new SSLParameters();
+ // candidates for available protocols
+ ProtocolVersion[] candidates;
if (SunJSSE.isFIPS()) {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.TLS10.name,
- ProtocolVersion.TLS11.name,
- ProtocolVersion.TLS12.name
- });
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11,
+ ProtocolVersion.TLS12
+ };
+ } else {
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.SSL30,
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11,
+ ProtocolVersion.TLS12
+ };
+ }
- } else {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.SSL30.name,
- ProtocolVersion.TLS10.name,
- ProtocolVersion.TLS11.name,
- ProtocolVersion.TLS12.name
- });
- }
+ defaultClientSSLParams = new SSLParameters();
+ defaultClientSSLParams.setProtocols(
+ getAvailableProtocols(candidates));
}
@Override
@@ -567,8 +610,8 @@
* @see SSLContext
*/
private static class CustomizedSSLContext extends AbstractSSLContext {
- private final static String PROPERTY_NAME = "jdk.tls.client.protocols";
- private final static SSLParameters defaultClientSSLParams;
+ private static final String PROPERTY_NAME = "jdk.tls.client.protocols";
+ private static final SSLParameters defaultClientSSLParams;
private static IllegalArgumentException reservedException = null;
// Don't want a java.lang.LinkageError for illegal system property.
@@ -578,60 +621,74 @@
// the provider service. Instead, let's handle the initialization
// exception in constructor.
static {
+ // candidates for available protocols
+ ProtocolVersion[] candidates;
+
String property = AccessController.doPrivileged(
new GetPropertyAction(PROPERTY_NAME));
- defaultClientSSLParams = new SSLParameters();
if (property == null || property.length() == 0) {
// the default enabled client TLS protocols
if (SunJSSE.isFIPS()) {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.TLS10.name,
- ProtocolVersion.TLS11.name,
- ProtocolVersion.TLS12.name
- });
-
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11,
+ ProtocolVersion.TLS12
+ };
} else {
- defaultClientSSLParams.setProtocols(new String[] {
- ProtocolVersion.SSL30.name,
- ProtocolVersion.TLS10.name,
- ProtocolVersion.TLS11.name,
- ProtocolVersion.TLS12.name
- });
+ candidates = new ProtocolVersion[] {
+ ProtocolVersion.SSL30,
+ ProtocolVersion.TLS10,
+ ProtocolVersion.TLS11,
+ ProtocolVersion.TLS12
+ };
}
} else {
// remove double quote marks from beginning/end of the property
- if (property.charAt(0) == '"' &&
+ if (property.length() > 1 && property.charAt(0) == '"' &&
property.charAt(property.length() - 1) == '"') {
property = property.substring(1, property.length() - 1);
}
- String[] protocols = property.split(",");
+ String[] protocols = null;
+ if (property != null && property.length() != 0) {
+ protocols = property.split(",");
+ } else {
+ reservedException = new IllegalArgumentException(
+ "No protocol specified in " +
+ PROPERTY_NAME + " system property");
+ protocols = new String[0];
+ }
+
+ candidates = new ProtocolVersion[protocols.length];
for (int i = 0; i < protocols.length; i++) {
protocols[i] = protocols[i].trim();
// Is it a supported protocol name?
try {
- ProtocolVersion.valueOf(protocols[i]);
+ candidates[i] = ProtocolVersion.valueOf(protocols[i]);
} catch (IllegalArgumentException iae) {
reservedException = new IllegalArgumentException(
- PROPERTY_NAME + ": " + protocols[i] +
- " is not a standard SSL protocol name", iae);
+ PROPERTY_NAME + ": " + protocols[i] +
+ " is not a standard SSL/TLS protocol name", iae);
+ break;
}
}
if ((reservedException == null) && SunJSSE.isFIPS()) {
- for (String protocol : protocols) {
- if (ProtocolVersion.SSL20Hello.name.equals(protocol) ||
- ProtocolVersion.SSL30.name.equals(protocol)) {
+ for (ProtocolVersion protocolVersion : candidates) {
+ if (ProtocolVersion.SSL20Hello.v == protocolVersion.v ||
+ ProtocolVersion.SSL30.v == protocolVersion.v) {
reservedException = new IllegalArgumentException(
- PROPERTY_NAME + ": " + protocol +
+ PROPERTY_NAME + ": " + protocolVersion +
" is not FIPS compliant");
}
}
}
+ }
- if (reservedException == null) {
- defaultClientSSLParams.setProtocols(protocols);
- }
+ defaultClientSSLParams = new SSLParameters();
+ if (reservedException == null) {
+ defaultClientSSLParams.setProtocols(
+ getAvailableProtocols(candidates));
}
}
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLEngineImpl.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLEngineImpl.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -212,6 +212,11 @@
static final byte clauth_required = 2;
/*
+ * Flag indicating that the engine has received a ChangeCipherSpec message.
+ */
+ private boolean receivedCCS;
+
+ /*
* Flag indicating if the next record we receive MUST be a Finished
* message. Temporarily set during the handshake to ensure that
* a change cipher spec message is followed by a finished message.
@@ -372,6 +377,7 @@
*/
roleIsServer = true;
connectionState = cs_START;
+ receivedCCS = false;
// default server name indication
serverNames =
@@ -1021,6 +1027,7 @@
if (handshaker.invalidated) {
handshaker = null;
+ receivedCCS = false;
// if state is cs_RENEGOTIATE, revert it to cs_DATA
if (connectionState == cs_RENEGOTIATE) {
connectionState = cs_DATA;
@@ -1039,6 +1046,7 @@
}
handshaker = null;
connectionState = cs_DATA;
+ receivedCCS = false;
// No handshakeListeners here. That's a
// SSLSocket thing.
@@ -1078,13 +1086,25 @@
case Record.ct_change_cipher_spec:
if ((connectionState != cs_HANDSHAKE
&& connectionState != cs_RENEGOTIATE)
- || inputRecord.available() != 1
- || inputRecord.read() != 1) {
+ || !handshaker.sessionKeysCalculated()
+ || receivedCCS) {
+ // For the CCS message arriving in the wrong state
fatal(Alerts.alert_unexpected_message,
- "illegal change cipher spec msg, state = "
- + connectionState);
+ "illegal change cipher spec msg, conn state = "
+ + connectionState + ", handshake state = "
+ + handshaker.state);
+ } else if (inputRecord.available() != 1
+ || inputRecord.read() != 1) {
+ // For structural/content issues with the CCS
+ fatal(Alerts.alert_unexpected_message,
+ "Malformed change cipher spec msg");
}
+ // Once we've received CCS, update the flag.
+ // If the remote endpoint sends it again in this handshake
+ // we won't process it.
+ receivedCCS = true;
+
//
// The first message after a change_cipher_spec
// record MUST be a "Finished" handshake record,
@@ -2121,6 +2141,14 @@
}
/**
+ * Returns a boolean indicating whether the ChangeCipherSpec message
+ * has been received for this handshake.
+ */
+ boolean receivedChangeCipherSpec() {
+ return receivedCCS;
+ }
+
+ /**
* Returns a printable representation of this end of the connection.
*/
@Override
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SSLSocketImpl.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -172,6 +172,12 @@
private volatile int connectionState;
/*
+ * Flag indicating that the engine's handshaker has done the necessary
+ * steps so the engine may process a ChangeCipherSpec message.
+ */
+ private boolean receivedCCS;
+
+ /*
* Flag indicating if the next record we receive MUST be a Finished
* message. Temporarily set during the handshake to ensure that
* a change cipher spec message is followed by a finished message.
@@ -587,6 +593,7 @@
*/
roleIsServer = isServer;
connectionState = cs_START;
+ receivedCCS = false;
/*
* default read and write side cipher and MAC support
@@ -1045,6 +1052,7 @@
if (handshaker.invalidated) {
handshaker = null;
+ receivedCCS = false;
// if state is cs_RENEGOTIATE, revert it to cs_DATA
if (connectionState == cs_RENEGOTIATE) {
connectionState = cs_DATA;
@@ -1060,6 +1068,7 @@
handshakeSession = null;
handshaker = null;
connectionState = cs_DATA;
+ receivedCCS = false;
//
// Tell folk about handshake completion, but do
@@ -1107,13 +1116,24 @@
case Record.ct_change_cipher_spec:
if ((connectionState != cs_HANDSHAKE
&& connectionState != cs_RENEGOTIATE)
- || r.available() != 1
- || r.read() != 1) {
+ || !handshaker.sessionKeysCalculated()
+ || receivedCCS) {
+ // For the CCS message arriving in the wrong state
fatal(Alerts.alert_unexpected_message,
- "illegal change cipher spec msg, state = "
- + connectionState);
+ "illegal change cipher spec msg, conn state = "
+ + connectionState + ", handshake state = "
+ + handshaker.state);
+ } else if (r.available() != 1 || r.read() != 1) {
+ // For structural/content issues with the CCS
+ fatal(Alerts.alert_unexpected_message,
+ "Malformed change cipher spec msg");
}
+ // Once we've received CCS, update the flag.
+ // If the remote endpoint sends it again in this handshake
+ // we won't process it.
+ receivedCCS = true;
+
//
// The first message after a change_cipher_spec
// record MUST be a "Finished" handshake record,
@@ -2590,6 +2610,14 @@
}
/**
+ * Returns a boolean indicating whether the ChangeCipherSpec message
+ * has been received for this handshake.
+ */
+ boolean receivedChangeCipherSpec() {
+ return receivedCCS;
+ }
+
+ /**
* Returns a printable representation of this end of the connection.
*/
@Override
--- a/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/ServerHandshaker.java Tue Jan 27 13:58:55 2015 -0500
@@ -287,6 +287,13 @@
break;
case HandshakeMessage.ht_finished:
+ // A ChangeCipherSpec record must have been received prior to
+ // reception of the Finished message (RFC 5246, 7.4.9).
+ if (!receivedChangeCipherSpec()) {
+ fatalSE(Alerts.alert_handshake_failure,
+ "Received Finished message before ChangeCipherSpec");
+ }
+
this.clientFinished(
new Finished(protocolVersion, input, cipherSuite));
break;
--- a/jdk/src/java.base/share/classes/sun/security/ssl/SessionId.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/ssl/SessionId.java Tue Jan 27 13:58:55 2015 -0500
@@ -27,6 +27,7 @@
package sun.security.ssl;
import java.security.SecureRandom;
+import javax.net.ssl.SSLProtocolException;
/**
* Encapsulates an SSL session ID. SSL Session IDs are not reused by
@@ -41,6 +42,7 @@
final
class SessionId
{
+ static int MAX_LENGTH = 32;
private byte sessionId []; // max 32 bytes
/** Constructs a new session ID ... perhaps for a rejoinable session */
@@ -114,4 +116,19 @@
}
return true;
}
+
+ /**
+ * Checks the length of the session ID to make sure it sits within
+ * the range called out in the specification
+ */
+ void checkLength(ProtocolVersion pv) throws SSLProtocolException {
+ // As of today all versions of TLS have a 32-byte maximum length.
+ // In the future we can do more here to support protocol versions
+ // that may have longer max lengths.
+ if (sessionId.length > MAX_LENGTH) {
+ throw new SSLProtocolException("Invalid session ID length (" +
+ sessionId.length + " bytes)");
+ }
+ }
+
}
--- a/jdk/src/java.base/share/classes/sun/security/util/DerIndefLenConverter.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/util/DerIndefLenConverter.java Tue Jan 27 13:58:55 2015 -0500
@@ -156,12 +156,18 @@
}
if (isLongForm(lenByte)) {
lenByte &= LEN_MASK;
- if (lenByte > 4)
+ if (lenByte > 4) {
throw new IOException("Too much data");
- if ((dataSize - dataPos) < (lenByte + 1))
+ }
+ if ((dataSize - dataPos) < (lenByte + 1)) {
throw new IOException("Too little data");
- for (int i = 0; i < lenByte; i++)
+ }
+ for (int i = 0; i < lenByte; i++) {
curLen = (curLen << 8) + (data[dataPos++] & 0xff);
+ }
+ if (curLen < 0) {
+ throw new IOException("Invalid length bytes");
+ }
} else {
curLen = (lenByte & LEN_MASK);
}
@@ -188,10 +194,15 @@
}
if (isLongForm(lenByte)) {
lenByte &= LEN_MASK;
- for (int i = 0; i < lenByte; i++)
+ for (int i = 0; i < lenByte; i++) {
curLen = (curLen << 8) + (data[dataPos++] & 0xff);
- } else
+ }
+ if (curLen < 0) {
+ throw new IOException("Invalid length bytes");
+ }
+ } else {
curLen = (lenByte & LEN_MASK);
+ }
writeLength(curLen);
writeValue(curLen);
}
--- a/jdk/src/java.base/share/classes/sun/security/util/DerInputStream.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/util/DerInputStream.java Tue Jan 27 13:58:55 2015 -0500
@@ -577,6 +577,10 @@
value <<= 8;
value += 0x0ff & in.read();
}
+ if (value < 0) {
+ throw new IOException("DerInputStream.getLength(): "
+ + "Invalid length bytes");
+ }
}
return value;
}
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyConstraintsExtension.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,9 +27,7 @@
import java.io.IOException;
import java.io.OutputStream;
-import java.security.cert.CertificateException;
import java.util.Enumeration;
-import java.util.Vector;
import sun.security.util.*;
@@ -111,7 +109,7 @@
*/
public PolicyConstraintsExtension(int require, int inhibit)
throws IOException {
- this(Boolean.FALSE, require, inhibit);
+ this(Boolean.TRUE, require, inhibit);
}
/**
@@ -202,7 +200,7 @@
DerOutputStream tmp = new DerOutputStream();
if (extensionValue == null) {
extensionId = PKIXExtensions.PolicyConstraints_Id;
- critical = false;
+ critical = true;
encodeThis();
}
super.encode(tmp);
--- a/jdk/src/java.base/share/classes/sun/security/x509/PolicyMappingsExtension.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/classes/sun/security/x509/PolicyMappingsExtension.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -92,7 +92,7 @@
throws IOException {
this.maps = map;
this.extensionId = PKIXExtensions.PolicyMappings_Id;
- this.critical = false;
+ this.critical = true;
encodeThis();
}
@@ -100,8 +100,8 @@
* Create a default PolicyMappingsExtension.
*/
public PolicyMappingsExtension() {
- extensionId = PKIXExtensions.KeyUsage_Id;
- critical = false;
+ extensionId = PKIXExtensions.PolicyMappings_Id;
+ critical = true;
maps = new ArrayList<CertificatePolicyMap>();
}
@@ -153,7 +153,7 @@
DerOutputStream tmp = new DerOutputStream();
if (extensionValue == null) {
extensionId = PKIXExtensions.PolicyMappings_Id;
- critical = false;
+ critical = true;
encodeThis();
}
super.encode(tmp);
--- a/jdk/src/java.base/share/conf/security/java.security Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/share/conf/security/java.security Tue Jan 27 13:58:55 2015 -0500
@@ -512,8 +512,12 @@
#
# In some environments, certain algorithms or key lengths may be undesirable
# when using SSL/TLS. This section describes the mechanism for disabling
-# algorithms during SSL/TLS security parameters negotiation, including cipher
-# suites selection, peer authentication and key exchange mechanisms.
+# algorithms during SSL/TLS security parameters negotiation, including
+# protocol version negotiation, cipher suites selection, peer authentication
+# and key exchange mechanisms.
+#
+# Disabled algorithms will not be negotiated for SSL/TLS connections, even
+# if they are enabled explicitly in an application.
#
# For PKI-based peer authentication and key exchange mechanisms, this list
# of disabled algorithms will also be checked during certification path
@@ -528,4 +532,5 @@
# It is not guaranteed to be examined and used by other implementations.
#
# Example:
-# jdk.tls.disabledAlgorithms=MD5, SHA1, DSA, RSA keySize < 2048
+# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
+jdk.tls.disabledAlgorithms=SSLv3
--- a/jdk/src/java.base/unix/classes/java/io/FileDescriptor.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/unix/classes/java/io/FileDescriptor.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -214,7 +214,7 @@
if (!closed) {
closed = true;
IOException ioe = null;
- try (Closeable c = releaser) {
+ try (releaser) {
if (otherParents != null) {
for (Closeable referent : otherParents) {
try {
--- a/jdk/src/java.base/unix/classes/java/lang/ClassLoaderHelper.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/unix/classes/java/lang/ClassLoaderHelper.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,11 @@
private ClassLoaderHelper() {}
/**
+ * Indicates, whether PATH env variable is allowed to contain quoted entries.
+ */
+ static final boolean allowsQuotedPathElements = false;
+
+ /**
* Returns an alternate path name for the given file
* such that if the original pathname did not exist, then the
* file may be located at the alternate location.
--- a/jdk/src/java.base/unix/classes/sun/security/provider/NativePRNG.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/unix/classes/sun/security/provider/NativePRNG.java Tue Jan 27 13:58:55 2015 -0500
@@ -371,8 +371,8 @@
// constructor, called only once from initIO()
private RandomIO(File seedFile, File nextFile) throws IOException {
this.seedFile = seedFile;
- seedIn = new FileInputStream(seedFile);
- nextIn = new FileInputStream(nextFile);
+ seedIn = FileInputStreamPool.getInputStream(seedFile);
+ nextIn = FileInputStreamPool.getInputStream(nextFile);
nextBuffer = new byte[BUFFER_SIZE];
}
--- a/jdk/src/java.base/unix/native/libnet/NetworkInterface.c Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/unix/native/libnet/NetworkInterface.c Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -274,7 +274,6 @@
if (index <= 0) {
return NULL;
}
-
ifs = enumInterfaces(env);
if (ifs == NULL) {
return NULL;
@@ -551,9 +550,14 @@
jboolean isCopy;
int ret = -1;
int sock;
- const char* name_utf;
+ const char* name_utf = NULL;
- name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
+ if (name != NULL) {
+ name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
+ } else {
+ JNU_ThrowNullPointerException(env, "network interface name is NULL");
+ return ret;
+ }
if (name_utf == NULL) {
if (!(*env)->ExceptionCheck(env))
JNU_ThrowOutOfMemoryError(env, NULL);
@@ -581,7 +585,13 @@
const char* name_utf;
int flags = 0;
- name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
+ if (name != NULL) {
+ name_utf = (*env)->GetStringUTFChars(env, name, &isCopy);
+ } else {
+ JNU_ThrowNullPointerException(env, "network interface name is NULL");
+ return -1;
+ }
+
if (name_utf == NULL) {
if (!(*env)->ExceptionCheck(env))
JNU_ThrowOutOfMemoryError(env, NULL);
@@ -1063,6 +1073,7 @@
*/
#ifdef AF_INET6
+// unused arg ifname and struct if2
static int openSocketWithFallback(JNIEnv *env, const char *ifname){
int sock;
struct ifreq if2;
@@ -1453,9 +1464,14 @@
static int getMTU(JNIEnv *env, int sock, const char *ifname) {
struct ifreq if2;
+ memset((char *) &if2, 0, sizeof(if2));
- memset((char *) &if2, 0, sizeof(if2));
- strcpy(if2.ifr_name, ifname);
+ if (ifname != NULL) {
+ strcpy(if2.ifr_name, ifname);
+ } else {
+ JNU_ThrowNullPointerException(env, "network interface name is NULL");
+ return -1;
+ }
if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) {
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFMTU failed");
--- a/jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -62,7 +62,6 @@
#include "jvm.h"
#include "jni_util.h"
#include "net_util.h"
-
#include "java_net_SocketOptions.h"
#include "java_net_PlainDatagramSocketImpl.h"
#include "java_net_NetworkInterface.h"
@@ -83,6 +82,7 @@
extern void setDefaultScopeID(JNIEnv *env, struct sockaddr *him);
extern int getDefaultScopeID(JNIEnv *env);
+
/*
* Returns a java.lang.Integer based on 'i'
*/
@@ -1447,10 +1447,12 @@
static jmethodID ni_ctrID;
static jfieldID ni_indexID;
static jfieldID ni_addrsID;
+ static jfieldID ni_nameID;
jobjectArray addrArray;
jobject addr;
jobject ni;
+ jobject ni_name;
struct in_addr in;
struct in_addr *inP = ∈
@@ -1500,6 +1502,8 @@
ni_addrsID = (*env)->GetFieldID(env, c, "addrs",
"[Ljava/net/InetAddress;");
CHECK_NULL_RETURN(ni_addrsID, NULL);
+ ni_nameID = (*env)->GetFieldID(env, c,"name", "Ljava/lang/String;");
+ CHECK_NULL_RETURN(ni_nameID, NULL);
ni_class = (*env)->NewGlobalRef(env, c);
CHECK_NULL_RETURN(ni_class, NULL);
}
@@ -1521,6 +1525,10 @@
CHECK_NULL_RETURN(addrArray, NULL);
(*env)->SetObjectArrayElement(env, addrArray, 0, addr);
(*env)->SetObjectField(env, ni, ni_addrsID, addrArray);
+ ni_name = (*env)->NewStringUTF(env, "");
+ if (ni_name != NULL) {
+ (*env)->SetObjectField(env, ni, ni_nameID, ni_name);
+ }
return ni;
}
@@ -1537,14 +1545,16 @@
static jfieldID ni_indexID;
static jfieldID ni_addrsID;
static jclass ia_class;
+ static jfieldID ni_nameID;
static jmethodID ia_anyLocalAddressID;
- int index;
+ int index = 0;
socklen_t len = sizeof(index);
jobjectArray addrArray;
jobject addr;
jobject ni;
+ jobject ni_name;
if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
@@ -1573,6 +1583,8 @@
"anyLocalAddress",
"()Ljava/net/InetAddress;");
CHECK_NULL_RETURN(ia_anyLocalAddressID, NULL);
+ ni_nameID = (*env)->GetFieldID(env, c,"name", "Ljava/lang/String;");
+ CHECK_NULL_RETURN(ni_nameID, NULL);
ni_class = (*env)->NewGlobalRef(env, c);
CHECK_NULL_RETURN(ni_class, NULL);
}
@@ -1633,6 +1645,10 @@
CHECK_NULL_RETURN(addrArray, NULL);
(*env)->SetObjectArrayElement(env, addrArray, 0, addr);
(*env)->SetObjectField(env, ni, ni_addrsID, addrArray);
+ ni_name = (*env)->NewStringUTF(env, "");
+ if (ni_name != NULL) {
+ (*env)->SetObjectField(env, ni, ni_nameID, ni_name);
+ }
return ni;
}
#endif
--- a/jdk/src/java.base/windows/classes/java/io/FileDescriptor.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/windows/classes/java/io/FileDescriptor.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -212,7 +212,7 @@
if (!closed) {
closed = true;
IOException ioe = null;
- try (Closeable c = releaser) {
+ try (releaser) {
if (otherParents != null) {
for (Closeable referent : otherParents) {
try {
--- a/jdk/src/java.base/windows/classes/java/lang/ClassLoaderHelper.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/windows/classes/java/lang/ClassLoaderHelper.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,11 @@
private ClassLoaderHelper() {}
/**
+ * Indicates, whether PATH env variable is allowed to contain quoted entries.
+ */
+ static final boolean allowsQuotedPathElements = true;
+
+ /**
* Returns an alternate path name for the given file
* such that if the original pathname did not exist, then the
* file may be located at the alternate location.
--- a/jdk/src/java.base/windows/native/libjava/ProcessImpl_md.c Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.base/windows/native/libjava/ProcessImpl_md.c Tue Jan 27 13:58:55 2015 -0500
@@ -283,14 +283,10 @@
FALSE, FALSE, FALSE,
FALSE, FALSE, FALSE};
- {
- /* Extraction of current process standard IOE handles */
- DWORD idsIOE[3] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE};
- int i;
- for (i = 0; i < 3; ++i)
- /* Should not be closed by CloseHandle! */
- stdIOE[i] = GetStdHandle(idsIOE[i]);
- }
+ /* These three should not be closed by CloseHandle! */
+ stdIOE[0] = GetStdHandle(STD_INPUT_HANDLE);
+ stdIOE[1] = GetStdHandle(STD_OUTPUT_HANDLE);
+ stdIOE[2] = GetStdHandle(STD_ERROR_HANDLE);
prepareIOEHandleState(stdIOE, inherit);
{
@@ -319,11 +315,16 @@
if (success) {
PROCESS_INFORMATION pi;
- DWORD processFlag = CREATE_UNICODE_ENVIRONMENT;
+ DWORD processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
- /* Suppress popping-up of a console window for non-console applications */
- if (GetConsoleWindow() == NULL)
- processFlag |= CREATE_NO_WINDOW;
+ /* If the standard I/O is inherited, CREATE_NO_WINDOW must not be used. */
+ if (GetConsoleWindow() != NULL &&
+ (si.hStdInput == stdIOE[0] ||
+ si.hStdOutput == stdIOE[1] ||
+ si.hStdError == (redirectErrorStream ? stdIOE[1] : stdIOE[2])))
+ {
+ processFlag &= ~CREATE_NO_WINDOW;
+ }
si.dwFlags = STARTF_USESTDHANDLES;
if (!CreateProcessW(
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsButtonUI.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsButtonUI.java Tue Jan 27 13:58:55 2015 -0500
@@ -248,7 +248,8 @@
Part part = getXPButtonType(b);
- if (b.isContentAreaFilled() && xp != null) {
+ if (b.isContentAreaFilled() && b.getBorder() != null
+ && b.isBorderPainted() && xp != null) {
Skin skin = xp.getSkin(b, part);
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java Tue Jan 27 13:58:55 2015 -0500
@@ -1081,16 +1081,9 @@
directories.clear();
- File[] baseFolders;
- if (useShellFolder) {
- baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
- public File[] run() {
- return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
- }
- });
- } else {
- baseFolders = fsv.getRoots();
- }
+ File[] baseFolders = (useShellFolder)
+ ? (File[]) ShellFolder.get("fileChooserComboBoxFolders")
+ : fsv.getRoots();
directories.addAll(Arrays.asList(baseFolders));
// Get the canonical (full) path. This has the side
--- a/jdk/src/java.desktop/share/classes/java/beans/package.html Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/java/beans/package.html Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
<!--
- Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
@@ -147,8 +147,8 @@
For overview, architecture, and tutorial documentation, please see:
<ul>
- <li><a href="http://java.sun.com/docs/books/tutorial/javabeans/">JavaBeans</a>, a trail in <em>The Java Tutorial</em>.
- <li><a href="http://java.sun.com/products/jfc/tsc/articles/persistence2/">Long-Term Persistence</a>, an article in <em>The Swing Connection</em>.
+ <li><a href="http://docs.oracle.com/javase/tutorial/javabeans/">JavaBeans</a>, a trail in <em>The Java Tutorial</em>.
+ <li><a href="http://www.oracle.com/technetwork/java/persistence2-141443.html">Long-Term Persistence</a>, an article in <em>The Swing Connection</em>.
</ul>
</body>
--- a/jdk/src/java.desktop/share/classes/javax/swing/ToolTipManager.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/ToolTipManager.java Tue Jan 27 13:58:55 2015 -0500
@@ -28,6 +28,7 @@
import java.awt.event.*;
import java.awt.*;
+import java.util.Objects;
/**
* Manages all the <code>ToolTips</code> in the system.
@@ -476,8 +477,8 @@
preferredLocation.equals(newPreferredLocation) :
(newPreferredLocation == null);
- if (!sameComponent || !toolTipText.equals(newToolTipText) ||
- !sameLoc) {
+ if (!sameComponent || !Objects.equals(toolTipText, newToolTipText)
+ || !sameLoc) {
toolTipText = newToolTipText;
preferredLocation = newPreferredLocation;
showTipWindow();
--- a/jdk/src/java.desktop/share/classes/javax/swing/UIDefaults.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/UIDefaults.java Tue Jan 27 13:58:55 2015 -0500
@@ -44,9 +44,7 @@
import java.awt.Color;
import java.awt.Insets;
import java.awt.Dimension;
-import java.lang.reflect.Method;
import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeEvent;
import java.security.AccessController;
import java.security.AccessControlContext;
import java.security.PrivilegedAction;
@@ -76,7 +74,7 @@
@SuppressWarnings("serial") // Same-version serialization only
public class UIDefaults extends Hashtable<Object,Object>
{
- private static final Object PENDING = "Pending";
+ private static final Object PENDING = new Object();
private SwingPropertyChangeSupport changeSupport;
@@ -170,7 +168,7 @@
* Looks up the given key in our Hashtable and resolves LazyValues
* or ActiveValues.
*/
- private Object getFromHashtable(Object key) {
+ private Object getFromHashtable(final Object key) {
/* Quickly handle the common case, without grabbing
* a lock.
*/
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFileChooserUI.java Tue Jan 27 13:58:55 2015 -0500
@@ -1020,16 +1020,9 @@
directories.clear();
- File[] baseFolders;
- if (useShellFolder) {
- baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
- public File[] run() {
- return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
- }
- });
- } else {
- baseFolders = fsv.getRoots();
- }
+ File[] baseFolders = (useShellFolder)
+ ? (File[]) ShellFolder.get("fileChooserComboBoxFolders")
+ : fsv.getRoots();
directories.addAll(Arrays.asList(baseFolders));
// Get the canonical (full) path. This has the side
--- a/jdk/src/java.desktop/share/classes/sun/swing/FilePane.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/swing/FilePane.java Tue Jan 27 13:58:55 2015 -0500
@@ -1993,20 +1993,24 @@
return false;
}
- if (f instanceof ShellFolder) {
- return f.canWrite();
- } else {
- if (usesShellFolder(getFileChooser())) {
- try {
- return ShellFolder.getShellFolder(f).canWrite();
- } catch (FileNotFoundException ex) {
- // File doesn't exist
- return false;
+ try {
+ if (f instanceof ShellFolder) {
+ return f.canWrite();
+ } else {
+ if (usesShellFolder(getFileChooser())) {
+ try {
+ return ShellFolder.getShellFolder(f).canWrite();
+ } catch (FileNotFoundException ex) {
+ // File doesn't exist
+ return false;
+ }
+ } else {
+ // Ordinary file
+ return f.canWrite();
}
- } else {
- // Ordinary file
- return f.canWrite();
}
+ } catch (SecurityException e) {
+ return false;
}
}
--- a/jdk/src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java Tue Jan 27 13:58:55 2015 -0500
@@ -82,11 +82,7 @@
setBackground(bgColor);
FileSystemView fsv = fc.getFileSystemView();
- files = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
- public File[] run() {
- return (File[]) ShellFolder.get("fileChooserShortcutPanelFolders");
- }
- });
+ files = (File[]) ShellFolder.get("fileChooserShortcutPanelFolders");
buttons = new JToggleButton[files.length];
buttonGroup = new ButtonGroup();
--- a/jdk/src/java.desktop/share/classes/sun/swing/plaf/synth/DefaultSynthStyle.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/swing/plaf/synth/DefaultSynthStyle.java Tue Jan 27 13:58:55 2015 -0500
@@ -28,7 +28,6 @@
import java.awt.*;
import java.util.*;
import javax.swing.*;
-import javax.swing.border.Border;
import javax.swing.plaf.*;
/**
@@ -44,7 +43,8 @@
* @author Scott Violet
*/
public class DefaultSynthStyle extends SynthStyle implements Cloneable {
- private static final String PENDING = "Pending";
+
+ private static final Object PENDING = new Object();
/**
* Should the component be opaque?
--- a/jdk/src/java.desktop/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Tue Jan 27 13:58:55 2015 -0500
@@ -771,16 +771,9 @@
fireIntervalRemoved(this, 0, oldSize);
}
- File[] baseFolders;
- if (useShellFolder) {
- baseFolders = AccessController.doPrivileged(new PrivilegedAction<File[]>() {
- public File[] run() {
- return (File[]) ShellFolder.get("fileChooserComboBoxFolders");
- }
- });
- } else {
- baseFolders = fsv.getRoots();
- }
+ File[] baseFolders = (useShellFolder)
+ ? (File[]) ShellFolder.get("fileChooserComboBoxFolders")
+ : fsv.getRoots();
directories.addAll(Arrays.asList(baseFolders));
// Get the canonical (full) path. This has the side
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/ContextualSubstSubtables.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -583,6 +583,8 @@
LEReferenceTo<ChainSubClassRuleTable>
chainSubClassRuleTable(chainSubClassSetTable, success, chainSubClassRuleTableOffset);
le_uint16 backtrackGlyphCount = SWAPW(chainSubClassRuleTable->backtrackGlyphCount);
+ LEReferenceToArrayOf<le_uint16> backtrackClassArray(base, success, chainSubClassRuleTable->backtrackClassArray, backtrackGlyphCount);
+ if( LE_FAILURE(success) ) { return 0; }
le_uint16 inputGlyphCount = SWAPW(chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount]) - 1;
LEReferenceToArrayOf<le_uint16> inputClassArray(base, success, &chainSubClassRuleTable->backtrackClassArray[backtrackGlyphCount + 1],inputGlyphCount+2); // +2 for the lookaheadGlyphCount count
le_uint16 lookaheadGlyphCount = SWAPW(inputClassArray.getObject(inputGlyphCount, success));
@@ -599,8 +601,6 @@
}
tempIterator.prev();
- LEReferenceToArrayOf<le_uint16> backtrackClassArray(base, success, chainSubClassRuleTable->backtrackClassArray, backtrackGlyphCount);
- if( LE_FAILURE(success) ) { return 0; }
if (! matchGlyphClasses(backtrackClassArray, backtrackGlyphCount,
&tempIterator, backtrackClassDefinitionTable, success, TRUE)) {
continue;
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/CursiveAttachmentSubtables.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/CursiveAttachmentSubtables.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -45,6 +45,9 @@
le_int32 coverageIndex = getGlyphCoverage(base, glyphID, success);
le_uint16 eeCount = SWAPW(entryExitCount);
+ LEReferenceToArrayOf<EntryExitRecord>
+ entryExitRecordsArrayRef(base, success, entryExitRecords, coverageIndex);
+
if (coverageIndex < 0 || coverageIndex >= eeCount || LE_FAILURE(success)) {
glyphIterator->setCursiveGlyph();
return 0;
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/Features.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/Features.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -40,6 +40,9 @@
LEReferenceTo<FeatureTable> FeatureListTable::getFeatureTable(const LETableReference &base, le_uint16 featureIndex, LETag *featureTag, LEErrorCode &success) const
{
+ LEReferenceToArrayOf<FeatureRecord>
+ featureRecordArrayRef(base, success, featureRecordArray, featureIndex);
+
if (featureIndex >= SWAPW(featureCount) || LE_FAILURE(success)) {
return LEReferenceTo<FeatureTable>();
}
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/LETableReference.h Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/LETableReference.h Tue Jan 27 13:58:55 2015 -0500
@@ -470,7 +470,12 @@
#endif
const T& getObject(le_uint32 i, LEErrorCode &success) const {
- return *getAlias(i,success);
+ const T *ret = getAlias(i, success);
+ if (LE_FAILURE(success) || ret==NULL) {
+ return *(new T(0));
+ } else {
+ return *ret;
+ }
}
/**
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstSubtables.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/LigatureSubstSubtables.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -64,6 +64,9 @@
LEReferenceTo<LigatureTable> ligTable(ligSetTable, success, ligTableOffset);
if(LE_FAILURE(success)) { return 0; }
le_uint16 compCount = SWAPW(ligTable->compCount) - 1;
+ LEReferenceToArrayOf<TTGlyphID>
+ componentArrayRef(base, success, ligTable->componentArray, compCount);
+ if (LE_FAILURE(success)) { return 0; }
le_int32 startPosition = glyphIterator->getCurrStreamPosition();
TTGlyphID ligGlyph = SWAPW(ligTable->ligGlyph);
le_uint16 comp;
--- a/jdk/src/java.desktop/share/native/libfontmanager/layout/MultipleSubstSubtables.cpp Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/share/native/libfontmanager/layout/MultipleSubstSubtables.cpp Tue Jan 27 13:58:55 2015 -0500
@@ -61,6 +61,8 @@
le_int32 coverageIndex = getGlyphCoverage(base, glyph, success);
le_uint16 seqCount = SWAPW(sequenceCount);
+ LEReferenceToArrayOf<Offset>
+ sequenceTableOffsetArrayRef(base, success, sequenceTableOffsetArray, seqCount);
if (LE_FAILURE(success)) {
return 0;
--- a/jdk/src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Tue Jan 27 13:58:55 2015 -0500
@@ -36,6 +36,7 @@
import java.util.*;
import java.util.List;
import java.util.concurrent.*;
+import java.util.stream.Stream;
import static sun.awt.shell.Win32ShellFolder2.*;
import sun.awt.OSInfo;
@@ -251,7 +252,7 @@
if (file == null) {
file = getDesktop();
}
- return file;
+ return checkFile(file);
} else if (key.equals("roots")) {
// Should be "History" and "Desktop" ?
if (roots == null) {
@@ -262,11 +263,11 @@
roots = (File[])super.get(key);
}
}
- return roots;
+ return checkFiles(roots);
} else if (key.equals("fileChooserComboBoxFolders")) {
Win32ShellFolder2 desktop = getDesktop();
- if (desktop != null) {
+ if (desktop != null && checkFile(desktop) != null) {
ArrayList<File> folders = new ArrayList<File>();
Win32ShellFolder2 drives = getDrives();
@@ -277,7 +278,7 @@
folders.add(desktop);
// Add all second level folders
- File[] secondLevelFolders = desktop.listFiles();
+ File[] secondLevelFolders = checkFiles(desktop.listFiles());
Arrays.sort(secondLevelFolders);
for (File secondLevelFolder : secondLevelFolders) {
Win32ShellFolder2 folder = (Win32ShellFolder2) secondLevelFolder;
@@ -285,7 +286,7 @@
folders.add(folder);
// Add third level for "My Computer"
if (folder.equals(drives)) {
- File[] thirdLevelFolders = folder.listFiles();
+ File[] thirdLevelFolders = checkFiles(folder.listFiles());
if (thirdLevelFolders != null && thirdLevelFolders.length > 0) {
List<File> thirdLevelFoldersList = Arrays.asList(thirdLevelFolders);
@@ -295,7 +296,7 @@
}
}
}
- return folders.toArray(new File[folders.size()]);
+ return checkFiles(folders);
} else {
return super.get(key);
}
@@ -332,7 +333,7 @@
}
}
}
- return folders.toArray(new File[folders.size()]);
+ return checkFiles(folders);
} else if (key.startsWith("fileChooserIcon ")) {
String name = key.substring(key.indexOf(" ") + 1);
@@ -378,6 +379,41 @@
return null;
}
+ private File checkFile(File file) {
+ SecurityManager sm = System.getSecurityManager();
+ return (sm == null || file == null) ? file : checkFile(file, sm);
+ }
+
+ private File checkFile(File file, SecurityManager sm) {
+ try {
+ sm.checkRead(file.getPath());
+ return file;
+ } catch (SecurityException se) {
+ return null;
+ }
+ }
+
+ private File[] checkFiles(File[] files) {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm == null || files == null || files.length == 0) {
+ return files;
+ }
+ return checkFiles(Arrays.stream(files), sm);
+ }
+
+ private File[] checkFiles(List<File> files) {
+ SecurityManager sm = System.getSecurityManager();
+ if (sm == null || files.isEmpty()) {
+ return files.toArray(new File[files.size()]);
+ }
+ return checkFiles(files.stream(), sm);
+ }
+
+ private File[] checkFiles(Stream<File> filesStream, SecurityManager sm) {
+ return filesStream.filter((file) -> checkFile(file, sm) != null)
+ .toArray(File[]::new);
+ }
+
/**
* Does <code>dir</code> represent a "computer" such as a node on the network, or
* "My Computer" on the desktop.
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/BerDecoder.java Tue Jan 27 13:58:55 2015 -0500
@@ -95,6 +95,9 @@
for( int i = 0; i < lengthbyte; i++) {
retval = (retval << 8) + (buf[offset++] & 0xff);
}
+ if (retval < 0) {
+ throw new DecodeException("Invalid length bytes");
+ }
return retval;
} else {
return lengthbyte;
--- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapCtx.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/LdapCtx.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -224,6 +224,7 @@
String hostname = null; // host name of server (no brackets
// for IPv6 literals)
LdapClient clnt = null; // connection handle
+ private boolean reconnect = false; // indicates that re-connect requested
Hashtable<String, java.lang.Object> envprops = null; // environment properties of context
int handleReferrals = DEFAULT_REFERRAL_MODE; // how referral is handled
boolean hasLdapsScheme = false; // true if the context was created
@@ -2663,6 +2664,7 @@
}
sharable = false; // can't share with existing contexts
+ reconnect = true;
ensureOpen(); // open or reauthenticated
}
@@ -2739,7 +2741,7 @@
try {
boolean initial = (clnt == null);
- if (initial) {
+ if (initial || reconnect) {
ldapVersion = (ver != null) ? Integer.parseInt(ver) :
DEFAULT_LDAP_VERSION;
@@ -2767,6 +2769,7 @@
// Required for SASL client identity
envprops);
+ reconnect = false;
/**
* Pooled connections are preauthenticated;
--- a/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.naming/share/classes/sun/security/provider/certpath/ldap/LDAPCertStore.java Tue Jan 27 13:58:55 2015 -0500
@@ -37,12 +37,13 @@
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.*;
+import javax.naming.CommunicationException;
+import javax.naming.ldap.InitialLdapContext;
+import javax.naming.ldap.LdapContext;
import javax.security.auth.x500.X500Principal;
import sun.misc.HexDumpEncoder;
@@ -160,7 +161,12 @@
/**
* The JNDI directory context.
*/
- private DirContext ctx;
+ private LdapContext ctx;
+
+ /**
+ * Flag indicating that communication error occurred.
+ */
+ private boolean communicationError = false;
/**
* Flag indicating whether we should prefetch CRLs.
@@ -218,6 +224,11 @@
certStoreCache = Cache.newSoftMemoryCache(185);
static synchronized CertStore getInstance(LDAPCertStoreParameters params)
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
+ // if necessary, convert params to SunLDAPCertStoreParameters because
+ // LDAPCertStoreParameters does not override equals() and hashCode()
+ if (! (params instanceof SunLDAPCertStoreParameters)) {
+ params = new SunLDAPCertStoreParameters(params.getServerName(), params.getPort());
+ }
CertStore lcs = certStoreCache.get(params);
if (lcs == null) {
lcs = CertStore.getInstance("LDAP", params);
@@ -256,7 +267,7 @@
}
try {
- ctx = new InitialDirContext(env);
+ ctx = new InitialLdapContext(env, null);
/*
* By default, follow referrals unless application has
* overridden property in an application resource file.
@@ -369,8 +380,17 @@
valueMap = new HashMap<>(8);
String[] attrIds = requestedAttributes.toArray(STRING0);
Attributes attrs;
+
+ if (communicationError) {
+ ctx.reconnect(null);
+ communicationError = false;
+ }
+
try {
attrs = ctx.getAttributes(name, attrIds);
+ } catch (CommunicationException ce) {
+ communicationError = true;
+ throw ce;
} catch (NameNotFoundException e) {
// name does not exist on this LDAP server
// treat same as not attributes found
@@ -884,7 +904,12 @@
SunLDAPCertStoreParameters() {
super();
}
+ @Override
public boolean equals(Object obj) {
+ if (obj == null) {
+ return false;
+ }
+
if (!(obj instanceof LDAPCertStoreParameters)) {
return false;
}
@@ -892,6 +917,7 @@
return (getPort() == params.getPort() &&
getServerName().equalsIgnoreCase(params.getServerName()));
}
+ @Override
public int hashCode() {
if (hashCode == 0) {
int result = 17;
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/Transport.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/Transport.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,10 @@
import java.rmi.server.RemoteServer;
import java.rmi.server.ServerNotActiveException;
import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.Permissions;
import java.security.PrivilegedAction;
+import java.security.ProtectionDomain;
import sun.rmi.runtime.Log;
import sun.rmi.server.Dispatcher;
import sun.rmi.server.UnicastServerRef;
@@ -69,6 +72,15 @@
/** ObjID for DGCImpl */
private static final ObjID dgcID = new ObjID(ObjID.DGC_ID);
+ /** AccessControlContext for setting context ClassLoader */
+ private static final AccessControlContext SETCCL_ACC;
+ static {
+ Permissions perms = new Permissions();
+ perms.add(new RuntimePermission("setContextClassLoader"));
+ ProtectionDomain[] pd = { new ProtectionDomain(null, perms) };
+ SETCCL_ACC = new AccessControlContext(pd);
+ }
+
/**
* Returns a <I>Channel</I> that generates connections to the
* endpoint <I>ep</I>. A Channel is an object that creates and
@@ -118,6 +130,16 @@
protected abstract void checkAcceptPermission(AccessControlContext acc);
/**
+ * Sets the context class loader for the current thread.
+ */
+ private static void setContextClassLoader(ClassLoader ccl) {
+ AccessController.doPrivileged((PrivilegedAction<Void>)() -> {
+ Thread.currentThread().setContextClassLoader(ccl);
+ return null;
+ }, SETCCL_ACC);
+ }
+
+ /**
* Service an incoming remote call. When a message arrives on the
* connection indicating the beginning of a remote call, the
* threads are required to call the <I>serviceCall</I> method of
@@ -165,11 +187,10 @@
target.getAccessControlContext();
ClassLoader ccl = target.getContextClassLoader();
- Thread t = Thread.currentThread();
- ClassLoader savedCcl = t.getContextClassLoader();
+ ClassLoader savedCcl = Thread.currentThread().getContextClassLoader();
try {
- t.setContextClassLoader(ccl);
+ setContextClassLoader(ccl);
currentTransport.set(this);
try {
java.security.AccessController.doPrivileged(
@@ -184,7 +205,7 @@
throw (IOException) pae.getException();
}
} finally {
- t.setContextClassLoader(savedCcl);
+ setContextClassLoader(savedCcl);
currentTransport.set(null);
}
--- a/jdk/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPTransport.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPTransport.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -49,7 +49,9 @@
import java.rmi.server.UID;
import java.security.AccessControlContext;
import java.security.AccessController;
+import java.security.Permissions;
import java.security.PrivilegedAction;
+import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -120,6 +122,14 @@
private static final ThreadLocal<ConnectionHandler>
threadConnectionHandler = new ThreadLocal<>();
+ /** an AccessControlContext with no permissions */
+ private static final AccessControlContext NOPERMS_ACC;
+ static {
+ Permissions perms = new Permissions();
+ ProtectionDomain[] pd = { new ProtectionDomain(null, perms) };
+ NOPERMS_ACC = new AccessControlContext(pd);
+ }
+
/** endpoints for this transport */
private final LinkedList<TCPEndpoint> epList;
/** number of objects exported on this transport */
@@ -664,7 +674,10 @@
t.setName("RMI TCP Connection(" +
connectionCount.incrementAndGet() +
")-" + remoteHost);
- run0();
+ AccessController.doPrivileged((PrivilegedAction<Void>)() -> {
+ run0();
+ return null;
+ }, NOPERMS_ACC);
} finally {
t.setName(name);
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSHeader.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSHeader.java Tue Jan 27 13:58:55 2015 -0500
@@ -270,6 +270,9 @@
value <<= 8;
value += 0x0ff & in.read();
}
+ if (value < 0) {
+ throw new IOException("Invalid length bytes");
+ }
}
return value;
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSNameImpl.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/GSSNameImpl.java Tue Jan 27 13:58:55 2015 -0500
@@ -257,7 +257,8 @@
((0xFF & bytes[pos++]) << 16) |
((0xFF & bytes[pos++]) << 8) |
(0xFF & bytes[pos++]));
- if (pos > bytes.length - mechPortionLen) {
+
+ if (mechPortionLen < 0 || pos > bytes.length - mechPortionLen) {
throw new GSSExceptionImpl(GSSException.BAD_NAME,
"Exported name mech name is corrupted!");
}
--- a/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/GSSNameElement.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/jgss/wrapper/GSSNameElement.java Tue Jan 27 13:58:55 2015 -0500
@@ -233,6 +233,9 @@
((0xFF & nameVal[pos++]) << 16) |
((0xFF & nameVal[pos++]) << 8) |
(0xFF & nameVal[pos++]));
+ if (mechPortionLen < 0) {
+ throw new GSSException(GSSException.BAD_NAME);
+ }
byte[] mechPortion = new byte[mechPortionLen];
System.arraycopy(nameVal, pos, mechPortion, 0, mechPortionLen);
return mechPortion;
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/SCDynamicStoreConfig.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/SCDynamicStoreConfig.java Tue Jan 27 13:58:55 2015 -0500
@@ -113,15 +113,17 @@
@SuppressWarnings("unchecked")
private static Hashtable<String, Object> convertNativeConfig(
- Hashtable<String, Object> stanzaTable) {
+ Hashtable<String, Object> stanzaTable) throws IOException {
// convert SCDynamicStore realm structure to Java realm structure
Hashtable<String, ?> realms =
(Hashtable<String, ?>) stanzaTable.get("realms");
- if (realms != null) {
- stanzaTable.remove("realms");
- Hashtable<String, Object> realmsTable = convertRealmConfigs(realms);
- stanzaTable.put("realms", realmsTable);
+ if (realms == null || realms.isEmpty()) {
+ throw new IOException(
+ "SCDynamicStore contains an empty Kerberos setting");
}
+ stanzaTable.remove("realms");
+ Hashtable<String, Object> realmsTable = convertRealmConfigs(realms);
+ stanzaTable.put("realms", realmsTable);
WrapAllStringInVector(stanzaTable);
if (DEBUG) System.out.println("stanzaTable : " + stanzaTable);
return stanzaTable;
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ccache/CCacheInputStream.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ccache/CCacheInputStream.java Tue Jan 27 13:58:55 2015 -0500
@@ -118,7 +118,7 @@
} else {
type = read(4);
}
- length = read(4);
+ length = readLength4();
List<String> result = new ArrayList<String>();
/*
* DCE includes the principal's realm in the count; the new format
@@ -127,7 +127,7 @@
if (version == KRB5_FCC_FVNO_1)
length--;
for (int i = 0; i <= length; i++) {
- namelength = read(4);
+ namelength = readLength4();
byte[] bytes = IOUtils.readFully(this, namelength, true);
result.add(new String(bytes));
}
@@ -184,7 +184,7 @@
keyType = read(2);
if (version == KRB5_FCC_FVNO_3)
read(2); /* keytype recorded twice in fvno 3 */
- keyLen = read(4);
+ keyLen = readLength4();
byte[] bytes = IOUtils.readFully(this, keyLen, true);
return new EncryptionKey(bytes, keyType, version);
}
@@ -207,12 +207,12 @@
HostAddress[] readAddr() throws IOException, KrbApErrException {
int numAddrs, addrType, addrLength;
- numAddrs = read(4);
+ numAddrs = readLength4();
if (numAddrs > 0) {
List<HostAddress> addrs = new ArrayList<>();
for (int i = 0; i < numAddrs; i++) {
addrType = read(2);
- addrLength = read(4);
+ addrLength = readLength4();
if (!(addrLength == 4 || addrLength == 16)) {
if (DEBUG) {
System.out.println("Incorrect address format.");
@@ -231,13 +231,13 @@
AuthorizationDataEntry[] readAuth() throws IOException {
int num, adtype, adlength;
- num = read(4);
+ num = readLength4();
if (num > 0) {
List<AuthorizationDataEntry> auData = new ArrayList<>();
byte[] data = null;
for (int i = 0; i < num; i++) {
adtype = read(2);
- adlength = read(4);
+ adlength = readLength4();
data = IOUtils.readFully(this, adlength, true);
auData.add(new AuthorizationDataEntry(adtype, data));
}
@@ -248,7 +248,7 @@
byte[] readData() throws IOException {
int length;
- length = read(4);
+ length = readLength4();
if (length == 0) {
return null;
} else {
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/ccache/FileCredentialsCache.java Tue Jan 27 13:58:55 2015 -0500
@@ -150,43 +150,43 @@
synchronized void init(PrincipalName principal, String name)
throws IOException, KrbException {
primaryPrincipal = principal;
- CCacheOutputStream cos =
- new CCacheOutputStream(new FileOutputStream(name));
- version = KRB5_FCC_FVNO_3;
- cos.writeHeader(primaryPrincipal, version);
- cos.close();
+ try (FileOutputStream fos = new FileOutputStream(name);
+ CCacheOutputStream cos = new CCacheOutputStream(fos)) {
+ version = KRB5_FCC_FVNO_3;
+ cos.writeHeader(primaryPrincipal, version);
+ }
load(name);
}
synchronized void load(String name) throws IOException, KrbException {
PrincipalName p;
- CCacheInputStream cis =
- new CCacheInputStream(new FileInputStream(name));
- version = cis.readVersion();
- if (version == KRB5_FCC_FVNO_4) {
- tag = cis.readTag();
- } else {
- tag = null;
- if (version == KRB5_FCC_FVNO_1 || version == KRB5_FCC_FVNO_2) {
- cis.setNativeByteOrder();
+ try (FileInputStream fis = new FileInputStream(name);
+ CCacheInputStream cis = new CCacheInputStream(fis)) {
+ version = cis.readVersion();
+ if (version == KRB5_FCC_FVNO_4) {
+ tag = cis.readTag();
+ } else {
+ tag = null;
+ if (version == KRB5_FCC_FVNO_1 || version == KRB5_FCC_FVNO_2) {
+ cis.setNativeByteOrder();
+ }
+ }
+ p = cis.readPrincipal(version);
+
+ if (primaryPrincipal != null) {
+ if (!(primaryPrincipal.match(p))) {
+ throw new IOException("Primary principals don't match.");
+ }
+ } else
+ primaryPrincipal = p;
+ credentialsList = new Vector<Credentials>();
+ while (cis.available() > 0) {
+ Credentials cred = cis.readCred(version);
+ if (cred != null) {
+ credentialsList.addElement(cred);
+ }
}
}
- p = cis.readPrincipal(version);
-
- if (primaryPrincipal != null) {
- if (!(primaryPrincipal.match(p))) {
- throw new IOException("Primary principals don't match.");
- }
- } else
- primaryPrincipal = p;
- credentialsList = new Vector<Credentials> ();
- while (cis.available() > 0) {
- Credentials cred = cis.readCred(version);
- if (cred != null) {
- credentialsList.addElement(cred);
- }
- }
- cis.close();
}
@@ -245,16 +245,16 @@
* Saves the credentials cache file to the disk.
*/
public synchronized void save() throws IOException, Asn1Exception {
- CCacheOutputStream cos
- = new CCacheOutputStream(new FileOutputStream(cacheName));
- cos.writeHeader(primaryPrincipal, version);
- Credentials[] tmp = null;
- if ((tmp = getCredsList()) != null) {
- for (int i = 0; i < tmp.length; i++) {
- cos.addCreds(tmp[i]);
+ try (FileOutputStream fos = new FileOutputStream(cacheName);
+ CCacheOutputStream cos = new CCacheOutputStream(fos)) {
+ cos.writeHeader(primaryPrincipal, version);
+ Credentials[] tmp = null;
+ if ((tmp = getCredsList()) != null) {
+ for (int i = 0; i < tmp.length; i++) {
+ cos.addCreds(tmp[i]);
+ }
}
}
- cos.close();
}
boolean match(String[] s1, String[] s2) {
--- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/util/KrbDataInputStream.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/util/KrbDataInputStream.java Tue Jan 27 13:58:55 2015 -0500
@@ -56,15 +56,33 @@
public KrbDataInputStream(InputStream is){
super(is);
}
+
+ /**
+ * Reads a length value which is represented in 4 bytes from
+ * this input stream. The value must be positive.
+ * @return the length value represented by this byte array.
+ * @throws IOException if there are not enough bytes or it represents
+ * a negative value
+ */
+ final public int readLength4() throws IOException {
+ int len = read(4);
+ if (len < 0) {
+ throw new IOException("Invalid encoding");
+ }
+ return len;
+ }
+
/**
* Reads up to the specific number of bytes from this input stream.
* @param num the number of bytes to be read.
* @return the int value of this byte array.
- * @exception IOException.
+ * @throws IOException if there are not enough bytes
*/
- public int read(int num) throws IOException{
+ public int read(int num) throws IOException {
byte[] bytes = new byte[num];
- read(bytes, 0, num);
+ if (read(bytes, 0, num) != num) {
+ throw new IOException("Premature end of stream reached");
+ }
int result = 0;
for (int i = 0; i < num; i++) {
if (bigEndian) {
--- a/jdk/src/jdk.deploy.osx/macosx/classes/apple/security/KeychainStore.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/jdk.deploy.osx/macosx/classes/apple/security/KeychainStore.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -911,6 +911,7 @@
return true;
}
+ @SuppressWarnings("deprecation")
private byte[] fetchPrivateKeyFromBag(byte[] privateKeyInfo) throws IOException, NoSuchAlgorithmException, CertificateException
{
byte[] returnValue = null;
@@ -971,6 +972,7 @@
return returnValue;
}
+ @SuppressWarnings("deprecation")
private byte[] extractKeyData(DerInputStream stream)
throws IOException, NoSuchAlgorithmException, CertificateException
{
--- a/jdk/src/jdk.httpserver/share/classes/sun/net/httpserver/Code.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/jdk.httpserver/share/classes/sun/net/httpserver/Code.java Tue Jan 27 13:58:55 2015 -0500
@@ -103,7 +103,7 @@
case HTTP_UNAVAILABLE: return " Service Unavailable";
case HTTP_GATEWAY_TIMEOUT: return " Gateway Timeout";
case HTTP_VERSION: return " HTTP Version Not Supported";
- default: return "";
+ default: return " ";
}
}
}
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystem.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 201, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -53,7 +53,6 @@
import java.util.zip.InflaterInputStream;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.ZipException;
-import java.util.zip.ZipError;
import static java.lang.Boolean.*;
import static jdk.nio.zipfs.ZipConstants.*;
import static jdk.nio.zipfs.ZipUtils.*;
@@ -119,7 +118,16 @@
this.zc = ZipCoder.get(nameEncoding);
this.defaultdir = new ZipPath(this, getBytes(defaultDir));
this.ch = Files.newByteChannel(zfpath, READ);
- this.cen = initCEN();
+ try {
+ this.cen = initCEN();
+ } catch (IOException x) {
+ try {
+ this.ch.close();
+ } catch (IOException xx) {
+ x.addSuppressed(xx);
+ }
+ throw x;
+ }
}
@Override
@@ -1058,12 +1066,15 @@
int nlen = CENNAM(cen, pos);
int elen = CENEXT(cen, pos);
int clen = CENCOM(cen, pos);
- if ((CENFLG(cen, pos) & 1) != 0)
+ if ((CENFLG(cen, pos) & 1) != 0) {
zerror("invalid CEN header (encrypted entry)");
- if (method != METHOD_STORED && method != METHOD_DEFLATED)
+ }
+ if (method != METHOD_STORED && method != METHOD_DEFLATED) {
zerror("invalid CEN header (unsupported compression method: " + method + ")");
- if (pos + CENHDR + nlen > limit)
+ }
+ if (pos + CENHDR + nlen > limit) {
zerror("invalid CEN header (bad header size)");
+ }
byte[] name = Arrays.copyOfRange(cen, pos + CENHDR, pos + CENHDR + nlen);
IndexNode inode = new IndexNode(name, pos);
inodes.put(inode, inode);
@@ -1533,6 +1544,7 @@
private CRC32 crc;
private Entry e;
private long written;
+ private boolean isClosed = false;
EntryOutputStream(Entry e, OutputStream os)
throws IOException
@@ -1545,9 +1557,14 @@
}
@Override
- public void write(byte b[], int off, int len) throws IOException {
+ public synchronized void write(byte b[], int off, int len)
+ throws IOException
+ {
if (e.type != Entry.FILECH) // only from sync
ensureOpen();
+ if (isClosed) {
+ throw new IOException("Stream closed");
+ }
if (off < 0 || len < 0 || off > b.length - len) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
@@ -1568,7 +1585,11 @@
}
@Override
- public void close() throws IOException {
+ public synchronized void close() throws IOException {
+ if (isClosed) {
+ return;
+ }
+ isClosed = true;
// TBD ensureOpen();
switch (e.method) {
case METHOD_DEFLATED:
@@ -1599,8 +1620,8 @@
}
}
- static void zerror(String msg) {
- throw new ZipError(msg);
+ static void zerror(String msg) throws ZipException {
+ throw new ZipException(msg);
}
// Maxmum number of de/inflater we cache
--- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystemProvider.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipFileSystemProvider.java Tue Jan 27 13:58:55 2015 -0500
@@ -36,7 +36,7 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
-import java.util.zip.ZipError;
+import java.util.zip.ZipException;
import java.util.concurrent.ExecutorService;
/*
@@ -100,7 +100,7 @@
ZipFileSystem zipfs = null;
try {
zipfs = new ZipFileSystem(this, path, env);
- } catch (ZipError ze) {
+ } catch (ZipException ze) {
String pname = path.toString();
if (pname.endsWith(".zip") || pname.endsWith(".jar"))
throw ze;
@@ -122,7 +122,7 @@
ensureFile(path);
try {
return new ZipFileSystem(this, path, env);
- } catch (ZipError ze) {
+ } catch (ZipException ze) {
String pname = path.toString();
if (pname.endsWith(".zip") || pname.endsWith(".jar"))
throw ze;
--- a/jdk/test/ProblemList.txt Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/ProblemList.txt Tue Jan 27 13:58:55 2015 -0500
@@ -142,9 +142,6 @@
# 8058492
java/lang/management/ThreadMXBean/FindDeadlocks.java generic-all
-# 8058506
-java/lang/management/ThreadMXBean/ThreadMXBeanStateTest.java generic-all
-
############################################################################
# jdk_jmx
@@ -299,6 +296,9 @@
# 8058616
com/sun/jdi/RedefinePop.sh generic-all
+# 8068645
+com/sun/jdi/CatchPatternTest.sh generic-all
+
############################################################################
# jdk_util
@@ -335,6 +335,9 @@
# 8057732
sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.java generic-all
+# 8064572 8060736 8062938
+sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all
+
# 8060088
com/sun/tracing/BasicWithSecurityMgr.java generic-all
--- a/jdk/test/TEST.groups Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/TEST.groups Tue Jan 27 13:58:55 2015 -0500
@@ -421,8 +421,7 @@
java/util/Collections/EmptyIterator.java \
java/util/concurrent/locks/Lock/TimedAcquireLeak.java \
java/util/jar/JarInputStream/ExtraFileInMetaInf.java \
- java/util/logging/AnonLoggerWeakRefLeak.sh \
- java/util/logging/LoggerWeakRefLeak.sh \
+ java/util/logging/TestLoggerWeakRefLeak.java \
java/util/zip/3GBZipFiles.sh \
jdk/lambda/FDTest.java \
jdk/lambda/separate/Compiler.java \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Mac/EmptyByteBufferTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.nio.ByteBuffer;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+
+/**
+ * @test
+ * @bug 8048603
+ * @summary Checks if MAC algorithms work fine with empty buffer
+ * @author Alexander Fomin
+ * @build Utils
+ * @run main EmptyByteBufferTest
+ */
+public class EmptyByteBufferTest implements MacTest {
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String[] args) {
+ Utils.runTests(new EmptyByteBufferTest());
+ }
+
+ @Override
+ public void doTest(String alg) throws NoSuchAlgorithmException,
+ InvalidKeyException, NoSuchProviderException {
+ SecretKey key = Utils.getSecretKeySpec();
+
+ // instantiate Mac object and init it with a SecretKey
+ Mac mac = Mac.getInstance(alg, "SunJCE");
+ mac.init(key);
+
+ // prepare buffer
+ byte[] data = new byte[0];
+ ByteBuffer buf = ByteBuffer.wrap(data);
+
+ mac.update(buf);
+ mac.doFinal();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Mac/LargeByteBufferTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.nio.ByteBuffer;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+
+/**
+ * @test
+ * @bug 8048603
+ * @summary Checks if PBE algorithms work fine with large buffer
+ * @author Alexander Fomin
+ * @build Utils
+ * @run main LargeByteBufferTest
+ */
+public class LargeByteBufferTest implements MacTest {
+
+ private static final int BUFFER_SIZE = 65535;
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String[] args) {
+ Utils.runTests(new LargeByteBufferTest());
+ }
+
+ @Override
+ public void doTest(String alg) throws NoSuchAlgorithmException,
+ InvalidKeyException, NoSuchProviderException {
+ SecretKey key = Utils.getSecretKeySpec();
+
+ // instantiate Mac object and init it with a SecretKey
+ Mac mac = Mac.getInstance(alg, "SunJCE");
+ mac.init(key);
+
+ // prepare buffer
+ byte[] data = new byte[BUFFER_SIZE];
+ for (int i = 0; i < BUFFER_SIZE; i++) {
+ data[i] = (byte) (i % 256);
+ }
+
+ ByteBuffer buf = ByteBuffer.wrap(data);
+ int limitBefore = buf.limit();
+
+ mac.update(buf);
+ mac.doFinal();
+
+ int limitAfter = buf.limit();
+ int positonAfter = buf.position();
+
+ if (limitAfter != limitBefore) {
+ System.out.println("limit after = " + limitAfter);
+ System.out.println("limit before = " + limitBefore);
+ throw new RuntimeException("Test failed: "
+ + "limit of buffer has been chenged.");
+ }
+
+ if (positonAfter != limitAfter) {
+ System.out.println("position after = " + positonAfter);
+ System.out.println("limit after = " + limitAfter);
+ throw new RuntimeException("Test failed: "
+ + "position of buffer isn't equal to its limit");
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Mac/MacSameTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * @test
+ * @bug 8048603
+ * @summary Check if doFinal and update operation result in same Mac
+ * @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
+ * @build Utils
+ * @run main MacSameTest
+ */
+public class MacSameTest implements MacTest {
+
+ private static final int MESSAGE_SIZE = 25;
+ private static final int OFFSET = 5;
+ private static final int KEY_SIZE = 70;
+
+ /**
+ * Initialize a message, instantiate a Mac object,
+ * initialize the object with a SecretKey,
+ * feed the message into the Mac object
+ * all at once and get the output MAC as result1.
+ * Reset the Mac object, chop the message into three pieces,
+ * feed into the Mac object sequentially, and get the output MAC as result2.
+ * Finally, compare result1 and result2 and see if they are the same.
+ *
+ * @param args the command line arguments
+ */
+ public static void main(String[] args) {
+ Utils.runTests(new MacSameTest());
+ }
+
+ @Override
+ public void doTest(String algo) throws NoSuchAlgorithmException,
+ NoSuchProviderException, InvalidKeyException {
+ Mac mac;
+ try {
+ mac = Mac.getInstance(algo, "SunJCE");
+ } catch (NoSuchAlgorithmException nsae) {
+ // depending on Solaris configuration,
+ // it can support HMAC or not with Mac
+ System.out.println("Expected NoSuchAlgorithmException thrown: "
+ + nsae);
+ return;
+ }
+
+ byte[] plain = new byte[MESSAGE_SIZE];
+ for (int i = 0; i < MESSAGE_SIZE; i++) {
+ plain[i] = (byte) (i % 256);
+ }
+
+ byte[] tail = new byte[plain.length - OFFSET];
+ System.arraycopy(plain, OFFSET, tail, 0, tail.length);
+
+ SecureRandom srdm = new SecureRandom();
+ byte[] keyVal = new byte[KEY_SIZE];
+ srdm.nextBytes(keyVal);
+ SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");
+
+ mac.init(keySpec);
+ byte[] result1 = mac.doFinal(plain);
+
+ mac.reset();
+ mac.update(plain[0]);
+ mac.update(plain, 1, OFFSET - 1);
+ byte[] result2 = mac.doFinal(tail);
+
+ if (!java.util.Arrays.equals(result1, result2)) {
+ throw new RuntimeException("result1 and result2 are not the same");
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Mac/NullByteBufferTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.nio.ByteBuffer;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+
+/**
+ * @test
+ * @bug 8048603
+ * @summary Checks if PBE algorithms work fine with null buffer
+ * @author Alexander Fomin
+ * @build Utils
+ * @run main NullByteBufferTest
+ */
+public class NullByteBufferTest implements MacTest {
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main(String[] args) {
+ Utils.runTests(new NullByteBufferTest());
+ }
+
+ @Override
+ public void doTest(String alg) throws NoSuchAlgorithmException,
+ InvalidKeyException, NoSuchProviderException {
+ SecretKey key = Utils.getSecretKeySpec();
+
+ // instantiate Mac object and init it with a SecretKey
+ Mac mac = Mac.getInstance(alg, "SunJCE");
+ mac.init(key);
+
+ try {
+ ByteBuffer buf = null;
+ mac.update(buf);
+ mac.doFinal();
+ throw new RuntimeException(
+ "Expected IllegalArgumentException not thrown");
+ } catch (IllegalArgumentException e) {
+ System.out.println("Expected IllegalArgumentException thrown: "
+ + e);
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/crypto/provider/Mac/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.SecureRandom;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * Helper class.
+ */
+class Utils {
+
+ static final int KEY_SIZE = 70;
+
+ static final String[] MAC_ALGOS = {"HmacMD5", "HmacSHA1", "HmacSHA224",
+ "HmacSHA256", "HmacSHA384", "HmacSHA512"};
+
+ /**
+ * Get SecretKeySpec.
+ */
+ static SecretKeySpec getSecretKeySpec() {
+ SecureRandom srdm = new SecureRandom();
+ byte[] keyVal = new byte[KEY_SIZE];
+ srdm.nextBytes(keyVal);
+ return new SecretKeySpec(keyVal, "HMAC");
+ }
+
+ static void runTests(MacTest... tests) {
+ boolean success = true;
+ for (MacTest test : tests) {
+ success &= runTest(test);
+ }
+
+ if (success) {
+ System.out.println("Test passed");
+ } else {
+ throw new RuntimeException("Test failed");
+ }
+ }
+
+ private static boolean runTest(MacTest test) {
+ boolean success = true;
+ for (String alg : MAC_ALGOS) {
+ try {
+ System.out.println("Test " + alg);
+ test.doTest(alg);
+ } catch (Exception e) {
+ System.out.println("Unexpected exception:");
+ e.printStackTrace();
+ success = false;
+ }
+ }
+
+ return success;
+ }
+}
+
+interface MacTest {
+ void doTest(String alg) throws Exception;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/net/httpserver/MissingTrailingSpace.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8068795
+ * @summary HttpServer missing tailing space for some response codes
+ * @author lev.priima@oracle.com
+ */
+
+import java.net.InetSocketAddress;
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.net.Socket;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+
+public class MissingTrailingSpace {
+
+ private static final int noMsgCode = 207;
+ private static final String someContext = "/context";
+
+ public static void main(String[] args) throws Exception {
+ HttpServer server = HttpServer.create(new InetSocketAddress(0), 0);
+ try {
+ server.setExecutor(Executors.newFixedThreadPool(1));
+ server.createContext(someContext, new HttpHandler() {
+ @Override
+ public void handle(HttpExchange msg) {
+ try {
+ try {
+ msg.sendResponseHeaders(noMsgCode, -1);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ } finally {
+ msg.close();
+ }
+ }
+ });
+ server.start();
+ System.out.println("Server started at port "
+ + server.getAddress().getPort());
+
+ runRawSocketHttpClient("localhost", server.getAddress().getPort());
+ } finally {
+ ((ExecutorService)server.getExecutor()).shutdown();
+ server.stop(0);
+ }
+ System.out.println("Server finished.");
+ }
+
+ static void runRawSocketHttpClient(String hostname, int port)
+ throws Exception
+ {
+ Socket socket = null;
+ PrintWriter writer = null;
+ BufferedReader reader = null;
+ final String CRLF = "\r\n";
+ try {
+ socket = new Socket(hostname, port);
+ writer = new PrintWriter(new OutputStreamWriter(
+ socket.getOutputStream()));
+ System.out.println("Client connected by socket: " + socket);
+
+ writer.print("GET " + someContext + "/ HTTP/1.1" + CRLF);
+ writer.print("User-Agent: Java/"
+ + System.getProperty("java.version")
+ + CRLF);
+ writer.print("Host: " + hostname + CRLF);
+ writer.print("Accept: */*" + CRLF);
+ writer.print("Connection: keep-alive" + CRLF);
+ writer.print(CRLF); // Important, else the server will expect that
+ // there's more into the request.
+ writer.flush();
+ System.out.println("Client wrote rquest to socket: " + socket);
+
+ reader = new BufferedReader(new InputStreamReader(
+ socket.getInputStream()));
+ System.out.println("Client start reading from server:" );
+ String line = reader.readLine();
+ if ( !line.endsWith(" ") ) {
+ throw new RuntimeException("respond to unknown code "
+ + noMsgCode
+ + " doesn't return space at the end of the first header.\n"
+ + "Should be: " + "\"" + line + " \""
+ + ", but returns: " + "\"" + line + "\".");
+ }
+ for (; line != null; line = reader.readLine()) {
+ if (line.isEmpty()) {
+ break;
+ }
+ System.out.println("\"" + line + "\"");
+ }
+ System.out.println("Client finished reading from server" );
+ } finally {
+ if (reader != null)
+ try {
+ reader.close();
+ } catch (IOException logOrIgnore) {
+ logOrIgnore.printStackTrace();
+ }
+ if (writer != null) {
+ writer.close();
+ }
+ if (socket != null) {
+ try {
+ socket.close();
+ } catch (IOException logOrIgnore) {
+ logOrIgnore.printStackTrace();
+ }
+ }
+ }
+ System.out.println("Client finished." );
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/MultipleDialogs/MultipleDialogs1Test.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8054358
+ * @summary Check whether a set of dialogs created with a toolkit excluded Frame
+ * parent has a proper modal blocking behavior. Also show a document modal
+ * dialog and check if it blocks the document properly.
+ *
+ * @library ../helpers ../../../../lib/testlibrary/
+ * @build ExtendedRobot
+ * @build Flag
+ * @build TestDialog
+ * @build TestFrame
+ * @run main/timeout=500 MultipleDialogs1Test
+ */
+
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import java.util.Iterator;
+
+public class MultipleDialogs1Test {
+
+ private volatile CustomFrame frame;
+ private List<CustomDialog> dialogList;
+
+ private static int delay = 500;
+ private int dialogCount = -1;
+
+ public void createGUI() {
+
+ final int n = 8;
+ dialogList = new ArrayList<>();
+
+ frame = new CustomFrame();
+ frame.setLocation(50, 50);
+ frame.setModalExclusionType(Dialog.ModalExclusionType.TOOLKIT_EXCLUDE);
+ frame.setVisible(true);
+
+ int x = 250, y = 50;
+
+ CustomDialog dlg;
+
+ for (int i = 0; i < n - 1; ++i) {
+
+ dlg = new CustomDialog(frame);
+ dlg.setLocation(x, y);
+ x += 200;
+
+ if (x > 600) {
+ x = 50;
+ y += 200;
+ }
+
+ Dialog.ModalityType type;
+
+ if (i % 3 == 0) {
+ type = Dialog.ModalityType.MODELESS;
+ } else if (i % 3 == 1) {
+ type = Dialog.ModalityType.APPLICATION_MODAL;
+ } else {
+ type = Dialog.ModalityType.TOOLKIT_MODAL;
+ }
+
+ dlg.setModalityType(type);
+ dialogList.add(dlg);
+ }
+
+ dlg = new CustomDialog(frame);
+ dlg.setLocation(x, y);
+ dlg.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
+ dialogList.add(dlg);
+ }
+
+ public void doTest() throws Exception {
+
+ try {
+ EventQueue.invokeAndWait(this::createGUI);
+
+ ExtendedRobot robot = new ExtendedRobot();
+ robot.waitForIdle(delay);
+
+ List<CustomDialog> dialogs = Collections.synchronizedList(dialogList);
+
+ final int n = dialogs.size();
+
+ synchronized(dialogs) {
+ for (int i = 0; i < n - 1; ++i) {
+
+ frame.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ dialogs.get(i).checkUnblockedDialog(
+ robot, i + ": This is " + getType(i) + ".");
+
+ frame.checkUnblockedFrame(robot, i + ": Other dialogs are visible.");
+
+ if (i > 0) {
+ for (int j = 0; j < i; j++) {
+ dialogs.get(j).checkUnblockedDialog(robot, j + ": A toolkit modality " +
+ "excluded frame is a parent of this dialog.");
+ }
+ }
+ } // i
+
+ frame.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ dialogs.get(n - 1).checkUnblockedDialog(
+ robot, (n - 1) + ": This is " + getType(n - 1) + ".");
+
+ frame.checkBlockedFrame(robot,
+ "A document modal dialog with Frame parent is visible.");
+
+ for (int i = 0; i < n - 1; ++i) {
+ dialogs.get(i).checkUnblockedDialog(robot,
+ i + ": A document modal dialog should not block " +
+ "this dialog. The parent is modality excluded.");
+ }
+
+ dialogs.get(n - 1).clickCloseButton(robot);
+ robot.waitForIdle(delay);
+
+ for (int i = 0; i < n - 1; ++i) {
+ dialogs.get(i).checkUnblockedDialog(robot, i + ": A document modal " +
+ "dialog which blocked this dialog was closed.");
+ }
+ frame.checkUnblockedFrame(robot,
+ "A blocking document modal dialog was closed.");
+ robot.waitForIdle(delay);
+ } // synchronized
+
+ } finally {
+ EventQueue.invokeAndWait(this::closeAll);
+ }
+ }
+
+ private String getType(int i) {
+
+ switch (dialogList.get(i).getModalityType()) {
+ case APPLICATION_MODAL:
+ return "an application modal dialog";
+ case DOCUMENT_MODAL:
+ return "a document modal dialog";
+ case TOOLKIT_MODAL:
+ return "a toolkit modal dialog";
+ }
+ return "a modeless dialog";
+ }
+
+ private void closeAll() {
+
+ if (frame != null) { frame.dispose(); }
+ if (dialogList != null) {
+ Iterator<CustomDialog> it = dialogList.iterator();
+ while (it.hasNext()) { it.next().dispose(); }
+ }
+ }
+
+ class CustomFrame extends TestFrame {
+
+ @Override
+ public void doOpenAction() {
+ if ((dialogList != null) && (dialogList.size() > dialogCount)) {
+ dialogCount++;
+ CustomDialog d = dialogList.get(dialogCount);
+ if (d != null) { d.setVisible(true); }
+ }
+ }
+ }
+
+ class CustomDialog extends TestDialog {
+
+ public CustomDialog(Frame f) { super(f); }
+ public CustomDialog(Dialog d) { super(d); }
+
+ @Override
+ public void doCloseAction() { this.dispose(); }
+ }
+
+
+ public static void main(String[] args) throws Exception {
+ (new MultipleDialogs1Test()).doTest();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/MultipleDialogs/MultipleDialogs2Test.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,299 @@
+/*
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8054358
+ * @summary Check whether a set of dialogs created with an application excluded Frame
+ * parent has a proper modal blocking behavior. Also show a document modal
+ * dialog and check if it blocks the document properly.
+ *
+ * @library ../helpers ../../../../lib/testlibrary/
+ * @build ExtendedRobot
+ * @build Flag
+ * @build TestDialog
+ * @build TestFrame
+ * @run main/timeout=500 MultipleDialogs2Test
+ */
+
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import java.util.Iterator;
+
+public class MultipleDialogs2Test {
+
+ private volatile CustomFrame frame;
+ private List<CustomDialog> dialogList;
+ private static final int delay = 500;
+
+ private int dialogCount = -1;
+
+ private void createGUI() {
+
+ final int n = 8;
+ dialogList = new ArrayList<>();
+
+ frame = new CustomFrame();
+ frame.setLocation(50, 50);
+ frame.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
+ frame.setVisible(true);
+
+ CustomDialog dlg;
+
+ int x = 250, y = 50;
+ for (int i = 0; i < n - 1; ++i) {
+
+ dlg = new CustomDialog(frame);
+ dlg.setLocation(x, y);
+ x += 200;
+ if (x > 600) {
+ x = 50;
+ y += 200;
+ }
+
+ Dialog.ModalityType type;
+ if (i % 3 == 0) {
+ type = Dialog.ModalityType.MODELESS;
+ } else if (i % 3 == 1) {
+ type = Dialog.ModalityType.APPLICATION_MODAL;
+ } else {
+ type = Dialog.ModalityType.TOOLKIT_MODAL;
+ }
+ dlg.setModalityType(type);
+ dialogList.add(dlg);
+ }
+
+ dlg = new CustomDialog(frame);
+ dlg.setLocation(x, y);
+ dlg.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
+ dialogList.add(dlg);
+ }
+
+ public void doTest() throws Exception {
+
+ try {
+ EventQueue.invokeAndWait(this::createGUI);
+
+ ExtendedRobot robot = new ExtendedRobot();
+ robot.waitForIdle(delay);
+
+ List<CustomDialog> dialogs = Collections.synchronizedList(dialogList);
+ final int n = dialogs.size();
+
+ synchronized(dialogs) {
+ for (int i = 0; i < n - 1; ++i) {
+
+ frame.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ dialogs.get(i).checkUnblockedDialog(
+ robot, i + ": This is " + getType(i) + ".");
+
+ if (isToolkitModal(i)) {
+
+ for (int j = 0; j < i; ++j) {
+ dialogs.get(j).checkBlockedDialog(robot, j + ": This dialog " +
+ "should be blocked by a toolkit modal dialog.");
+ }
+
+ frame.checkBlockedFrame(robot, i + ": A toolkit modal dialog " +
+ "should block this application modality excluded frame.");
+
+ break;
+
+ } else {
+ for (int j = 0; j < i; ++j) {
+ dialogs.get(j).checkUnblockedDialog(robot,
+ j + ": An application modality excluded frame " +
+ "is the parent of this dialog.");
+ }
+
+ frame.checkUnblockedFrame(robot, i + ": The frame is " +
+ "application modality excluded, but it is blocked.");
+ }
+ }
+
+ int tkIndex = dialogCount; // continue testing
+ final int tk0 = tkIndex;
+
+ for (int i = tk0 + 1; i < n - 1; ++i) {
+
+ dialogs.get(tkIndex).clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ frame.checkBlockedFrame(robot, i + ": A toolkit modal dialog " +
+ "should block this application modality excluded frame.");
+
+ if (isToolkitModal(i)) {
+ dialogs.get(i).checkUnblockedDialog(robot, i + ": This is " +
+ "a toolkit modal dialog with blocked frame parent. " +
+ "Another toolkit modal dialog is visible.");
+
+ for (int j = 0; j < i; ++j) {
+ dialogs.get(j).checkBlockedDialog(robot, j + ": " +
+ "A toolkit modal dialog should block this child " +
+ "dialog of application modality excluded frame.");
+ }
+ tkIndex = i;
+ } else {
+ dialogs.get(i).checkBlockedDialog(
+ robot, i + ": This is " + getType(i) + " with blocked " +
+ "Frame parent. Also, a toolkit modal dialog is visible.");
+
+ for (int j = 0; j < i; ++j) {
+ if (j != tkIndex) {
+ dialogs.get(j).checkBlockedDialog(robot, j +
+ ": A toolkit modal dialog should block this " +
+ "child dialog of an application modality excluded frame.");
+ }
+ }
+ }
+ }
+
+ // show a document modal dialog; the toolkit modal dialog should block it
+ dialogs.get(tkIndex).clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ frame.checkBlockedFrame(robot, "A toolkit modal dialog is visible.");
+
+ for (int i = 0; i < n; ++i) {
+ if (i == tkIndex) {
+ dialogs.get(tkIndex).checkUnblockedDialog(robot,
+ tkIndex + ": This is a toolkit modal dialog. " +
+ "A document modal dialog is visible.");
+ } else {
+ dialogs.get(i).checkBlockedDialog(robot,
+ i + ": A toolkit modal dialog should block this dialog.");
+ }
+ }
+
+ dialogs.get(tk0 + 3).clickCloseButton(robot); // close 2nd toolkit dialog
+ robot.waitForIdle(delay);
+
+ for (int i = 0; i < n; ++i) {
+
+ if (i == tk0 + 3) { continue; }
+ if (i == tk0) {
+ dialogs.get(i).checkUnblockedDialog(robot,
+ i + ": This is a toolkit modal dialog. A blocking " +
+ "toolkit modal dialog was opened and then closed.");
+ } else {
+ dialogs.get(i).checkBlockedDialog(robot,
+ i + ": This dialog should be blocked by a toolkit modal dialog. " +
+ "Another blocking toolkit modal dialog was closed.");
+ }
+ }
+
+ dialogs.get(tk0).clickCloseButton(robot);
+ robot.waitForIdle(delay);
+
+ frame.checkBlockedFrame(
+ robot, "A document modal dialog should block this Frame.");
+
+ for (int i = 0; i < n - 1; ++i) {
+ if (!isToolkitModal(i)) {
+ dialogs.get(i).checkUnblockedDialog(robot, i + ": The parent " +
+ "of the dialog is an app modality excluded Frame.");
+ }
+ }
+
+ dialogs.get(n - 1).clickCloseButton(robot);
+ robot.waitForIdle(delay);
+
+ frame.checkUnblockedFrame(robot, "A document modal dialog " +
+ "blocking this Frame was closed.");
+
+ for (int i = 0; i < n - 1; ++i) {
+ if (!isToolkitModal(i)) {
+ dialogs.get(i).checkUnblockedDialog(robot, i + ": A document modal " +
+ "dialog blocking the parent frame was closed.");
+ }
+ }
+ } // synchronized
+
+ } finally {
+ EventQueue.invokeAndWait(this::closeAll);
+ }
+ }
+
+ private boolean isToolkitModal(int i) { return (i % 3 == 2); }
+
+ private String getType(int i) {
+
+ switch (dialogList.get(i).getModalityType()) {
+ case APPLICATION_MODAL:
+ return "an application modal dialog";
+ case DOCUMENT_MODAL:
+ return "a document modal dialog";
+ case TOOLKIT_MODAL:
+ return "a toolkit modal dialog";
+ }
+ return "a modeless dialog";
+ }
+
+ public void closeAll() {
+
+ if (frame != null) { frame.dispose(); }
+ if (dialogList != null) {
+ Iterator<CustomDialog> it = dialogList.iterator();
+ while (it.hasNext()) { it.next().dispose(); }
+ }
+ }
+
+ class CustomFrame extends TestFrame {
+
+ @Override
+ public void doOpenAction() {
+ if ((dialogList != null) && (dialogList.size() > dialogCount)) {
+ dialogCount++;
+ CustomDialog d = dialogList.get(dialogCount);
+ if (d != null) { d.setVisible(true); }
+ }
+ }
+ }
+
+ class CustomDialog extends TestDialog {
+
+ public CustomDialog(Frame frame) { super(frame); }
+
+ @Override
+ public void doCloseAction() { this.dispose(); }
+
+ @Override
+ public void doOpenAction() {
+ if ((dialogList != null) && (dialogList.size() > dialogCount)) {
+ dialogCount++;
+ if (dialogList.get(dialogCount) != null) {
+ dialogList.get(dialogCount).setVisible(true);
+ }
+ }
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ (new MultipleDialogs2Test()).doTest();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/MultipleDialogs/MultipleDialogs3Test.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8054358
+ * @summary Check correctness of modal blocking behavior for a chain of Dialogs
+ * having different modality types with a Frame as a document root.
+ *
+ * @library ../helpers ../../../../lib/testlibrary/
+ * @build ExtendedRobot
+ * @build Flag
+ * @build TestDialog
+ * @build TestFrame
+ * @run main/timeout=500 MultipleDialogs3Test
+ */
+
+
+import java.awt.*;
+import static jdk.testlibrary.Asserts.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import java.util.Iterator;
+
+
+public class MultipleDialogs3Test {
+
+ private volatile CustomFrame frame;
+ private List<CustomDialog> dialogList;
+ private static int delay = 500;
+
+ private int dialogCount = -1;
+
+ public void createGUI() {
+
+ final int n = 8;
+ dialogList = new ArrayList<>();
+
+ frame = new CustomFrame();
+ frame.setLocation(50, 50);
+ frame.setVisible(true);
+
+ int x = 250;
+ int y = 50;
+ for (int i = 0; i < n; ++i) {
+
+ CustomDialog dlg;
+ if (i == 0) {
+ dlg = new CustomDialog(frame);
+ } else {
+ dlg = new CustomDialog(dialogList.get(i - 1));
+ }
+ dlg.setLocation(x, y);
+ x += 200;
+ if (x > 600) {
+ x = 50;
+ y += 200;
+ }
+
+ Dialog.ModalityType type;
+
+ if (i % 4 == 0) {
+ type = Dialog.ModalityType.MODELESS;
+ } else if (i % 4 == 1) {
+ type = Dialog.ModalityType.DOCUMENT_MODAL;
+ } else if (i % 4 == 2) {
+ type = Dialog.ModalityType.APPLICATION_MODAL;
+ } else {
+ type = Dialog.ModalityType.TOOLKIT_MODAL;
+ }
+
+ dlg.setModalityType(type);
+ dialogList.add(dlg);
+ }
+ }
+
+ public void doTest() throws Exception {
+
+ try {
+ EventQueue.invokeAndWait(this::createGUI);
+
+ ExtendedRobot robot = new ExtendedRobot();
+ robot.waitForIdle(delay);
+
+ frame.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ List<CustomDialog> dialogs = Collections.synchronizedList(dialogList);
+ final int n = dialogs.size();
+
+ synchronized(dialogs) {
+ for (int i = 0; i < n; ++i) {
+ dialogs.get(i).activated.waitForFlagTriggered();
+ assertTrue(dialogs.get(i).activated.flag(), i + ": Dialog did not " +
+ "trigger windowActivated event when it became visible.");
+
+ dialogs.get(i).closeGained.waitForFlagTriggered();
+ assertTrue(dialogs.get(i).closeGained.flag(), i + ": Close button " +
+ "did not gain focus when Dialog became visible.");
+
+ assertTrue(dialogs.get(i).closeButton.hasFocus(), i +
+ ": Close button gained focus but then lost it.");
+
+ dialogs.get(i).checkUnblockedDialog(robot,
+ i + ": The dialog shouldn't be blocked.");
+
+ if (i == 0) {
+ assertTrue(dialogs.get(0).getModalityType() ==
+ Dialog.ModalityType.MODELESS, "0: invalid modality type.");
+
+ frame.checkUnblockedFrame(robot, i + ": A modeless dialog was " +
+ "shown, but the parent frame became blocked.");
+
+ } else {
+ if (i % 4 == 0) { // modeless dialog
+ assertTrue(dialogs.get(i).getModalityType() ==
+ Dialog.ModalityType.MODELESS, i +
+ ": incorrect dialog modality type.");
+
+ dialogs.get(i - 1).checkUnblockedDialog(robot, i + ": A modeless " +
+ "dialog was shown, but the parent dialog became blocked.");
+
+ if (i > 0) {
+ for (int j = 0; j < i - 1; ++j) {
+
+ dialogs.get(j).checkBlockedDialog(robot, i + ", " + j +
+ ": Showing a modeless dialog as a child of a " +
+ "modal dialog unblocked some dialog in its hierarchy.");
+ }
+ }
+ } else {
+
+ for (int j = 0; j < i; ++j) {
+
+ dialogs.get(j).checkBlockedDialog(robot, i + ", " + j +
+ ": A modal dialog was shown, but some dialog " +
+ "in its hierarchy became unblocked.");
+ }
+ }
+
+ frame.checkBlockedFrame(robot, i + ": A modal was dialog shown, " +
+ "but the document root frame became unblocked.");
+ }
+
+ if (i != n - 1) {
+ dialogs.get(i).clickOpenButton(robot);
+ robot.waitForIdle(delay);
+ }
+ }
+
+ for (int i = n - 1; i >= 0; --i) {
+
+ resetAll();
+ dialogs.get(i).clickCloseButton(robot);
+ robot.waitForIdle(delay);
+
+ if (i > 0) {
+
+ dialogs.get(i - 1).activated.waitForFlagTriggered();
+ assertTrue(dialogs.get(i - 1).activated.flag(), i + ": Dialog " +
+ "was not activated when a child dialog was closed.");
+
+ if (i == 1) {
+
+ frame.checkUnblockedFrame(robot, "1: Frame having " +
+ "a child modeless dialog was blocked.");
+
+ dialogs.get(0).checkUnblockedDialog(robot,
+ "0: A modeless dialog at the bottom " +
+ "of the hierarchy was blocked.");
+
+ } else if ((i - 1) % 4 == 0) { // dialog[i - 1] is modeless
+
+ for (int j = 0; j < i - 2; ++j) {
+
+ dialogs.get(j).checkBlockedDialog(robot, i + ", " + j +
+ ": A dialog in the hierarchy was not blocked. " +
+ "A dialog blocking a modeless dialog was closed.");
+ }
+
+ dialogs.get(i - 2).checkUnblockedDialog(robot, i + ": A modal " +
+ "dialog having a child modeless dialog was blocked.");
+
+ dialogs.get(i - 1).checkUnblockedDialog(robot, i + ": A modeless " +
+ "dialog at the bottom of the hierarchy was blocked.");
+
+ frame.checkBlockedFrame(robot, i +
+ ": Frame having a child modal dialog was not blocked.");
+
+ } else {
+ for (int j = 0; j <= i - 2; ++j) {
+ dialogs.get(j).checkBlockedDialog(robot, i + ", " + j +
+ ": A dialog in the hierarchy was not blocked. " +
+ "A child dialog was closed.");
+ }
+
+ dialogs.get(i - 1).checkUnblockedDialog(robot, (i - 1) +
+ ": A dialog was not unblocked when the modal dialog was closed.");
+
+ frame.checkBlockedFrame(robot, i + ": Frame having " +
+ "a child modal dialog was not blocked. " +
+ "Another child dialog was closed.");
+ }
+ } else {
+ frame.activated.waitForFlagTriggered();
+ assertTrue(frame.activated.flag(), i + ": Frame was not " +
+ "activated when a child dialog was closed.");
+ }
+ }
+ } // synchronized
+
+ } finally {
+ EventQueue.invokeAndWait(this::closeAll);
+ }
+ }
+
+ private void resetAll() {
+ frame.resetStatus();
+ Iterator<CustomDialog> it = dialogList.iterator();
+ while (it.hasNext()) { it.next().resetStatus(); }
+ }
+
+ public void closeAll() {
+ if (frame != null) { frame.dispose(); }
+ if (dialogList != null) {
+ Iterator<CustomDialog> it = dialogList.iterator();
+ while (it.hasNext()) { it.next().dispose(); }
+ }
+ }
+
+ class CustomFrame extends TestFrame {
+
+ @Override
+ public void doOpenAction() {
+ if ((dialogList != null) && (dialogList.size() > dialogCount)) {
+ dialogCount++;
+ CustomDialog d = dialogList.get(dialogCount);
+ if (d != null) { d.setVisible(true); }
+ }
+ }
+ }
+
+ class CustomDialog extends TestDialog {
+
+ public CustomDialog(Frame frame) { super(frame); }
+ public CustomDialog(Dialog dialog) { super(dialog); }
+
+ @Override
+ public void doCloseAction() { this.dispose(); }
+
+ @Override
+ public void doOpenAction() {
+ if ((dialogList != null) && (dialogList.size() > dialogCount)) {
+ dialogCount++;
+ CustomDialog d = dialogList.get(dialogCount);
+ if (d != null) { d.setVisible(true); }
+ }
+ }
+ }
+
+
+ public static void main(String[] args) throws Exception {
+ (new MultipleDialogs3Test()).doTest();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/MultipleDialogs/MultipleDialogs4Test.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8054358 8055003
+ * @summary Check whether application and document modality levels for Dialog
+ * work properly. Also check whether the blocking dialogs are
+ * opening on top of the windows they block.
+ *
+ * @library ../helpers ../../../../lib/testlibrary/
+ * @build ExtendedRobot
+ * @build Flag
+ * @build TestDialog
+ * @build TestFrame
+ * @run main MultipleDialogs4Test
+ */
+
+
+import java.awt.*;
+import static jdk.testlibrary.Asserts.*;
+
+
+public class MultipleDialogs4Test {
+
+ private volatile TopLevelFrame frame;
+ private volatile CustomFrame secondFrame;
+ private volatile TestFrame thirdFrame;
+ private volatile TestDialog dialog, secondDialog, docChildDialog, appChildDialog;
+
+ private static final int delay = 500;
+
+
+ private void createGUI() {
+
+ frame = new TopLevelFrame();
+ frame.setLocation(50, 50);
+ frame.setVisible(true);
+
+ dialog = new TestDialog((Dialog) null);
+ dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
+ dialog.setLocation(150, 50);
+
+ appChildDialog = new TestDialog(dialog);
+ appChildDialog.setLocation(150, 90);
+
+ secondFrame = new CustomFrame();
+ secondFrame.setLocation(50, 250);
+
+ secondDialog = new TestDialog(secondFrame);
+ secondDialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
+ secondDialog.setLocation(150, 250);
+
+ docChildDialog = new TestDialog(secondFrame);
+ docChildDialog.setBackground(Color.black);
+ docChildDialog.setLocation(250, 250);
+
+ thirdFrame = new TestFrame();
+ thirdFrame.setLocation(250, 50);
+ }
+
+ public void doTest() throws Exception {
+
+ try {
+ EventQueue.invokeAndWait(this::createGUI);
+
+ final int nAttempts = 3;
+ ExtendedRobot robot = new ExtendedRobot();
+ robot.waitForIdle(delay);
+
+ frame.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ secondFrame.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ secondFrame.checkBlockedFrame(robot,
+ "A document modal dialog should block this Frame.");
+
+ secondDialog.checkUnblockedDialog(robot, "This is a document " +
+ "modal dialog. No window blocks it.");
+
+ frame.checkUnblockedFrame(robot,
+ "There are no dialogs blocking this Frame.");
+
+ frame.clickCloseButton(robot);
+ robot.waitForIdle(delay);
+
+ frame.clickDummyButton(robot, nAttempts, false,
+ "The frame still on top even after showing a modal dialog.");
+ robot.waitForIdle(delay);
+
+ EventQueue.invokeAndWait(() -> { thirdFrame.setVisible(true); });
+ robot.waitForIdle(delay);
+
+ dialog.clickDummyButton(robot);
+ robot.waitForIdle(delay);
+
+ secondDialog.clickDummyButton(
+ robot, nAttempts, false, "The document modal dialog " +
+ "was not blocked by an application modal dialog.");
+ robot.waitForIdle(delay);
+
+ EventQueue.invokeLater(() -> { docChildDialog.setVisible(true); });
+ robot.waitForIdle(delay);
+
+ Color c = robot.getPixelColor(
+ (int) secondDialog.getLocationOnScreen().x + secondDialog.getSize().width - 25,
+ (int) secondDialog.getLocationOnScreen().y + secondDialog.getSize().height - 25);
+ assertFalse(c.equals(Color.black), "A dialog which should be blocked " +
+ "by document modal dialog overlapping it.");
+
+ EventQueue.invokeLater(() -> { appChildDialog.setVisible(true); });
+ robot.waitForIdle(delay);
+
+ appChildDialog.activated.waitForFlagTriggered();
+ assertTrue(appChildDialog.activated.flag(), "The child dialog of the " +
+ "application modal dialog still not visible.");
+ robot.waitForIdle(delay);
+
+ dialog.clickDummyButton(robot, nAttempts, false, "The child dialog of " +
+ "the application modal dialog did not overlap it.");
+ robot.waitForIdle(delay);
+
+ } finally {
+ EventQueue.invokeAndWait(this::closeAll);
+ }
+ }
+
+ public void closeAll() {
+
+ if (frame != null) { frame.dispose(); }
+ if (dialog != null) { dialog.dispose(); }
+ if (appChildDialog != null) { appChildDialog.dispose(); }
+ if (secondFrame != null) { secondFrame.dispose(); }
+ if (secondDialog != null) { secondDialog.dispose(); }
+ if (docChildDialog != null) { docChildDialog.dispose(); }
+ if (thirdFrame != null) { thirdFrame.dispose(); }
+ }
+
+ class TopLevelFrame extends TestFrame {
+
+ @Override
+ public void doOpenAction() { secondFrame.setVisible(true); }
+ @Override
+ public void doCloseAction() { dialog.setVisible(true); }
+ }
+
+ class CustomFrame extends TestFrame {
+
+ @Override
+ public void doOpenAction() { secondDialog.setVisible(true); }
+ }
+
+ public static void main(String[] args) throws Exception {
+ (new MultipleDialogs4Test()).doTest();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/Modal/MultipleDialogs/MultipleDialogs5Test.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8054358
+ * @summary This is a simple check if a chain of dialogs having different
+ * modality types block each other properly.
+ *
+ * @library ../helpers ../../../../lib/testlibrary/
+ * @build ExtendedRobot
+ * @build Flag
+ * @build TestDialog
+ * @build TestFrame
+ * @build TestWindow
+ * @run main MultipleDialogs5Test
+ */
+
+
+import java.awt.*;
+import static jdk.testlibrary.Asserts.*;
+
+
+public class MultipleDialogs5Test {
+
+ private volatile ParentFrame parent;
+ private volatile ModalDialog appDialog, docDialog, tkDialog;
+ private volatile CustomWindow window;
+
+ private static int delay = 500;
+
+ private void createGUI() {
+
+ parent = new ParentFrame();
+ parent.setLocation(50, 50);
+ parent.setVisible(true);
+
+ appDialog = new ModalDialog(parent);
+ appDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
+ appDialog.setLocation(250, 50);
+
+ docDialog = new ModalDialog(appDialog);
+ docDialog.setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
+ docDialog.setLocation(450, 50);
+
+ window = new CustomWindow(docDialog);
+ window.setLocation(50, 250);
+
+ tkDialog = new ModalDialog(docDialog);
+ tkDialog.setLocation(250, 250);
+ tkDialog.setModalityType(Dialog.ModalityType.TOOLKIT_MODAL);
+
+ appDialog.setWindowToOpen(docDialog);
+ docDialog.setWindowToOpen(window);
+ }
+
+ public void doTest() throws Exception {
+
+ try {
+ EventQueue.invokeAndWait(this::createGUI);
+
+ ExtendedRobot robot = new ExtendedRobot();
+ robot.waitForIdle(delay);
+
+ parent.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ parent.checkBlockedFrame(robot,
+ "This Frame is blocked by an application modal dialog.");
+
+ appDialog.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ appDialog.checkBlockedDialog(robot,
+ "This Dialog is blocked by a document modal dialog.");
+
+ docDialog.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ docDialog.checkUnblockedDialog(robot,
+ "This Dialog is not blocked by any modal dialog.");
+
+ window.clickOpenButton(robot);
+ robot.waitForIdle(delay);
+
+ window.checkBlockedWindow(robot,
+ "This Window is blocked by a toolkit modal dialog.");
+
+ tkDialog.clickCloseButton(robot);
+ robot.waitForIdle(delay);
+ assertFalse(tkDialog.isVisible(),
+ "The toolkit modal dialog was not disposed.");
+
+ window.clickCloseButton(robot);
+ robot.waitForIdle(delay);
+ assertFalse(window.isVisible(),
+ "The window was not disposed.");
+
+ docDialog.clickCloseButton(robot);
+ robot.waitForIdle(delay);
+ assertFalse(docDialog.isVisible(),
+ "The document modal dialog was not disposed.");
+
+ appDialog.clickCloseButton(robot);
+ robot.waitForIdle(delay);
+ assertFalse(appDialog.isVisible(),
+ "The application modal dialog was not disposed.");
+ } finally {
+ EventQueue.invokeAndWait(this::closeAll); // if something wasn't closed
+ }
+ }
+
+ private void closeAll() {
+
+ if (appDialog != null) { appDialog.dispose(); }
+ if (tkDialog != null) { tkDialog.dispose(); }
+ if (docDialog != null) { docDialog.dispose(); }
+ if (parent != null) { parent.dispose(); }
+ if (window != null) { window.dispose(); }
+ }
+
+ private class ParentFrame extends TestFrame {
+
+ @Override
+ public void doOpenAction() {
+ if (appDialog != null) { appDialog.setVisible(true); }
+ }
+ }
+
+ private class CustomWindow extends TestWindow {
+
+ public CustomWindow(Dialog d) { super(d); }
+
+ @Override
+ public void doOpenAction() {
+ if (tkDialog != null) { tkDialog.setVisible(true); }
+ }
+
+ @Override
+ public void doCloseAction() { this.dispose(); }
+ }
+
+ private class ModalDialog extends TestDialog {
+
+ private Window w;
+
+ public ModalDialog(Frame f) { super(f); }
+ public ModalDialog(Dialog d) { super(d); }
+
+ public void setWindowToOpen(Window w) { this.w = w; }
+
+ @Override
+ public void doCloseAction() { this.dispose(); }
+
+ @Override
+ public void doOpenAction() {
+ if (w != null) { w.setVisible(true); }
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ (new MultipleDialogs5Test()).doTest();
+ }
+}
--- a/jdk/test/java/awt/regtesthelpers/Util.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/awt/regtesthelpers/Util.java Tue Jan 27 13:58:55 2015 -0500
@@ -76,12 +76,17 @@
public final class Util {
private Util() {} // this is a helper class with static methods :)
+ private volatile static Robot robot;
+
/*
* @throws RuntimeException when creation failed
*/
public static Robot createRobot() {
try {
- return new Robot();
+ if (robot == null) {
+ robot = new Robot();
+ }
+ return robot;
} catch (AWTException e) {
throw new RuntimeException("Error: unable to create robot", e);
}
@@ -200,7 +205,10 @@
return false;
}
- public static void waitForIdle(final Robot robot) {
+ public static void waitForIdle(Robot robot) {
+ if (robot == null) {
+ robot = createRobot();
+ }
robot.waitForIdle();
}
--- a/jdk/test/java/lang/Class/GenericStringTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/lang/Class/GenericStringTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,10 +34,29 @@
@ExpectedGenericString("public class GenericStringTest")
public class GenericStringTest {
- public static void main(String... args){
+ public Map<String, Integer>[] mixed = null;
+ public Map<String, Integer>[][] mixed2 = null;
+
+ public static void main(String... args) throws ReflectiveOperationException {
int failures = 0;
+ String[][] nested = {{""}};
+ int[][] intArray = {{1}};
+
failures += checkToGenericString(int.class, "int");
+ failures += checkToGenericString(void.class, "void");
+ failures += checkToGenericString(args.getClass(), "java.lang.String[]");
+ failures += checkToGenericString(nested.getClass(), "java.lang.String[][]");
+ failures += checkToGenericString(intArray.getClass(), "int[][]");
+ failures += checkToGenericString(java.util.Map.class, "public abstract interface java.util.Map<K,V>");
+
+ Field f = GenericStringTest.class.getDeclaredField("mixed");
+ // The expected value includes "<K,V>" rather than
+ // "<...String,...Integer>" since the Class object rather than
+ // Type objects is being queried.
+ failures += checkToGenericString(f.getType(), "java.util.Map<K,V>[]");
+ f = GenericStringTest.class.getDeclaredField("mixed2");
+ failures += checkToGenericString(f.getType(), "java.util.Map<K,V>[][]");
Class<?>[] types = {
GenericStringTest.class,
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ClassLoader/LibraryPathProperty.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8067951
+ * @summary Unit test for internal ClassLoader#initializePath().
+ * Quoted entries should get unquoted on Windows.
+ * Empty entries should be replaced with dot.
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.Platform
+ * @run main LibraryPathProperty
+ */
+
+import java.lang.reflect.Method;
+import java.io.File;
+import java.util.Arrays;
+import jdk.testlibrary.Platform;
+
+public class LibraryPathProperty {
+
+ static final String propName = "test.property.name";
+ static final String SP = File.pathSeparator;
+ static Method method;
+
+ public static void main(String[] args) throws Throwable {
+ method = ClassLoader.class
+ .getDeclaredMethod("initializePath",
+ String.class);
+ method.setAccessible(true);
+
+ test("", ".");
+ test(SP, ".", ".");
+ test("a" + SP, "a", ".");
+ test(SP + "b", ".", "b");
+ test("a" + SP + SP + "b", "a", ".", "b");
+
+ if (Platform.isWindows()) {
+ // on Windows parts of paths may be quoted
+ test("\"\"", ".");
+ test("\"\"" + SP, ".", ".");
+ test(SP + "\"\"", ".", ".");
+ test("a" + SP + "\"b\"" + SP, "a", "b", ".");
+ test(SP + "\"a\"" + SP + SP + "b", ".", "a", ".", "b");
+ test("\"a\"" + SP + "\"b\"", "a", "b");
+ test("\"/a/\"b" + SP + "c", "/a/b", "c");
+ test("\"/a;b\"" + SP + "c", "/a;b", "c");
+ test("\"/a:b\"" + SP + "c", "/a:b", "c");
+ test("\"/a" + SP + "b\"" + SP + "c", "/a" + SP + "b", "c");
+ test("/\"a\"\";\"\"b\"" + SP + "\"c\"", "/a;b", "c");
+ test("/\"a:\"b" + SP + "c", "/a:b", "c");
+ }
+ }
+
+ static void test(String s, String... expected) throws Throwable {
+ System.setProperty(propName, s);
+ String[] res = (String[])method.invoke(null, propName);
+ if (!Arrays.asList(res).equals(Arrays.asList(expected))) {
+ throw new RuntimeException("Parsing [" + s + "] " +
+ " result " + Arrays.asList(res) +
+ " doesn't match " + Arrays.asList(expected));
+ }
+ }
+}
--- a/jdk/test/java/lang/instrument/IsModifiableClassAgent.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/lang/instrument/IsModifiableClassAgent.java Tue Jan 27 13:58:55 2015 -0500
@@ -23,6 +23,7 @@
/**
* @test
+ * @ignore JDK-8068162
* @bug 6331574
* @summary test isModifiableClass
* @author Robert Field, Sun Microsystems
--- a/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -30,11 +30,13 @@
* @build TestMethods
* @build LambdaFormTestCase
* @build LFGarbageCollectedTest
- * @run main/othervm LFGarbageCollectedTest
+ * @run main/othervm -Xmx64m -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+HeapDumpOnOutOfMemoryError -DHEAP_DUMP=false LFGarbageCollectedTest
*/
import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodType;
import java.lang.ref.PhantomReference;
+import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.reflect.InvocationTargetException;
import java.util.EnumSet;
@@ -44,6 +46,7 @@
* Lambda forms garbage collection test class.
*/
public final class LFGarbageCollectedTest extends LambdaFormTestCase {
+ private static boolean HEAP_DUMP = Boolean.getBoolean("HEAP_DUMP");
/**
* Constructor for a lambda forms garbage collection test case.
@@ -55,37 +58,86 @@
super(testMethod);
}
+ PhantomReference ph;
+ ReferenceQueue rq = new ReferenceQueue();
+ MethodType mtype;
+ Map<String, Object> data;
+
@Override
public void doTest() {
try {
- Map<String, Object> data = getTestMethod().getTestCaseData();
+ TestMethods testCase = getTestMethod();
+ data = testCase.getTestCaseData();
MethodHandle adapter;
try {
- adapter = getTestMethod().getTestCaseMH(data, TestMethods.Kind.ONE);
+ adapter = testCase.getTestCaseMH(data, TestMethods.Kind.ONE);
} catch (NoSuchMethodException ex) {
throw new Error("Unexpected exception: ", ex);
}
- Object lambdaForm = LambdaFormTestCase.INTERNAL_FORM.invoke(adapter);
+ mtype = adapter.type();
+ Object lambdaForm = INTERNAL_FORM.invoke(adapter);
if (lambdaForm == null) {
throw new Error("Unexpected error: Lambda form of the method handle is null");
}
- ReferenceQueue rq = new ReferenceQueue();
- PhantomReference ph = new PhantomReference(lambdaForm, rq);
+
+ String debugName = (String)DEBUG_NAME.get(lambdaForm);
+ if (debugName != null && debugName.startsWith("identity_")) {
+ // Ignore identity_* LambdaForms.
+ return;
+ }
+
+ ph = new PhantomReference(lambdaForm, rq);
lambdaForm = null;
- data = null;
adapter = null;
- for (int i = 0; i < 1000 && !ph.isEnqueued(); i++) {
- System.gc();
- }
- if (!ph.isEnqueued()) {
- throw new AssertionError("Error: Lambda form is not garbage collected");
- }
+
+ collectLambdaForm();
} catch (IllegalAccessException | IllegalArgumentException |
InvocationTargetException ex) {
throw new Error("Unexpected exception: ", ex);
}
}
+
+ private void collectLambdaForm() throws IllegalAccessException {
+ // Usually, 2 System.GCs are necessary to enqueue a SoftReference.
+ System.gc();
+ System.gc();
+
+ Reference ref = null;
+ for (int i = 0; i < 10; i++) {
+ try {
+ ref = rq.remove(1000);
+ } catch (InterruptedException e) {
+ /* ignore */
+ }
+ if (ref != null) {
+ break;
+ }
+ System.gc(); // If the reference hasn't been queued yet, trigger one more GC.
+ }
+
+ if (ref == null) {
+ dumpTestData();
+ System.err.println("Method type: " + mtype);
+ System.err.println("LambdaForm: " + REF_FIELD.get(ph));
+
+ if (HEAP_DUMP) {
+ // Trigger OOM to force heap dump for post-mortem analysis.
+ val = new long[1_000_000_000];
+ }
+ throw new AssertionError("Error: LambdaForm is not garbage collected");
+ };
+ }
+
+ private void dumpTestData() {
+ System.err.println("Test case: " + getTestMethod());
+ for (String s : data.keySet()) {
+ System.err.printf("\t%20s => %s\n", s, data.get(s));
+ }
+ }
+
+ private static long[] val;
+
/**
* Main routine for lambda forms garbage collection test.
*
@@ -101,7 +153,9 @@
TestMethods.IDENTITY,
TestMethods.CONSTANT,
TestMethods.ARRAY_ELEMENT_GETTER,
- TestMethods.ARRAY_ELEMENT_SETTER));
+ TestMethods.ARRAY_ELEMENT_SETTER,
+ TestMethods.EXACT_INVOKER,
+ TestMethods.INVOKER));
LambdaFormTestCase.runTests(LFGarbageCollectedTest::new, testMethods);
}
}
--- a/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java Tue Jan 27 13:58:55 2015 -0500
@@ -23,9 +23,11 @@
import com.oracle.testlibrary.jsr292.Helper;
import com.sun.management.HotSpotDiagnosticMXBean;
-
+import java.lang.invoke.MethodHandle;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
+import java.lang.ref.Reference;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
@@ -42,8 +44,6 @@
*/
public abstract class LambdaFormTestCase {
- private final static String METHOD_HANDLE_CLASS_NAME = "java.lang.invoke.MethodHandle";
- private final static String INTERNAL_FORM_METHOD_NAME = "internalForm";
private static final double ITERATIONS_TO_CODE_CACHE_SIZE_RATIO
= 45 / (128.0 * 1024 * 1024);
private static final long TIMEOUT = Helper.IS_THOROUGH ? 0L : (long) (Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT) * 0.9);
@@ -53,6 +53,8 @@
* used to get a lambda form from a method handle.
*/
protected final static Method INTERNAL_FORM;
+ protected final static Field DEBUG_NAME;
+ protected final static Field REF_FIELD;
private static final List<GarbageCollectorMXBean> gcInfo;
private static long gcCount() {
@@ -61,9 +63,14 @@
static {
try {
- Class mhClass = Class.forName(METHOD_HANDLE_CLASS_NAME);
- INTERNAL_FORM = mhClass.getDeclaredMethod(INTERNAL_FORM_METHOD_NAME);
+ INTERNAL_FORM = MethodHandle.class.getDeclaredMethod("internalForm");
INTERNAL_FORM.setAccessible(true);
+
+ DEBUG_NAME = Class.forName("java.lang.invoke.LambdaForm").getDeclaredField("debugName");
+ DEBUG_NAME.setAccessible(true);
+
+ REF_FIELD = Reference.class.getDeclaredField("referent");
+ REF_FIELD.setAccessible(true);
} catch (Exception ex) {
throw new Error("Unexpected exception: ", ex);
}
@@ -138,6 +145,10 @@
testCase.getTestMethod().name);
testCase.doTest();
System.err.println("PASSED");
+ } catch (OutOfMemoryError e) {
+ // Don't swallow OOME so a heap dump can be created.
+ System.err.println("FAILED");
+ throw e;
} catch (Throwable t) {
t.printStackTrace();
System.err.printf("FAILED. Caused by %s%n", t.getMessage());
--- a/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -32,6 +32,7 @@
*
* @library /lib/testlibrary/
* @build jdk.testlibrary.* CollectionUsageThreshold MemoryUtil RunUtil
+ * @requires vm.opt.ExplicitGCInvokesConcurrent == "false" | vm.opt.ExplicitGCInvokesConcurrent == "null"
* @run main/timeout=300 CollectionUsageThreshold
*/
--- a/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/lang/management/MemoryMXBean/LowMemoryTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -32,16 +32,18 @@
*
* @library /lib/testlibrary/
* @build jdk.testlibrary.* LowMemoryTest MemoryUtil RunUtil
+ * @requires vm.opt.ExplicitGCInvokesConcurrent == "false" | vm.opt.ExplicitGCInvokesConcurrent == "null"
* @run main/timeout=600 LowMemoryTest
+ * @requires vm.opt.ExplicitGCInvokesConcurrent != "true"
+ * @requires vm.opt.ExplicitGCInvokesConcurrentAndUnloadsClasses != "true"
+ * @requires vm.opt.DisableExplicitGC != "true"
*/
-import com.sun.management.DiagnosticCommandMBean;
import java.lang.management.*;
import java.util.*;
import java.util.concurrent.Phaser;
import javax.management.*;
import javax.management.openmbean.CompositeData;
-import sun.management.ManagementFactoryHelper;
public class LowMemoryTest {
private static final MemoryMXBean mm = ManagementFactory.getMemoryMXBean();
--- a/jdk/test/java/net/DatagramSocket/InheritHandle.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/net/DatagramSocket/InheritHandle.java Tue Jan 27 13:58:55 2015 -0500
@@ -22,27 +22,51 @@
*/
/* @test
- * @bug 4945514
+ * @bug 4945514 8042581
* @summary DatagramSocket should make handle not inherited
*/
-import java.net.*;
+import java.net.BindException;
+import java.net.DatagramSocket;
+import java.net.InetSocketAddress;
public class InheritHandle {
+ private static final long SLEEPTIME_MS = 1000L;
+
public static void main(String[] args) throws Exception {
- DatagramSocket sock = new DatagramSocket (0);
- sock.setReuseAddress(true);
- int port = sock.getLocalPort();
+ int port;
+ try (DatagramSocket sock = new DatagramSocket(0);) {
+ sock.setReuseAddress(true);
+ port = sock.getLocalPort();
+
+ /**
+ * spawn a child to check whether handle passed to it or not; it
+ * shouldn't
+ */
+ Runtime.getRuntime().exec("sleep 10");
+ }
- /**
- * spawn a child to check whether handle passed to it or not;
- * it shouldn't
- */
- Runtime.getRuntime().exec ("sleep 10");
+ try (DatagramSocket sock = new DatagramSocket(null);) {
+ sock.setReuseAddress(true);
+ int retries = 0;
+ boolean isWindows = System.getProperty("os.name").startsWith("Windows");
+ InetSocketAddress addr = new InetSocketAddress(port);
+ while (true) {
+ try {
+ sock.bind(addr);
+ break;
+ } catch (BindException e) {
+ if (isWindows && retries++ < 5) {
+ Thread.sleep(SLEEPTIME_MS);
+ System.out.println("BindException \"" + e.getMessage() + "\", retrying...");
+ continue;
+ } else {
+ throw e;
+ }
+ }
+ }
- sock.close();
- sock = new DatagramSocket (null);
- sock.setReuseAddress(true);
- sock.bind(new InetSocketAddress(port));
+ }
}
}
+
--- a/jdk/test/java/net/URI/Test.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/java/net/URI/Test.java Tue Jan 27 13:58:55 2015 -0500
@@ -24,7 +24,7 @@
/* @test
* @summary Unit test for java.net.URI
* @bug 4464135 4505046 4503239 4438319 4991359 4866303 7023363 7041800
- * 7171415
+ * 7171415 6933879
* @author Mark Reinhold
*/
@@ -1600,6 +1600,7 @@
static void bugs() {
b6339649();
+ b6933879();
b8037396();
}
@@ -1614,6 +1615,18 @@
}
}
+ // 6933879 - check that "." and "_" characters are allowed in IPv6 scope_id.
+ private static void b6933879() {
+ final String HOST = "fe80::c00:16fe:cebe:3214%eth1.12_55";
+ URI uri;
+ try {
+ uri = new URI("http", null, HOST, 10, "/", null, null);
+ } catch (URISyntaxException ex) {
+ throw new AssertionError("Should not happen", ex);
+ }
+ eq("[" + HOST + "]", uri.getHost());
+ }
+
private static void b8037396() {
// primary checks:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/Hashtable/DeserializedLength.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.*;
+import java.lang.reflect.Field;
+import java.util.Hashtable;
+
+/**
+ * @test
+ * @bug 8068427
+ * @summary Hashtable deserialization reconstitutes table with wrong capacity
+ */
+public class DeserializedLength {
+
+ static boolean testDeserializedLength(int elements, float loadFactor) throws Exception {
+
+ // construct Hashtable with minimal initial capacity and given loadFactor
+ Hashtable<Integer, Integer> ht1 = new Hashtable<>(1, loadFactor);
+
+ // add given number of unique elements
+ for (int i = 0; i < elements; i++) {
+ ht1.put(i, i);
+ }
+
+ // serialize and deserialize into a deep clone
+ Hashtable<Integer, Integer> ht2 = serialClone(ht1);
+
+ // compare lengths of internal tables
+ Object[] table1 = (Object[]) hashtableTableField.get(ht1);
+ Object[] table2 = (Object[]) hashtableTableField.get(ht2);
+ assert table1 != null;
+ assert table2 != null;
+
+ int minLength = (int) (ht1.size() / loadFactor) + 1;
+ int maxLength = minLength * 2;
+
+ boolean ok = (table2.length >= minLength && table2.length <= maxLength);
+
+ System.out.printf(
+ "%7d %5.2f %7d %7d %7d...%7d %s\n",
+ ht1.size(), loadFactor,
+ table1.length, table2.length,
+ minLength, maxLength,
+ (ok ? "OK" : "NOT-OK")
+ );
+
+ return ok;
+ }
+
+ static <T> T serialClone(T o) throws IOException, ClassNotFoundException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ try (ObjectOutputStream oos = new ObjectOutputStream(bos)) {
+ oos.writeObject(o);
+ }
+ @SuppressWarnings("unchecked")
+ T clone = (T) new ObjectInputStream(
+ new ByteArrayInputStream(bos.toByteArray())).readObject();
+ return clone;
+ }
+
+ private static final Field hashtableTableField;
+
+ static {
+ try {
+ hashtableTableField = Hashtable.class.getDeclaredField("table");
+ hashtableTableField.setAccessible(true);
+ } catch (NoSuchFieldException e) {
+ throw new Error(e);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ boolean ok = true;
+
+ System.out.printf("Results:\n" +
+ " ser. deser.\n" +
+ " size load lentgh length valid range ok?\n" +
+ "------- ----- ------- ------- ----------------- ------\n"
+ );
+
+ for (int elements : new int[]{10, 50, 500, 5000}) {
+ for (float loadFactor : new float[]{0.15f, 0.5f, 0.75f, 1.0f, 2.5f}) {
+ ok &= testDeserializedLength(elements, loadFactor);
+ }
+ }
+ if (!ok) {
+ throw new AssertionError("Test failed.");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/concurrent/CompletableFuture/ThenComposeExceptionTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+
+
+/**
+ * @test
+ * @bug 8068432
+ * @run testng ThenComposeExceptionTest
+ * @summary Test that CompletableFuture.thenCompose works correctly if the
+ * composing future completes exceptionally
+ */
+@Test
+public class ThenComposeExceptionTest {
+
+ static final BiFunction<CompletableFuture<String>, CompletableFuture<String>, CompletableFuture<String>>
+ THEN_COMPOSE = (f, fe) -> f.thenCompose(s -> fe);
+
+ static final BiFunction<CompletableFuture<String>, CompletableFuture<String>, CompletableFuture<String>>
+ THEN_COMPOSE_ASYNC = (f, fe) -> f.thenComposeAsync(s -> fe);
+
+ static final Consumer<CompletableFuture<String>>
+ COMPLETE_EXCEPTIONALLY = f -> f.completeExceptionally(new RuntimeException());
+
+ static final Consumer<CompletableFuture<String>>
+ NOP = f -> { };
+
+ static Object[][] actionsDataProvider;
+
+ @DataProvider(name = "actions")
+ static Object[][] actionsDataProvider() {
+ if (actionsDataProvider != null) {
+ return actionsDataProvider;
+ }
+
+ List<Object[]> data = new ArrayList<>();
+ data.add(new Object[]{"thenCompose and completeExceptionally", NOP, THEN_COMPOSE, COMPLETE_EXCEPTIONALLY});
+ data.add(new Object[]{"thenComposeAsync and completeExceptionally", NOP, THEN_COMPOSE_ASYNC, COMPLETE_EXCEPTIONALLY});
+ data.add(new Object[]{"completeExceptionally and thenCompose", COMPLETE_EXCEPTIONALLY, THEN_COMPOSE, NOP});
+ data.add(new Object[]{"completeExceptionally and thenComposeAsync", COMPLETE_EXCEPTIONALLY, THEN_COMPOSE_ASYNC, NOP});
+
+ return actionsDataProvider = data.toArray(new Object[0][]);
+ }
+
+ @Test(dataProvider = "actions")
+ public void testThenCompose(
+ String description,
+ Consumer<CompletableFuture<String>> beforeAction,
+ BiFunction<CompletableFuture<String>, CompletableFuture<String>, CompletableFuture<String>> composeFunction,
+ Consumer<CompletableFuture<String>> afterAction) throws Exception {
+ CompletableFuture<String> f = new CompletableFuture<>();
+ CompletableFuture<String> fe = new CompletableFuture<>();
+
+ // Ensure pre-composed stage is completed to trigger
+ // processing the composing future
+ f.complete("");
+
+ beforeAction.accept(fe);
+
+ CompletableFuture<String> f_thenCompose = composeFunction.apply(f, fe);
+ Assert.assertNotSame(f_thenCompose, fe, "Composed CompletableFuture returned directly");
+
+ AtomicReference<Throwable> eOnWhenComplete = new AtomicReference<>();
+ f_thenCompose.whenComplete((r, e) -> eOnWhenComplete.set(e));
+
+ afterAction.accept(fe);
+
+ Throwable eOnJoined = null;
+ try {
+ f_thenCompose.join();
+ }
+ catch (Throwable t) {
+ eOnJoined = t;
+ }
+
+ Assert.assertTrue(eOnWhenComplete.get() instanceof CompletionException,
+ "Incorrect exception reported on whenComplete");
+ Assert.assertTrue(eOnJoined instanceof CompletionException,
+ "Incorrect exception reported when joined");
+ }
+}
--- a/jdk/test/java/util/logging/AnonLoggerWeakRefLeak.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-/*
- * 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.util.logging.*;
-
-public class AnonLoggerWeakRefLeak extends SimpleApplication {
- // The test driver script will allow this program to run until we
- // reach DEFAULT_LOOP_TIME or a decrease in instance counts is
- // observed. For this particular WeakReference leak, the count
- // was always observed to be increasing so if we get a decreasing
- // count, then the leak is fixed in the bits being tested.
- // Two minutes has been enough time to observe a decrease in
- // fixed bits on overloaded systems, but the test will likely
- // finish more quickly.
- public static int DEFAULT_LOOP_TIME = 120; // time is in seconds
-
- // execute the AnonLoggerWeakRefLeak app work
- public void doMyAppWork(String[] args) throws Exception {
- int loop_time = 0;
- int max_loop_time = DEFAULT_LOOP_TIME;
-
- // args[0] is the port-file
- if (args.length < 2) {
- System.out.println("INFO: using default time of "
- + max_loop_time + " seconds.");
- } else {
- try {
- max_loop_time = Integer.parseInt(args[1]);
- } catch (NumberFormatException nfe) {
- throw new RuntimeException("Error: '" + args[1]
- + "': is not a valid seconds value.");
- }
- }
-
- long count = 0;
- long now = 0;
- long startTime = System.currentTimeMillis();
-
- while (now < (startTime + (max_loop_time * 1000))) {
- if ((count % 1000) == 0) {
- // Print initial call count to let caller know that
- // we're up and running and then periodically
- System.out.println("INFO: call count = " + count);
- }
-
- for (int i = 0; i < 100; i++) {
- // this Logger call is leaking a WeakReference in Logger.kids
- java.util.logging.Logger.getAnonymousLogger();
- count++;
- }
-
- try {
- // delay for 1/10 of a second to avoid CPU saturation
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- // ignore any exceptions
- }
-
- now = System.currentTimeMillis();
- }
-
- System.out.println("INFO: final loop count = " + count);
- }
-
- public static void main(String[] args) throws Exception {
- AnonLoggerWeakRefLeak myApp = new AnonLoggerWeakRefLeak();
-
- SimpleApplication.setMyApp(myApp);
-
- SimpleApplication.main(args);
- }
-}
--- a/jdk/test/java/util/logging/AnonLoggerWeakRefLeak.sh Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-#!/bin/sh
-
-#
-# 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.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-# @test
-# @bug 6942989
-# @summary Check for WeakReference leak in anonymous Logger objects
-# @author Daniel D. Daugherty
-#
-# @library ../../../sun/tools/common
-# @build SimpleApplication ShutdownSimpleApplication
-# @build AnonLoggerWeakRefLeak
-# @run shell/timeout=240 AnonLoggerWeakRefLeak.sh
-
-# The timeout is: 2 minutes for infrastructure and 2 minutes for the test
-#
-
-. ${TESTSRC}/../../../sun/tools/common/CommonSetup.sh
-. ${TESTSRC}/../../../sun/tools/common/ApplicationSetup.sh
-
-
-TEST_NAME="AnonLoggerWeakRefLeak"
-TARGET_CLASS="java\.lang\.ref\.WeakReference"
-
-
-# MAIN begins here
-#
-
-seconds=
-if [ "$#" -gt 0 ]; then
- seconds="$1"
-fi
-
-# see if this version of jmap supports the '-histo:live' option
-jmap_option="-histo:live"
-set +e
-"${JMAP}" 2>&1 | grep ':live' > /dev/null 2>&1
-status="$?"
-set -e
-if [ "$status" != 0 ]; then
- # usage message doesn't show ':live' option
-
- if $isWindows; then
- # If SA isn't present, then jmap gives a different usage message
- # that doesn't show the ':live' option. However, that's a bug that
- # is covered by 6971851 so we try using the option just to be sure.
- # For some reason, this problem has only been seen on OpenJDK6 on
- # Windows. Not sure why.
- set +e
- # Note: Don't copy this code to try probing process 0 on Linux; it
- # will kill the process group in strange ways.
- "${JMAP}" "$jmap_option" 0 2>&1 | grep 'Usage' > /dev/null 2>&1
- status="$?"
- set -e
- if [ "$status" = 0 ]; then
- # Usage message generated so flag the problem.
- status=1
- else
- # No usage message so clear the flag.
- status=0
- fi
- fi
-
- if [ "$status" != 0 ]; then
- echo "WARNING: 'jmap $jmap_option' is not supported on this platform"
- echo "WARNING: so this test cannot work reliably. Aborting!"
- exit 0
- fi
-fi
-
-# Start application and use TEST_NAME.port for coordination
-startApplication "$TEST_NAME" "$TEST_NAME.port" $seconds
-
-finished_early=false
-
-decreasing_cnt=0
-increasing_cnt=0
-loop_cnt=0
-prev_instance_cnt=0
-
-MAX_JMAP_TRY_CNT=10
-jmap_retry_cnt=0
-loop_cnt_on_retry=0
-
-while true; do
- # see if the target process has finished its run and bail if it has
- set +e
- grep "^INFO: final loop count = " "$appOutput" > /dev/null 2>&1
- status="$?"
- set -e
- if [ "$status" = 0 ]; then
- break
- fi
-
- # Output format for 'jmap -histo' in JDK1.5.0:
- #
- # <#bytes> <#instances> <class_name>
- #
- # Output format for 'jmap -histo:live':
- #
- # <num>: <#instances> <#bytes> <class_name>
- #
- set +e
- "${JMAP}" "$jmap_option" "$appJavaPid" > "$TEST_NAME.jmap" 2>&1
- status="$?"
- set -e
-
- if [ "$status" != 0 ]; then
- echo "INFO: jmap exited with exit code = $status"
-
- # There are intermittent jmap failures; see 6498448.
- #
- # So far the following have been observed in a jmap call
- # that was not in a race with target process termination:
- #
- # (Solaris specific, 2nd sample)
- # <pid>: Unable to open door: target process not responding or HotSpot VM not loaded
- # The -F option can be used when the target process is not responding
- #
- # (on Solaris so far)
- # java.io.IOException
- #
- # (on Solaris so far, 1st sample)
- # <pid>: Permission denied
- #
- sed 's/^/INFO: /' "$TEST_NAME.jmap"
-
- if [ "$loop_cnt" = "$loop_cnt_on_retry" ]; then
- # loop count hasn't changed
- jmap_retry_cnt=`expr $jmap_retry_cnt + 1`
- else
- # loop count has changed so remember it
- jmap_retry_cnt=1
- loop_cnt_on_retry="$loop_cnt"
- fi
-
- # This is '-ge' because we have the original attempt plus
- # MAX_JMAP_TRY_CNT - 1 retries.
- if [ "$jmap_retry_cnt" -ge "$MAX_JMAP_TRY_CNT" ]; then
- echo "INFO: jmap failed $MAX_JMAP_TRY_CNT times in a row" \
- "without making any progress."
- echo "FAIL: jmap is unable to take any samples." >&2
- killApplication
- exit 2
- fi
-
- # short delay and try again
- # Note: sleep 1 didn't help with "<pid>: Permission denied"
- sleep 2
- echo "INFO: retrying jmap (retry=$jmap_retry_cnt, loop=$loop_cnt)."
- continue
- fi
-
- set +e
- instance_cnt=`grep "${PATTERN_WS}${TARGET_CLASS}${PATTERN_EOL}" \
- "$TEST_NAME.jmap" \
- | sed '
- # strip leading whitespace; does nothing in JDK1.5.0
- s/^'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip <#bytes> in JDK1.5.0; does nothing otherwise
- s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip <num>: field; does nothing in JDK1.5.0
- s/^[1-9][0-9]*:'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip <class_name> field
- s/'"${PATTERN_WS}"'.*//
- '`
- set -e
- if [ -z "$instance_cnt" ]; then
- echo "INFO: instance count is unexpectedly empty"
- if [ "$loop_cnt" = 0 ]; then
- echo "INFO: on the first iteration so no sample was found."
- echo "INFO: There is likely a problem with the sed filter."
- echo "INFO: start of jmap output:"
- cat "$TEST_NAME.jmap"
- echo "INFO: end of jmap output."
- echo "FAIL: cannot find the instance count value." >&2
- killApplication
- exit 2
- fi
- else
- echo "INFO: instance_cnt = $instance_cnt"
-
- if [ "$instance_cnt" -gt "$prev_instance_cnt" ]; then
- increasing_cnt=`expr $increasing_cnt + 1`
- else
- # actually decreasing or the same
- decreasing_cnt=`expr $decreasing_cnt + 1`
-
- # For this particular WeakReference leak, the count was
- # always observed to be increasing so if we get a decreasing
- # or the same count, then the leak is fixed in the bits
- # being tested.
- echo "INFO: finishing early due to non-increasing instance count."
- finished_early=true
- killApplication
- break
- fi
- prev_instance_cnt="$instance_cnt"
- fi
-
- # delay between samples
- sleep 5
-
- loop_cnt=`expr $loop_cnt + 1`
-done
-
-if [ $finished_early = false ]; then
- stopApplication "$TEST_NAME.port"
- waitForApplication
-fi
-
-echo "INFO: $TEST_NAME has finished running."
-echo "INFO: increasing_cnt = $increasing_cnt"
-echo "INFO: decreasing_cnt = $decreasing_cnt"
-if [ "$jmap_retry_cnt" -gt 0 ]; then
- echo "INFO: jmap_retry_cnt = $jmap_retry_cnt (in $loop_cnt iterations)"
-fi
-
-if [ "$loop_cnt" = 0 ]; then
- echo "FAIL: jmap is unable to take any samples." >&2
- exit 2
-fi
-
-echo "INFO: The instance count of" `eval echo $TARGET_CLASS` "objects"
-if [ "$decreasing_cnt" = 0 ]; then
- echo "INFO: is always increasing."
- echo "FAIL: This indicates that there is a memory leak." >&2
- exit 2
-fi
-
-echo "INFO: is not always increasing."
-echo "PASS: This indicates that there is not a memory leak."
-exit 0
--- a/jdk/test/java/util/logging/LoggerWeakRefLeak.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-/*
- * 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.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.util.logging.*;
-
-public class LoggerWeakRefLeak extends SimpleApplication {
- // The test driver script will allow this program to run until we
- // reach DEFAULT_LOOP_TIME or a decrease in instance counts is
- // observed. For these particular WeakReference leaks, the count
- // was always observed to be increasing so if we get a decreasing
- // count, then the leaks are fixed in the bits being tested.
- // Two minutes has been enough time to observe a decrease in
- // fixed bits on overloaded systems, but the test will likely
- // finish more quickly.
- public static int DEFAULT_LOOP_TIME = 120; // time is in seconds
-
- // execute the LoggerWeakRefLeak app work
- public void doMyAppWork(String[] args) throws Exception {
- int loop_time = 0;
- int max_loop_time = DEFAULT_LOOP_TIME;
-
- // args[0] is the port-file
- if (args.length < 2) {
- System.out.println("INFO: using default time of "
- + max_loop_time + " seconds.");
- } else {
- try {
- max_loop_time = Integer.parseInt(args[1]);
- } catch (NumberFormatException nfe) {
- throw new RuntimeException("Error: '" + args[1]
- + "': is not a valid seconds value.");
- }
- }
-
- long count = 0;
- int loggerCount = 0;
- long now = 0;
- long startTime = System.currentTimeMillis();
-
- while (now < (startTime + (max_loop_time * 1000))) {
- if ((count % 1000) == 0) {
- // Print initial call count to let caller know that
- // we're up and running and then periodically
- System.out.println("INFO: call count = " + count);
- }
-
- for (int i = 0; i < 100; i++) {
- // This Logger call is leaking two different WeakReferences:
- // - one in LogManager.LogNode
- // - one in Logger.kids
- java.util.logging.Logger.getLogger("logger-" + loggerCount);
- count++;
- if (++loggerCount >= 25000) {
- // Limit the Logger namespace used by the test so
- // the weak refs in LogManager.loggers that are
- // being properly managed don't skew the counts
- // by too much.
- loggerCount = 0;
- }
- }
-
- try {
- // delay for 1/10 of a second to avoid CPU saturation
- Thread.sleep(100);
- } catch (InterruptedException ie) {
- // ignore any exceptions
- }
-
- now = System.currentTimeMillis();
- }
-
- System.out.println("INFO: final loop count = " + count);
- }
-
- public static void main(String[] args) throws Exception {
- AnonLoggerWeakRefLeak myApp = new AnonLoggerWeakRefLeak();
-
- SimpleApplication.setMyApp(myApp);
-
- SimpleApplication.main(args);
- }
-}
--- a/jdk/test/java/util/logging/LoggerWeakRefLeak.sh Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-#!/bin/sh
-
-#
-# 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.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-# @test
-# @bug 6942989
-# @summary Check for WeakReference leak in Logger objects
-# @author Daniel D. Daugherty
-#
-# @library ../../../sun/tools/common
-# @build SimpleApplication ShutdownSimpleApplication
-# @build LoggerWeakRefLeak
-# @run shell/timeout=240 LoggerWeakRefLeak.sh
-
-# The timeout is: 2 minutes for infrastructure and 2 minutes for the test
-#
-
-. ${TESTSRC}/../../../sun/tools/common/CommonSetup.sh
-. ${TESTSRC}/../../../sun/tools/common/ApplicationSetup.sh
-
-
-TEST_NAME="LoggerWeakRefLeak"
-TARGET_CLASS="java\.lang\.ref\.WeakReference"
-
-
-# MAIN begins here
-#
-
-seconds=
-if [ "$#" -gt 0 ]; then
- seconds="$1"
-fi
-
-# see if this version of jmap supports the '-histo:live' option
-jmap_option="-histo:live"
-set +e
-"${JMAP}" 2>&1 | grep ':live' > /dev/null 2>&1
-status="$?"
-set -e
-if [ "$status" != 0 ]; then
- # usage message doesn't show ':live' option
-
- if $isWindows; then
- # If SA isn't present, then jmap gives a different usage message
- # that doesn't show the ':live' option. However, that's a bug that
- # is covered by 6971851 so we try using the option just to be sure.
- # For some reason, this problem has only been seen on OpenJDK6 on
- # Windows. Not sure why.
- set +e
- # Note: Don't copy this code to try probing process 0 on Linux; it
- # will kill the process group in strange ways.
- "${JMAP}" "$jmap_option" 0 2>&1 | grep 'Usage' > /dev/null 2>&1
- status="$?"
- set -e
- if [ "$status" = 0 ]; then
- # Usage message generated so flag the problem.
- status=1
- else
- # No usage message so clear the flag.
- status=0
- fi
- fi
-
- if [ "$status" != 0 ]; then
- echo "WARNING: 'jmap $jmap_option' is not supported on this platform"
- echo "WARNING: so this test cannot work reliably. Aborting!"
- exit 0
- fi
-fi
-
-# Start application and use TEST_NAME.port for coordination
-startApplication "$TEST_NAME" "$TEST_NAME.port" $seconds
-
-finished_early=false
-
-decreasing_cnt=0
-increasing_cnt=0
-loop_cnt=0
-prev_instance_cnt=0
-
-MAX_JMAP_TRY_CNT=10
-jmap_retry_cnt=0
-loop_cnt_on_retry=0
-
-while true; do
- # see if the target process has finished its run and bail if it has
- set +e
- grep "^INFO: final loop count = " "$appOutput" > /dev/null 2>&1
- status="$?"
- set -e
- if [ "$status" = 0 ]; then
- break
- fi
-
- # Output format for 'jmap -histo' in JDK1.5.0:
- #
- # <#bytes> <#instances> <class_name>
- #
- # Output format for 'jmap -histo:live':
- #
- # <num>: <#instances> <#bytes> <class_name>
- #
- set +e
- "${JMAP}" "$jmap_option" "$appJavaPid" > "$TEST_NAME.jmap" 2>&1
- status="$?"
- set -e
-
- if [ "$status" != 0 ]; then
- echo "INFO: jmap exited with exit code = $status"
-
- # There are intermittent jmap failures; see 6498448.
- #
- # So far the following have been observed in a jmap call
- # that was not in a race with target process termination:
- #
- # (Solaris specific, 2nd sample)
- # <pid>: Unable to open door: target process not responding or HotSpot VM not loaded
- # The -F option can be used when the target process is not responding
- #
- # (on Solaris so far)
- # java.io.IOException
- #
- # (on Solaris so far, 1st sample)
- # <pid>: Permission denied
- #
- sed 's/^/INFO: /' "$TEST_NAME.jmap"
-
- if [ "$loop_cnt" = "$loop_cnt_on_retry" ]; then
- # loop count hasn't changed
- jmap_retry_cnt=`expr $jmap_retry_cnt + 1`
- else
- # loop count has changed so remember it
- jmap_retry_cnt=1
- loop_cnt_on_retry="$loop_cnt"
- fi
-
- # This is '-ge' because we have the original attempt plus
- # MAX_JMAP_TRY_CNT - 1 retries.
- if [ "$jmap_retry_cnt" -ge "$MAX_JMAP_TRY_CNT" ]; then
- echo "INFO: jmap failed $MAX_JMAP_TRY_CNT times in a row" \
- "without making any progress."
- echo "FAIL: jmap is unable to take any samples." >&2
- killApplication
- exit 2
- fi
-
- # short delay and try again
- # Note: sleep 1 didn't help with "<pid>: Permission denied"
- sleep 2
- echo "INFO: retrying jmap (retry=$jmap_retry_cnt, loop=$loop_cnt)."
- continue
- fi
-
- set +e
- instance_cnt=`grep "${PATTERN_WS}${TARGET_CLASS}${PATTERN_EOL}" \
- "$TEST_NAME.jmap" \
- | sed '
- # strip leading whitespace; does nothing in JDK1.5.0
- s/^'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip <#bytes> in JDK1.5.0; does nothing otherwise
- s/^[1-9][0-9]*'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip <num>: field; does nothing in JDK1.5.0
- s/^[1-9][0-9]*:'"${PATTERN_WS}${PATTERN_WS}"'*//
- # strip <class_name> field
- s/'"${PATTERN_WS}"'.*//
- '`
- set -e
- if [ -z "$instance_cnt" ]; then
- echo "INFO: instance count is unexpectedly empty"
- if [ "$loop_cnt" = 0 ]; then
- echo "INFO: on the first iteration so no sample was found."
- echo "INFO: There is likely a problem with the sed filter."
- echo "INFO: start of jmap output:"
- cat "$TEST_NAME.jmap"
- echo "INFO: end of jmap output."
- echo "FAIL: cannot find the instance count value." >&2
- killApplication
- exit 2
- fi
- else
- echo "INFO: instance_cnt = $instance_cnt"
-
- if [ "$instance_cnt" -gt "$prev_instance_cnt" ]; then
- increasing_cnt=`expr $increasing_cnt + 1`
- else
- # actually decreasing or the same
- decreasing_cnt=`expr $decreasing_cnt + 1`
-
- # For these particular WeakReference leaks, the count was
- # always observed to be increasing so if we get a decreasing
- # or the same count, then the leaks are fixed in the bits
- # being tested.
- echo "INFO: finishing early due to non-increasing instance count."
- finished_early=true
- killApplication
- break
- fi
- prev_instance_cnt="$instance_cnt"
- fi
-
- # delay between samples
- sleep 5
-
- loop_cnt=`expr $loop_cnt + 1`
-done
-
-if [ $finished_early = false ]; then
- stopApplication "$TEST_NAME.port"
- waitForApplication
-fi
-
-echo "INFO: $TEST_NAME has finished running."
-echo "INFO: increasing_cnt = $increasing_cnt"
-echo "INFO: decreasing_cnt = $decreasing_cnt"
-if [ "$jmap_retry_cnt" -gt 0 ]; then
- echo "INFO: jmap_retry_cnt = $jmap_retry_cnt (in $loop_cnt iterations)"
-fi
-
-if [ "$loop_cnt" = 0 ]; then
- echo "FAIL: jmap is unable to take any samples." >&2
- exit 2
-fi
-
-echo "INFO: The instance count of" `eval echo $TARGET_CLASS` "objects"
-if [ "$decreasing_cnt" = 0 ]; then
- echo "INFO: is always increasing."
- echo "FAIL: This indicates that there is a memory leak." >&2
- exit 2
-fi
-
-echo "INFO: is not always increasing."
-echo "PASS: This indicates that there is not a memory leak."
-exit 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/util/logging/TestLoggerWeakRefLeak.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import static jdk.testlibrary.Asserts.assertGreaterThan;
+import jdk.testlibrary.ProcessTools;
+
+import com.sun.tools.attach.AttachNotSupportedException;
+import com.sun.tools.attach.VirtualMachine;
+
+import sun.tools.attach.HotSpotVirtualMachine;
+
+/*
+ * @test
+ * @bug 6942989
+ * @summary Check for WeakReference leak in Logger and anonymous Logger objects
+ * @library /lib/testlibrary
+ * @build jdk.testlibrary.*
+ * @run main/othervm TestLoggerWeakRefLeak Logger
+ * @run main/othervm TestLoggerWeakRefLeak AnonymousLogger
+ */
+public class TestLoggerWeakRefLeak {
+
+ private static final String TARGET_CLASS = "java.lang.ref.WeakReference";
+ private static final int INSTANCE_COUNT = 100;
+ private static int loggerCount = 0;
+
+ public static void main(String[] args) throws Exception {
+ if (args[0].equals("AnonymousLogger")) {
+ System.out.println("Test for WeakReference leak in AnonymousLogger object");
+ testIfLeaking(TestLoggerWeakRefLeak::callAnonymousLogger);
+ } else {
+ System.out.println("Test for WeakReference leak in Logger object");
+ testIfLeaking(TestLoggerWeakRefLeak::callLogger);
+ }
+ }
+
+ /**
+ * For these particular WeakReference leaks, the count was always observed
+ * to be increasing so if decreasing or the same count is observed,
+ * then there is no leak.
+ */
+ private static void testIfLeaking(Runnable callLogger) throws Exception {
+ long count = 0;
+ int instanceCount = 0;
+ int previousInstanceCount = 0;
+ int increasingCount = 0;
+ int decreasingCount = 0;
+
+ while (true) {
+ callLogger.run();
+ count += INSTANCE_COUNT;
+
+ if ((count % 1000) == 0) {
+ System.out.println("call count = " + count);
+
+ instanceCount = getInstanceCountFromHeapHisto();
+ if (instanceCount > previousInstanceCount) {
+ increasingCount++;
+ } else {
+ decreasingCount++;
+ System.out.println("increasing count: " + increasingCount);
+ System.out.println("decreasing or the same count: " + decreasingCount);
+ System.out.println("Test passed: decreasing or the same instance count is observed");
+ break;
+ }
+ previousInstanceCount = instanceCount;
+ }
+
+ delayExecution();
+ }
+ }
+
+ /**
+ * This Logger call is leaking two different WeakReferences:
+ * - one in LogManager.LogNode
+ * - one in Logger.kids
+ */
+ private static void callLogger() {
+ for (int i = 0; i < INSTANCE_COUNT; i++) {
+ java.util.logging.Logger.getLogger("logger-" + loggerCount);
+ if (++loggerCount >= 25000) {
+ // Limit the Logger namespace used by the test so the weak refs
+ // in LogManager.loggers that are being properly managed
+ // don't skew the counts by too much.
+ loggerCount = 0;
+ }
+ }
+ }
+
+ /**
+ * This Logger call is leaking a WeakReference in Logger.kids
+ */
+ private static void callAnonymousLogger() {
+ for (int i = 0; i < INSTANCE_COUNT; i++) {
+ java.util.logging.Logger.getAnonymousLogger();
+ }
+ }
+
+ /**
+ * 'vm.heapHisto("-live")' will request a full GC
+ */
+ private static int getInstanceCountFromHeapHisto() throws AttachNotSupportedException, Exception {
+ int instanceCount = 0;
+
+ HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine
+ .attach(Integer.toString(ProcessTools.getProcessId()));
+ try {
+ try (InputStream heapHistoStream = vm.heapHisto("-live");
+ BufferedReader in = new BufferedReader(new InputStreamReader(heapHistoStream))) {
+ String inputLine;
+ while ((inputLine = in.readLine()) != null) {
+ if (inputLine.contains(TARGET_CLASS)) {
+ instanceCount = Integer.parseInt(inputLine
+ .split("[ ]+")[2]);
+ System.out.println("instance count: " + instanceCount);
+ break;
+ }
+ }
+ }
+ } finally {
+ vm.detach();
+ }
+
+ assertGreaterThan(instanceCount, 0, "No instances of " + TARGET_CLASS + " are found");
+
+ return instanceCount;
+ }
+
+ /**
+ * Delay for 1/10 of a second to avoid CPU saturation
+ */
+ private static void delayExecution() {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException ie) {
+ // Ignore any exceptions
+ }
+ }
+
+}
--- a/jdk/test/javax/management/monitor/CounterMonitorDeadlockTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/management/monitor/CounterMonitorDeadlockTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,6 @@
import java.lang.management.ManagementFactory;
import java.util.concurrent.atomic.AtomicInteger;
-import javax.management.Attribute;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.Notification;
@@ -95,18 +94,16 @@
monitorProxy.setInitThreshold(100);
monitorProxy.setGranularityPeriod(10L); // 10 ms
monitorProxy.setNotify(true);
+
+ final int initGetCount = observedProxy.getGetCount();
monitorProxy.start();
- final int initGetCount = observedProxy.getGetCount();
- int getCount;
System.out.println("Checking GetCount, possible deadlock if timeout.");
do { // 8038322. Until timeout of testing harness
Thread.sleep(200);
- } while ((getCount=observedProxy.getGetCount()) == initGetCount);
+ } while ((observedProxy.getGetCount()) == initGetCount);
System.out.println("Done!");
- if (getCount <= initGetCount)
- throw new Exception("Test failed: presumable deadlock");
// This won't show up as a deadlock in CTRL-\ or in
// ThreadMXBean.findDeadlockedThreads(), because they don't
// see that thread A is waiting for thread B (B.join()), and
--- a/jdk/test/javax/net/ssl/SSLSession/TestEnabledProtocols.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/net/ssl/SSLSession/TestEnabledProtocols.java Tue Jan 27 13:58:55 2015 -0500
@@ -120,6 +120,10 @@
volatile Exception clientException = null;
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
String keyFilename =
System.getProperty("test.src", "./") + "/" + pathToStores +
"/" + keyStoreFile;
--- a/jdk/test/javax/net/ssl/ServerName/SSLEngineExplorer.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/net/ssl/ServerName/SSLEngineExplorer.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -44,6 +44,7 @@
import java.net.*;
import java.util.*;
import java.nio.channels.*;
+import java.security.Security;
public class SSLEngineExplorer extends SSLEngineService {
@@ -231,6 +232,10 @@
volatile int serverPort = 0;
public static void main(String args[]) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
if (debug)
System.setProperty("javax.net.debug", "all");
--- a/jdk/test/javax/net/ssl/ServerName/SSLSocketExplorer.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/net/ssl/ServerName/SSLSocketExplorer.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,6 +45,7 @@
import java.util.*;
import java.net.*;
import javax.net.ssl.*;
+import java.security.Security;
public class SSLSocketExplorer {
@@ -224,6 +225,10 @@
volatile Exception clientException = null;
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
String keyFilename =
System.getProperty("test.src", ".") + "/" + pathToStores +
"/" + keyStoreFile;
--- a/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -29,8 +29,10 @@
/*
* @test
- * @bug 8049432
+ * @bug 8049432 8069038
* @summary New tests for TLS property jdk.tls.client.protocols
+ * @summary javax/net/ssl/TLS/TLSClientPropertyTest.java needs to be
+ * updated for JDK-8061210
* @run main/othervm TLSClientPropertyTest NoProperty
* @run main/othervm TLSClientPropertyTest SSLv3
* @run main/othervm TLSClientPropertyTest TLSv1
@@ -46,7 +48,7 @@
* protocols in the SSLContext.
*/
public class TLSClientPropertyTest {
- private final String[] expecteSupportedProtos = new String[] {
+ private final String[] expectedSupportedProtos = new String[] {
"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"
};
@@ -67,31 +69,30 @@
}
contextProtocol = null;
expectedDefaultProtos = new String[] {
- "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"
+ "TLSv1", "TLSv1.1", "TLSv1.2"
};
break;
case "SSLv3":
contextProtocol = "SSLv3";
expectedDefaultProtos = new String[] {
- "SSLv3"
};
break;
case "TLSv1":
contextProtocol = "TLSv1";
expectedDefaultProtos = new String[] {
- "SSLv3", "TLSv1"
+ "TLSv1"
};
break;
case "TLSv11":
contextProtocol = "TLSv1.1";
expectedDefaultProtos = new String[] {
- "SSLv3", "TLSv1", "TLSv1.1"
+ "TLSv1", "TLSv1.1"
};
break;
case "TLSv12":
contextProtocol = "TLSv1.2";
expectedDefaultProtos = new String[] {
- "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"
+ "TLSv1", "TLSv1.1", "TLSv1.2"
};
break;
case "WrongProperty":
@@ -182,12 +183,12 @@
expectedProto = "Default";
}
if (!context.getProtocol().equals(expectedProto)) {
- error("Invalid current protocol:" + context.getProtocol()
+ error("Invalid current protocol: " + context.getProtocol()
+ ", Expected:" + expectedProto, null);
}
List<String> actualDefaultProtos = Arrays.asList(context
.getDefaultSSLParameters().getProtocols());
- for (String p: expectedDefaultProtos) {
+ for (String p : expectedDefaultProtos) {
if (!actualDefaultProtos.contains(p)) {
error("Default protocol " + p + "missing", null);
}
@@ -195,7 +196,7 @@
List<String> actualSupportedProtos = Arrays.asList(context
.getSupportedSSLParameters().getProtocols());
- for (String p: expecteSupportedProtos) {
+ for (String p : expectedSupportedProtos) {
if (!actualSupportedProtos.contains(p)) {
error("Expected to support protocol:" + p, null);
}
--- a/jdk/test/javax/net/ssl/TLS/TestJSSE.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/net/ssl/TLS/TestJSSE.java Tue Jan 27 13:58:55 2015 -0500
@@ -78,6 +78,10 @@
private static final String LOCAL_IP = "127.0.0.1";
public static void main(String... args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
String serverProtocol = System.getProperty("SERVER_PROTOCOL");
String clientProtocol = System.getProperty("CLIENT_PROTOCOL");
int port = jdk.testlibrary.Utils.getFreePort();
--- a/jdk/test/javax/net/ssl/sanity/interop/ClientJSSEServerJSSE.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/net/ssl/sanity/interop/ClientJSSEServerJSSE.java Tue Jan 27 13:58:55 2015 -0500
@@ -33,6 +33,10 @@
public class ClientJSSEServerJSSE {
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
// MD5 is used in this test case, don't disable MD5 algorithm.
Security.setProperty(
"jdk.certpath.disabledAlgorithms", "MD2, RSA keySize < 1024");
--- a/jdk/test/javax/sql/testng/test/rowset/BaseRowSetTests.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/sql/testng/test/rowset/BaseRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,13 +30,9 @@
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Date;
import java.sql.Ref;
-import java.sql.RowId;
-import java.sql.SQLFeatureNotSupportedException;
+import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
@@ -44,407 +40,74 @@
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Calendar;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import javax.sql.RowSet;
import javax.sql.rowset.serial.SerialArray;
import javax.sql.rowset.serial.SerialBlob;
import javax.sql.rowset.serial.SerialClob;
import javax.sql.rowset.serial.SerialRef;
import static org.testng.Assert.*;
-import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
-import util.BaseTest;
import util.StubArray;
import util.StubBaseRowSet;
import util.StubBlob;
import util.StubClob;
-import util.StubNClob;
import util.StubRef;
-import util.StubRowId;
-import util.StubSQLXML;
import util.TestRowSetListener;
-public class BaseRowSetTests extends BaseTest {
+public class BaseRowSetTests extends CommonRowSetTests {
private StubBaseRowSet brs;
- private StubBaseRowSet brs1;
- private final String query = "SELECT * FROM SUPERHEROS";
- private final String url = "jdbc:derby://localhost:1527/myDB";
- private final String dsName = "jdbc/myDB";
- private final String user = "Bruce Wayne";
- private final String password = "The Dark Knight";
- private final Date aDate = Date.valueOf(LocalDate.now());
- private final Time aTime = Time.valueOf(LocalTime.now());
- private final Timestamp ts = Timestamp.valueOf(LocalDateTime.now());
- private final Calendar cal = Calendar.getInstance();
- private final byte[] bytes = new byte[10];
- private RowId aRowid;
- private Ref aRef;
- private Blob aBlob;
- private Clob aClob;
- private Array aArray;
- private InputStream is;
- private Reader rdr;
- private Map<String, Class<?>> map = new HashMap<>();
- public BaseRowSetTests() {
- brs1 = new StubBaseRowSet();
- is = new StringBufferInputStream(query);
- rdr = new StringReader(query);
- aRowid = new StubRowId();
- try {
- aBlob = new SerialBlob(new StubBlob());
- aClob = new SerialClob(new StubClob());
- aRef = new SerialRef(new StubRef("INTEGER", query));
- aArray = new SerialArray(new StubArray("INTEGER", new Object[1]));
- map.put("SUPERHERO", Class.forName("util.SuperHero"));
- } catch (SQLException | ClassNotFoundException ex) {
- Logger.getLogger(BaseRowSetTests.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
-
- @BeforeMethod
@Override
- public void setUpMethod() throws Exception {
- brs = new StubBaseRowSet();
- }
-
- /*
- * Validate that getCommand() returns null by default
- */
- @Test
- public void test() {
- assertTrue(brs.getCommand() == null);
- }
-
- /*
- * Validate that getCommand() returns command specified to setCommand
- */
- @Test
- public void test01() throws Exception {
- brs.setCommand(query);
- assertTrue(brs.getCommand().equals(query));
- }
-
- /*
- * Validate that getCurrency() returns the correct default value
- */
- @Test
- public void test02() throws Exception {
- assertTrue(brs.getConcurrency() == ResultSet.CONCUR_UPDATABLE);
- }
-
- /*
- * Validate that getCurrency() returns the correct value
- * after a call to setConcurrency())
- */
- @Test(dataProvider = "concurTypes")
- public void test03(int concurType) throws Exception {
- brs.setConcurrency(concurType);
- assertTrue(brs.getConcurrency() == concurType);
- }
-
- /*
- * Validate that getCurrency() throws a SQLException for an invalid value
- */
- @Test(expectedExceptions = SQLException.class)
- public void test04() throws Exception {
- brs.setConcurrency(ResultSet.CLOSE_CURSORS_AT_COMMIT);
- }
-
- /*
- * Validate that getDataSourceName() returns null by default
- */
- @Test
- public void test05() throws Exception {
- assertTrue(brs.getDataSourceName() == null);
- }
-
- /*
- * Validate that getDataSourceName() returns the value specified
- * by setDataSourceName() and getUrl() returns null
- */
- @Test
- public void test06() throws Exception {
- brs.setUrl(url);
- brs.setDataSourceName(dsName);
- assertTrue(brs.getDataSourceName().equals(dsName));
- assertTrue(brs.getUrl() == null);
- }
-
- /*
- * Validate that setDataSourceName() throws a SQLException for an empty
- * String specified for the data source name
- */
- @Test(expectedExceptions = SQLException.class)
- public void test07() throws Exception {
- String dsname = "";
- brs.setDataSourceName(dsname);
- }
-
- /*
- * Validate that getEscapeProcessing() returns true by default
- */
- @Test
- public void test08() throws Exception {
- assertTrue(brs.getEscapeProcessing());
- }
-
- /*
- * Validate that getEscapeProcessing() returns value set by
- * setEscapeProcessing()
- */
- @Test(dataProvider = "trueFalse")
- public void test09(boolean val) throws Exception {
- brs.setEscapeProcessing(val);
- assertTrue(brs.getEscapeProcessing() == val);
- }
-
- /*
- * Validate that getFetchDirection() returns the correct default value
- */
- @Test
- public void test10() throws Exception {
- assertTrue(brs.getFetchDirection() == ResultSet.FETCH_FORWARD);
- }
-
- /*
- * Validate that getFetchDirection() returns the value set by
- * setFetchDirection()
- */
- @Test(dataProvider = "fetchDirection")
- public void test11(int direction) throws Exception {
- brs.setFetchDirection(direction);
- assertTrue(brs.getFetchDirection() == direction);
+ protected RowSet newInstance() throws SQLException {
+ return new StubBaseRowSet();
}
/*
- * Validate that setConcurrency() throws a SQLException for an invalid value
- */
- @Test(expectedExceptions = SQLException.class)
- public void test12() throws Exception {
- brs.setConcurrency(ResultSet.CLOSE_CURSORS_AT_COMMIT);
- }
-
- /*
- * Validate that setFetchSize() throws a SQLException for an invalid value
- */
- @Test(expectedExceptions = SQLException.class)
- public void test13() throws Exception {
- brs.setFetchSize(-1);
- }
-
- /*
- * Validate that setFetchSize() throws a SQLException for a
- * value greater than getMaxRows()
- */
- @Test(expectedExceptions = SQLException.class)
- public void test14() throws Exception {
- brs.setMaxRows(5);
- brs.setFetchSize(brs.getMaxRows() + 1);
- }
-
- /*
- * Validate that getFetchSize() returns the correct value after
- * setFetchSize() has been called
+ * Create a RowSetListener and validate that notifyCursorMoved is called
*/
- @Test
- public void test15() throws Exception {
- int maxRows = 150;
- brs.setFetchSize(0);
- assertTrue(brs.getFetchSize() == 0);
- brs.setFetchSize(100);
- assertTrue(brs.getFetchSize() == 100);
- brs.setMaxRows(maxRows);
- brs.setFetchSize(maxRows);
- assertTrue(brs.getFetchSize() == maxRows);
- }
-
- /*
- * Validate that setMaxFieldSize() throws a SQLException for an invalid value
- */
- @Test(expectedExceptions = SQLException.class)
- public void test16() throws Exception {
- brs.setMaxFieldSize(-1);
- }
-
- /*
- * Validate that getMaxFieldSize() returns the value set by
- * setMaxFieldSize()
- */
- @Test
- public void test17() throws Exception {
- brs.setMaxFieldSize(0);
- assertTrue(brs.getMaxFieldSize() == 0);
- brs.setMaxFieldSize(100);
- assertTrue(brs.getMaxFieldSize() == 100);
- brs.setMaxFieldSize(50);
- assertTrue(brs.getMaxFieldSize() == 50);
- }
-
- /*
- * Validate that isReadOnly() returns value set by
- * setReadOnly()
- */
- @Test(dataProvider = "trueFalse")
- public void test18(boolean val) throws Exception {
- brs.setReadOnly(val);
- assertTrue(brs.isReadOnly() == val);
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0000(StubBaseRowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.notifyCursorMoved();
+ assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED));
}
/*
- * Validate that getTransactionIsolation() returns value set by
- * setTransactionIsolation()
- */
- @Test(dataProvider = "isolationTypes")
- public void test19(int val) throws Exception {
- brs.setTransactionIsolation(val);
- assertTrue(brs.getTransactionIsolation() == val);
- }
-
- /*
- * Validate that getType() returns value set by setType()
- */
- @Test(dataProvider = "scrollTypes")
- public void test20(int val) throws Exception {
- brs.setType(val);
- assertTrue(brs.getType() == val);
- }
-
- /*
- * Validate that getEscapeProcessing() returns value set by
- * setEscapeProcessing()
- */
- @Test(dataProvider = "trueFalse")
- public void test21(boolean val) throws Exception {
- brs.setShowDeleted(val);
- assertTrue(brs.getShowDeleted() == val);
- }
-
- /*
- * Validate that getTypeMap() returns same value set by
- * setTypeMap()
- */
- @Test()
- public void test22() throws Exception {
- brs.setTypeMap(map);
- assertTrue(brs.getTypeMap().equals(map));
- }
-
- /*
- * Validate that getUsername() returns same value set by
- * setUsername()
+ * Create a RowSetListener and validate that notifyRowChanged is called
*/
- @Test()
- public void test23() throws Exception {
- brs.setUsername(user);
- assertTrue(brs.getUsername().equals(user));
- }
-
- /*
- * Validate that getPassword() returns same password set by
- * setPassword()
- */
- @Test()
- public void test24() throws Exception {
- brs.setPassword(password);
- assertTrue(brs.getPassword().equals(password));
- }
-
- /*
- * Validate that getQueryTimeout() returns same value set by
- * setQueryTimeout() and that 0 is a valid timeout value
- */
- @Test()
- public void test25() throws Exception {
- int timeout = 0;
- brs.setQueryTimeout(timeout);
- assertTrue(brs.getQueryTimeout() == timeout);
- }
-
- /*
- * Validate that getQueryTimeout() returns same value set by
- * setQueryTimeout() and that 0 is a valid timeout value
- */
- @Test()
- public void test26() throws Exception {
- int timeout = 10000;
- brs.setQueryTimeout(timeout);
- assertTrue(brs.getQueryTimeout() == timeout);
- }
-
- /*
- * Validate that setQueryTimeout() throws a SQLException for a timeout
- * value < 0
- */
- @Test(expectedExceptions = SQLException.class)
- public void test27() throws Exception {
- brs.setQueryTimeout(-1);
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0001(StubBaseRowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.notifyRowChanged();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED));
}
/*
* Create a RowSetListener and validate that notifyRowSetChanged is called
*/
- @Test()
- public void test28() throws Exception {
- TestRowSetListener rsl = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.notifyRowSetChanged();
- assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
- }
-
- /*
- * Create a RowSetListener and validate that notifyRowChanged is called
- */
- @Test()
- public void test29() throws Exception {
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0002(StubBaseRowSet rs) throws Exception {
TestRowSetListener rsl = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.notifyRowChanged();
- assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED));
- }
-
- /*
- * Create a RowSetListener and validate that notifyCursorMoved is called
- */
- @Test()
- public void test30() throws Exception {
- TestRowSetListener rsl = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.notifyCursorMoved();
- assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED));
- }
-
- /*
- * Create a RowSetListener and validate that notifyRowSetChanged,
- * notifyRowChanged() and notifyCursorMoved are called
- */
- @Test()
- public void test31() throws Exception {
- TestRowSetListener rsl = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.notifyRowSetChanged();
- brs.notifyRowChanged();
- brs.notifyCursorMoved();
- assertTrue(rsl.isNotified(
- TestRowSetListener.CURSOR_MOVED | TestRowSetListener.ROWSET_CHANGED
- | TestRowSetListener.ROW_CHANGED));
+ rs.addRowSetListener(rsl);
+ rs.notifyRowSetChanged();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
}
/*
* Create multiple RowSetListeners and validate that notifyRowSetChanged
* is called on all listeners
*/
- @Test()
- public void test32() throws Exception {
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0003(StubBaseRowSet rs) throws Exception {
TestRowSetListener rsl = new TestRowSetListener();
TestRowSetListener rsl2 = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.addRowSetListener(rsl2);
- brs.notifyRowSetChanged();
+ rs.addRowSetListener(rsl);
+ rs.addRowSetListener(rsl2);
+ rs.notifyRowSetChanged();
assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
assertTrue(rsl2.isNotified(TestRowSetListener.ROWSET_CHANGED));
}
@@ -453,13 +116,13 @@
* Create multiple RowSetListeners and validate that notifyRowChanged
* is called on all listeners
*/
- @Test()
- public void test33() throws Exception {
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0004(StubBaseRowSet rs) throws Exception {
TestRowSetListener rsl = new TestRowSetListener();
TestRowSetListener rsl2 = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.addRowSetListener(rsl2);
- brs.notifyRowChanged();
+ rs.addRowSetListener(rsl);
+ rs.addRowSetListener(rsl2);
+ rs.notifyRowChanged();
assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED));
assertTrue(rsl2.isNotified(TestRowSetListener.ROW_CHANGED));
}
@@ -468,30 +131,47 @@
* Create multiple RowSetListeners and validate that notifyCursorMoved
* is called on all listeners
*/
- @Test()
- public void test34() throws Exception {
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0005(StubBaseRowSet rs) throws Exception {
TestRowSetListener rsl = new TestRowSetListener();
TestRowSetListener rsl2 = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.addRowSetListener(rsl2);
- brs.notifyCursorMoved();
+ rs.addRowSetListener(rsl);
+ rs.addRowSetListener(rsl2);
+ rs.notifyCursorMoved();
assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED));
assertTrue(rsl2.isNotified(TestRowSetListener.CURSOR_MOVED));
}
/*
+ * Create a RowSetListener and validate that notifyRowSetChanged,
+ * notifyRowChanged() and notifyCursorMoved are called
+ */
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0006(StubBaseRowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.notifyRowSetChanged();
+ rs.notifyRowChanged();
+ rs.notifyCursorMoved();
+ assertTrue(rsl.isNotified(
+ TestRowSetListener.CURSOR_MOVED | TestRowSetListener.ROWSET_CHANGED
+ | TestRowSetListener.ROW_CHANGED));
+ }
+
+
+ /*
* Create multiple RowSetListeners and validate that notifyRowSetChanged,
* notifyRowChanged() and notifyCursorMoved are called on all listeners
*/
- @Test()
- public void test35() throws Exception {
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0007(StubBaseRowSet rs) throws Exception {
TestRowSetListener rsl = new TestRowSetListener();
TestRowSetListener rsl2 = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.addRowSetListener(rsl2);
- brs.notifyRowSetChanged();
- brs.notifyRowChanged();
- brs.notifyCursorMoved();
+ rs.addRowSetListener(rsl);
+ rs.addRowSetListener(rsl2);
+ rs.notifyRowSetChanged();
+ rs.notifyRowChanged();
+ rs.notifyCursorMoved();
assertTrue(rsl.isNotified(
TestRowSetListener.CURSOR_MOVED | TestRowSetListener.ROWSET_CHANGED
| TestRowSetListener.ROW_CHANGED));
@@ -505,55 +185,25 @@
* remove the listener, invoke notifyRowSetChanged again and verify the
* listner is not called
*/
- @Test()
- public void test36() throws Exception {
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0008(StubBaseRowSet rs) throws Exception {
TestRowSetListener rsl = new TestRowSetListener();
- brs.addRowSetListener(rsl);
- brs.notifyRowSetChanged();
+ rs.addRowSetListener(rsl);
+ rs.notifyRowSetChanged();
assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
// Clear the flag indicating the listener has been called
rsl.resetFlag();
- brs.removeRowSetListener(rsl);
- brs.notifyRowSetChanged();
+ rs.removeRowSetListener(rsl);
+ rs.notifyRowSetChanged();
assertFalse(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
}
/*
- * Validate addRowSetListener does not throw an Exception when null is
- * passed as the parameter
- */
- @Test()
- public void test37() throws Exception {
- brs.addRowSetListener(null);
- }
-
- /*
- * Validate removeRowSetListener does not throw an Exception when null is
- * passed as the parameter
- */
- @Test()
- public void test38() throws Exception {
- brs.removeRowSetListener(null);
- }
-
- /*
- * Set two parameters and then validate clearParameters() will clear them
- */
- @Test()
- public void test39() throws Exception {
- brs.setInt(1, 1);
- brs.setString(2, query);
- assertTrue(brs.getParams().length == 2);
- brs.clearParameters();
- assertTrue(brs.getParams().length == 0);
- }
-
- /*
* Set the base parameters and validate that the value set is
* the correct type and value
*/
@Test(dataProvider = "testBaseParameters")
- public void test40(int pos, Object o) throws Exception {
+ public void baseRowSetTest0009(int pos, Object o) throws Exception {
assertTrue(getParam(pos, o).getClass().isInstance(o));
assertTrue(o.equals(getParam(pos, o)));
}
@@ -563,7 +213,7 @@
* the correct type
*/
@Test(dataProvider = "testAdvancedParameters")
- public void test41(int pos, Object o) throws Exception {
+ public void baseRowSetTest0010(int pos, Object o) throws Exception {
assertTrue(getParam(pos, o).getClass().isInstance(o));
}
@@ -571,7 +221,8 @@
* Validate setNull specifying the supported type values
*/
@Test(dataProvider = "jdbcTypes")
- public void test42(Integer type) throws Exception {
+ public void baseRowSetTest0011(Integer type) throws Exception {
+ brs = new StubBaseRowSet();
brs.setNull(1, type);
assertTrue(checkNullParam(1, type, null));
}
@@ -581,7 +232,8 @@
* typeName is set internally
*/
@Test(dataProvider = "jdbcTypes")
- public void test43(Integer type) throws Exception {
+ public void baseRowSetTest0012(Integer type) throws Exception {
+ brs = new StubBaseRowSet();
brs.setNull(1, type, "SUPERHERO");
assertTrue(checkNullParam(1, type, "SUPERHERO"));
}
@@ -590,8 +242,10 @@
* Validate that setDate sets the specified Calendar internally
*/
@Test()
- public void test44() throws Exception {
- brs.setDate(1, aDate, cal);
+ public void baseRowSetTest0013() throws Exception {
+ Calendar cal = Calendar.getInstance();
+ brs = new StubBaseRowSet();
+ brs.setDate(1, Date.valueOf(LocalDate.now()), cal);
assertTrue(checkCalendarParam(1, cal));
}
@@ -599,8 +253,10 @@
* Validate that setTime sets the specified Calendar internally
*/
@Test()
- public void test45() throws Exception {
- brs.setTime(1, aTime, cal);
+ public void baseRowSetTest0014() throws Exception {
+ Calendar cal = Calendar.getInstance();
+ brs = new StubBaseRowSet();
+ brs.setTime(1, Time.valueOf(LocalTime.now()), cal);
assertTrue(checkCalendarParam(1, cal));
}
@@ -608,564 +264,23 @@
* Validate that setTimestamp sets the specified Calendar internally
*/
@Test()
- public void test46() throws Exception {
- brs.setTimestamp(1, ts, cal);
+ public void baseRowSetTest0015() throws Exception {
+ Calendar cal = Calendar.getInstance();
+ brs = new StubBaseRowSet();
+ brs.setTimestamp(1, Timestamp.valueOf(LocalDateTime.now()), cal);
assertTrue(checkCalendarParam(1, cal));
}
/*
- * Validate that getURL() returns same value set by
- * setURL()
- */
- @Test()
- public void test47() throws Exception {
- brs.setUrl(url);
- assertTrue(brs.getUrl().equals(url));
- }
-
- /*
* Validate that initParams() initializes the parameters
*/
- @Test()
- public void test48() throws Exception {
- brs.setInt(1, 1);
- brs.initParams();
- assertTrue(brs.getParams().length == 0);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
-
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test100() throws Exception {
- brs1.setAsciiStream(1, is);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test101() throws Exception {
- brs1.setAsciiStream("one", is);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test102() throws Exception {
- brs1.setAsciiStream("one", is, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test103() throws Exception {
- brs1.setBinaryStream(1, is);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test104() throws Exception {
- brs1.setBinaryStream("one", is);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test105() throws Exception {
- brs1.setBinaryStream("one", is, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test106() throws Exception {
- brs1.setBigDecimal("one", BigDecimal.ONE);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test107() throws Exception {
- brs1.setBlob(1, is);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test108() throws Exception {
- brs1.setBlob("one", is);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test109() throws Exception {
- brs1.setBlob("one", is, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test110() throws Exception {
- brs1.setBlob("one", aBlob);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test111() throws Exception {
- brs1.setBoolean("one", true);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test112() throws Exception {
- byte b = 1;
- brs1.setByte("one", b);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test113() throws Exception {
- byte b = 1;
- brs1.setBytes("one", bytes);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test114() throws Exception {
- brs1.setCharacterStream("one", rdr, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test115() throws Exception {
- brs1.setCharacterStream("one", rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test116() throws Exception {
- brs1.setCharacterStream(1, rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test117() throws Exception {
- brs1.setClob(1, rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test118() throws Exception {
- brs1.setClob("one", rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test119() throws Exception {
- brs1.setClob("one", rdr, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test120() throws Exception {
- brs1.setClob("one", aClob);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test121() throws Exception {
- brs1.setDate("one", aDate);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test122() throws Exception {
- brs1.setDate("one", aDate, cal);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test123() throws Exception {
- brs1.setTime("one", aTime);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test124() throws Exception {
- brs1.setTime("one", aTime, cal);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test125() throws Exception {
- brs1.setTimestamp("one", ts);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test126() throws Exception {
- brs1.setTimestamp("one", ts, cal);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test127() throws Exception {
- brs1.setDouble("one", 2.0d);
+ @Test(dataProvider = "rowSetType")
+ public void baseRowSetTest0016(StubBaseRowSet rs) throws Exception {
+ rs.setInt(1, 1);
+ rs.initParams();
+ assertTrue(rs.getParams().length == 0);
}
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test128() throws Exception {
- brs1.setFloat("one", 2.0f);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test129() throws Exception {
- brs1.setInt("one", 21);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test130() throws Exception {
- brs1.setLong("one", 21l);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test131() throws Exception {
- brs1.setNCharacterStream("one", rdr, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test132() throws Exception {
- brs1.setNCharacterStream("one", rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test133() throws Exception {
- brs1.setNCharacterStream(1, rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test134() throws Exception {
- brs1.setNCharacterStream(1, rdr, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test135() throws Exception {
- brs1.setClob("one", rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test136() throws Exception {
- brs1.setClob("one", rdr, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test137() throws Exception {
- brs1.setNClob("one", new StubNClob());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test138() throws Exception {
- brs1.setNClob(1, rdr);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test139() throws Exception {
- brs1.setNClob(1, rdr, query.length());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test140() throws Exception {
- brs1.setNClob(1, new StubNClob());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test141() throws Exception {
- brs1.setNString(1, query);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test142() throws Exception {
- brs1.setNull("one", Types.INTEGER);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test143() throws Exception {
- brs1.setNull("one", Types.INTEGER, "my.type");
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test144() throws Exception {
- brs1.setObject("one", query, Types.VARCHAR);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test145() throws Exception {
- brs1.setObject("one", query, Types.VARCHAR, 0);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test146() throws Exception {
- brs1.setObject("one", query);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test147() throws Exception {
- brs1.setRowId("one", aRowid);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test148() throws Exception {
- brs1.setSQLXML("one", new StubSQLXML());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test149() throws Exception {
- brs1.setSQLXML(1, new StubSQLXML());
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test150() throws Exception {
- brs1.setNString(1, query);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test151() throws Exception {
- brs1.setNString("one", query);
- }
-
- /*
- * This method is currently not implemented in BaseRowSet and will
- * throw a SQLFeatureNotSupportedException
- */
- @Test(expectedExceptions = SQLFeatureNotSupportedException.class)
- public void test152() throws Exception {
- short val = 21;
- brs1.setShort("one", val);
- }
-
- /*
- * DataProvider used to specify the value to set and check for
- * methods using transaction isolation types
- */
- @DataProvider(name = "isolationTypes")
- private Object[][] isolationTypes() {
- return new Object[][]{
- {Connection.TRANSACTION_NONE},
- {Connection.TRANSACTION_READ_COMMITTED},
- {Connection.TRANSACTION_READ_UNCOMMITTED},
- {Connection.TRANSACTION_REPEATABLE_READ},
- {Connection.TRANSACTION_SERIALIZABLE}
- };
- }
-
- /*
- * DataProvider used to specify the value to set and check for the
- * methods for fetch direction
- */
- @DataProvider(name = "fetchDirection")
- private Object[][] fetchDirection() {
- return new Object[][]{
- {ResultSet.FETCH_FORWARD},
- {ResultSet.FETCH_REVERSE},
- {ResultSet.FETCH_UNKNOWN}
- };
- }
-
- /*
- * DataProvider used to specify the value to set and check for the
- * methods for Concurrency
- */
- @DataProvider(name = "concurTypes")
- private Object[][] concurTypes() {
- return new Object[][]{
- {ResultSet.CONCUR_READ_ONLY},
- {ResultSet.CONCUR_UPDATABLE}
- };
- }
-
- /*
- * DataProvider used to specify the value to set and check for the
- * methods for Cursor Scroll Type
- */
- @DataProvider(name = "scrollTypes")
- private Object[][] scrollTypes() {
- return new Object[][]{
- {ResultSet.TYPE_FORWARD_ONLY},
- {ResultSet.TYPE_SCROLL_INSENSITIVE},
- {ResultSet.TYPE_SCROLL_SENSITIVE}
- };
- }
/*
* DataProvider used to set parameters for basic types that are supported
@@ -1177,29 +292,33 @@
Short aShort = Short.MIN_VALUE;
BigDecimal bd = BigDecimal.ONE;
Double aDouble = Double.MAX_VALUE;
+ Date aDate = Date.valueOf(LocalDate.now());
+ Time aTime = Time.valueOf(LocalTime.now());
+ Timestamp aTimeStamp = Timestamp.valueOf(LocalDateTime.now());
+ Calendar cal = Calendar.getInstance();
Boolean aBoolean = true;
Float aFloat = 1.5f;
Byte aByte = 1;
+ brs = new StubBaseRowSet();
- brs1.clearParameters();
- brs1.setInt(1, aInt);
- brs1.setString(2, query);
- brs1.setLong(3, aLong);
- brs1.setBoolean(4, aBoolean);
- brs1.setShort(5, aShort);
- brs1.setDouble(6, aDouble);
- brs1.setBigDecimal(7, bd);
- brs1.setFloat(8, aFloat);
- brs1.setByte(9, aByte);
- brs1.setDate(10, aDate);
- brs1.setTime(11, aTime);
- brs1.setTimestamp(12, ts);
- brs1.setDate(13, aDate, cal);
- brs1.setTime(14, aTime, cal);
- brs1.setTimestamp(15, ts);
- brs1.setObject(16, query);
- brs1.setObject(17, query, Types.CHAR);
- brs1.setObject(18, query, Types.CHAR, 0);
+ brs.setInt(1, aInt);
+ brs.setString(2, query);
+ brs.setLong(3, aLong);
+ brs.setBoolean(4, aBoolean);
+ brs.setShort(5, aShort);
+ brs.setDouble(6, aDouble);
+ brs.setBigDecimal(7, bd);
+ brs.setFloat(8, aFloat);
+ brs.setByte(9, aByte);
+ brs.setDate(10, aDate);
+ brs.setTime(11, aTime);
+ brs.setTimestamp(12, aTimeStamp);
+ brs.setDate(13, aDate, cal);
+ brs.setTime(14, aTime, cal);
+ brs.setTimestamp(15, aTimeStamp);
+ brs.setObject(16, query);
+ brs.setObject(17, query, Types.CHAR);
+ brs.setObject(18, query, Types.CHAR, 0);
return new Object[][]{
{1, aInt},
@@ -1213,10 +332,10 @@
{9, aByte},
{10, aDate},
{11, aTime},
- {12, ts},
+ {12, aTimeStamp},
{13, aDate},
{14, aTime},
- {15, ts},
+ {15, aTimeStamp},
{16, query},
{17, query},
{18, query}
@@ -1230,16 +349,23 @@
@DataProvider(name = "testAdvancedParameters")
private Object[][] testAdvancedParameters() throws SQLException {
- brs1.clearParameters();
- brs1.setBytes(1, bytes);
- brs1.setAsciiStream(2, is, query.length());
- brs1.setRef(3, aRef);
- brs1.setArray(4, aArray);
- brs1.setBlob(5, aBlob);
- brs1.setClob(6, aClob);
- brs1.setBinaryStream(7, is, query.length());
- brs1.setUnicodeStream(8, is, query.length());
- brs1.setCharacterStream(9, rdr, query.length());
+ byte[] bytes = new byte[10];
+ Ref aRef = new SerialRef(new StubRef("INTEGER", query));
+ Array aArray = new SerialArray(new StubArray("INTEGER", new Object[1]));
+ Blob aBlob = new SerialBlob(new StubBlob());
+ Clob aClob = new SerialClob(new StubClob());
+ Reader rdr = new StringReader(query);
+ InputStream is = new StringBufferInputStream(query);;
+ brs = new StubBaseRowSet();
+ brs.setBytes(1, bytes);
+ brs.setAsciiStream(2, is, query.length());
+ brs.setRef(3, aRef);
+ brs.setArray(4, aArray);
+ brs.setBlob(5, aBlob);
+ brs.setClob(6, aClob);
+ brs.setBinaryStream(7, is, query.length());
+ brs.setUnicodeStream(8, is, query.length());
+ brs.setCharacterStream(9, rdr, query.length());
return new Object[][]{
{1, bytes},
@@ -1261,7 +387,7 @@
*/
@SuppressWarnings("unchecked")
private <T> T getParam(int pos, T o) throws SQLException {
- Object[] params = brs1.getParams();
+ Object[] params = brs.getParams();
if (params[pos - 1] instanceof Object[]) {
Object[] param = (Object[]) params[pos - 1];
return (T) param[0];
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/CommonRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,1372 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 test.rowset;
+
+import java.io.InputStream;
+import java.io.Reader;
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.RowId;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.sql.Types;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.sql.RowSet;
+import javax.sql.rowset.BaseRowSet;
+import javax.sql.rowset.CachedRowSet;
+import javax.sql.rowset.RowSetFactory;
+import javax.sql.rowset.RowSetMetaDataImpl;
+import javax.sql.rowset.RowSetProvider;
+import org.testng.Assert;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import util.BaseTest;
+import util.StubBlob;
+import util.StubClob;
+import util.StubNClob;
+import util.StubSQLXML;
+
+public abstract class CommonRowSetTests extends BaseTest {
+
+ protected final String stubProvider = "util.StubSyncProvider";
+ protected final String query = "SELECT * FROM SUPERHEROS";
+ private final String url = "jdbc:derby://localhost:1527/myDB";
+ private final String dsName = "jdbc/myDB";
+ private final String user = "Bruce Wayne";
+ private final String password = "The Dark Knight";
+ protected final String COFFEE_HOUSES_TABLE = "COFFEE_HOUSES";
+ protected final String COFFEES_TABLE = "COFFEES";
+ protected final int COFFEE_HOUSES_ROWS = 14;
+ protected final int COFFEES_ROWS = 5;
+ protected final Object[] COFFEES_PRIMARY_KEYS = {1, 2, 3, 4, 5};
+ protected final Object[] COFFEE_HOUSES_PRIMARY_KEYS = {
+ 10023, 33002, 10040, 32001, 10042, 10024, 10039, 10041,
+ 33005, 33010, 10035, 10037, 10034, 32004
+ };
+
+ /*
+ * COFFEES_HOUSES Table column names
+ */
+ protected final String[] COFFEE_HOUSES_COLUMN_NAMES = {
+ "STORE_ID", "CITY", "COFFEE", "MERCH", "TOTAL"
+ };
+
+ /*
+ * COFFEES Table column names
+ */
+ protected final String[] COFFEES_COLUMN_NAMES = {
+ "COF_ID", "COF_NAME", "SUP_ID", "PRICE", "SALES", "TOTAL"
+ };
+
+ protected RowSetFactory rsf;
+
+ public CommonRowSetTests() {
+ try {
+ rsf = RowSetProvider.newFactory();
+ } catch (SQLException ex) {
+ Assert.fail(ex.getMessage());
+ }
+ }
+
+ // Create an instance of the RowSet we are using
+ protected abstract <T extends RowSet> T newInstance() throws SQLException;
+
+ //DataProvider to use for common tests
+
+ /*
+ * DataProvider used to specify the value to set and check for the
+ * methods for fetch direction
+ */
+ @DataProvider(name = "rowSetFetchDirection")
+ protected Object[][] rowSetFetchDirection() throws Exception {
+ RowSet rs = newInstance();
+ return new Object[][]{
+ {rs, ResultSet.FETCH_FORWARD},
+ {rs, ResultSet.FETCH_REVERSE},
+ {rs, ResultSet.FETCH_UNKNOWN}
+ };
+ }
+
+ /*
+ * DataProvider used to specify the value to set and check for the
+ * methods for Cursor Scroll Type
+ */
+ @DataProvider(name = "rowSetScrollTypes")
+ protected Object[][] rowSetScrollTypes() throws Exception {
+ RowSet rs = newInstance();
+
+ return new Object[][]{
+ {rs, ResultSet.TYPE_FORWARD_ONLY},
+ {rs, ResultSet.TYPE_SCROLL_INSENSITIVE},
+ {rs, ResultSet.TYPE_SCROLL_SENSITIVE}
+ };
+ }
+
+ /*
+ * DataProvider used to specify the value to set and check for
+ * methods using transaction isolation types
+ */
+ @DataProvider(name = "rowSetIsolationTypes")
+ protected Object[][] rowSetIsolationTypes() throws Exception {
+ RowSet rs = newInstance();
+
+ return new Object[][]{
+ {rs, Connection.TRANSACTION_NONE},
+ {rs, Connection.TRANSACTION_READ_COMMITTED},
+ {rs, Connection.TRANSACTION_READ_UNCOMMITTED},
+ {rs, Connection.TRANSACTION_REPEATABLE_READ},
+ {rs, Connection.TRANSACTION_SERIALIZABLE}
+ };
+ }
+
+ /*
+ * DataProvider used to specify the value to set and check for the
+ * methods for Concurrency
+ */
+ @DataProvider(name = "rowSetConcurrencyTypes")
+ protected Object[][] rowSetConcurrencyTypes() throws Exception {
+ RowSet rs = newInstance();
+ return new Object[][]{
+ {rs, ResultSet.CONCUR_READ_ONLY},
+ {rs, ResultSet.CONCUR_UPDATABLE}
+ };
+ }
+
+ /*
+ * DataProvider used to specify the value to set and check for
+ * methods using boolean values
+ */
+ @DataProvider(name = "rowSetTrueFalse")
+ protected Object[][] rowSetTrueFalse() throws Exception {
+ RowSet rs = newInstance();
+ return new Object[][]{
+ {rs, true},
+ {rs, false}
+ };
+ }
+ /*
+ * DataProvider used to specify the type of RowSet to use. We also must
+ * initialize the RowSet
+ */
+ @DataProvider(name = "rowSetType")
+ protected Object[][] rowSetType() throws Exception {
+
+ RowSet rs = newInstance();
+ return new Object[][]{
+ {rs}
+ };
+ }
+
+ /*
+ * Initializes a RowSet containing the COFFEE_HOUSES data
+ */
+ protected <T extends RowSet> T createCoffeeHousesRowSet() throws SQLException {
+ T rs = (T) newInstance();
+ initCoffeeHousesMetaData((CachedRowSet) rs);
+ createCoffeeHouseRows(rs);
+ // Make sure you are not on the insertRow
+ rs.moveToCurrentRow();
+ return rs;
+ }
+
+ /*
+ * Initializes a RowSet containing the COFFEE_HOUSES data
+ */
+ protected <T extends RowSet> T createCoffeesRowSet() throws SQLException {
+ T rs = (T) newInstance();
+ initCoffeesMetaData((CachedRowSet) rs);
+ createCoffeesRows(rs);
+ // Make sure you are not on the insertRow
+ rs.moveToCurrentRow();
+ return rs;
+ }
+
+ /*
+ * Initializes the COFFEE_HOUSES metadata
+ */
+ private void initCoffeeHousesMetaData(CachedRowSet crs) throws SQLException {
+ RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl();
+ crs.setType(RowSet.TYPE_SCROLL_INSENSITIVE);
+
+ /*
+ * CREATE TABLE COFFEE_HOUSES(
+ * STORE_ID Integer NOT NULL,
+ * CITY VARCHAR(32),
+ * COFFEE INTEGER NOT NULL,
+ * MERCH INTEGER NOT NULL,
+ * TOTAL INTEGER NOT NULL,
+ * PRIMARY KEY (STORE_ID))
+ */
+ rsmd.setColumnCount(COFFEE_HOUSES_COLUMN_NAMES.length);
+ for(int i = 1; i <= COFFEE_HOUSES_COLUMN_NAMES.length; i++){
+ rsmd.setColumnName(i, COFFEE_HOUSES_COLUMN_NAMES[i-1]);
+ rsmd.setColumnLabel(i, rsmd.getColumnName(i));
+ }
+
+ rsmd.setColumnType(1, Types.INTEGER);
+ rsmd.setColumnType(2, Types.VARCHAR);
+ rsmd.setColumnType(3, Types.INTEGER);
+ rsmd.setColumnType(4, Types.INTEGER);
+ rsmd.setColumnType(5, Types.INTEGER);
+ crs.setMetaData(rsmd);
+ crs.setTableName(COFFEE_HOUSES_TABLE);
+
+ }
+
+ /*
+ * Add rows to COFFEE_HOUSES table
+ */
+ protected void createCoffeeHouseRows(RowSet rs) throws SQLException {
+
+ // insert into COFFEE_HOUSES values(10023, 'Mendocino', 3450, 2005, 5455)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10023);
+ rs.updateString(2, "Mendocino");
+ rs.updateInt(3, 3450);
+ rs.updateInt(4, 2005);
+ rs.updateInt(5, 5455);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(33002, 'Seattle', 4699, 3109, 7808)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 33002);
+ rs.updateString(2, "Seattle");
+ rs.updateInt(3, 4699);
+ rs.updateInt(4, 3109);
+ rs.updateInt(5, 7808);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10040, 'SF', 5386, 2841, 8227)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10040);
+ rs.updateString(2, "SF");
+ rs.updateInt(3, 5386);
+ rs.updateInt(4, 2841);
+ rs.updateInt(5, 8227);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(32001, 'Portland', 3147, 3579, 6726)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 32001);
+ rs.updateString(2, "Portland");
+ rs.updateInt(3, 3147);
+ rs.updateInt(4, 3579);
+ rs.updateInt(5, 6726);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10042, 'SF', 2863, 1874, 4710)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10042);
+ rs.updateString(2, "SF");
+ rs.updateInt(3, 2863);
+ rs.updateInt(4, 1874);
+ rs.updateInt(5, 4710);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10024, 'Sacramento', 1987, 2341, 4328)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10024);
+ rs.updateString(2, "Sacramento");
+ rs.updateInt(3, 1987);
+ rs.updateInt(4, 2341);
+ rs.updateInt(5, 4328);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10039, 'Carmel', 2691, 1121, 3812)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10039);
+ rs.updateString(2, "Carmel");
+ rs.updateInt(3, 2691);
+ rs.updateInt(4, 1121);
+ rs.updateInt(5, 3812);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10041, 'LA', 1533, 1007, 2540)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10041);
+ rs.updateString(2, "LA");
+ rs.updateInt(3, 1533);
+ rs.updateInt(4, 1007);
+ rs.updateInt(5, 2540);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(33005, 'Olympia', 2733, 1550, 1550)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 33005);
+ rs.updateString(2, "Olympia");
+ rs.updateInt(3, 2733);
+ rs.updateInt(4, 1550);
+ rs.updateInt(5, 1550);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(33010, 'Seattle', 3210, 2177, 5387)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 33010);
+ rs.updateString(2, "Seattle");
+ rs.updateInt(3, 3210);
+ rs.updateInt(4, 2177);
+ rs.updateInt(5, 5387);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10035, 'SF', 1922, 1056, 2978)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10035);
+ rs.updateString(2, "SF");
+ rs.updateInt(3, 1922);
+ rs.updateInt(4, 1056);
+ rs.updateInt(5, 2978);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10037, 'LA', 2143, 1876, 4019)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10037);
+ rs.updateString(2, "LA");
+ rs.updateInt(3, 2143);
+ rs.updateInt(4, 1876);
+ rs.updateInt(5, 4019);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(10034, 'San_Jose', 1234, 1032, 2266)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10034);
+ rs.updateString(2, "San Jose");
+ rs.updateInt(3, 1234);
+ rs.updateInt(4, 1032);
+ rs.updateInt(5, 2266);
+ rs.insertRow();
+ // insert into COFFEE_HOUSES values(32004, 'Eugene', 1356, 1112, 2468)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 32004);
+ rs.updateString(2, "Eugene");
+ rs.updateInt(3, 1356);
+ rs.updateInt(4, 1112);
+ rs.updateInt(5, 2468);
+ rs.insertRow();
+ rs.moveToCurrentRow();
+ }
+
+ /*
+ * Initializes the COFFEES metadata
+ */
+ protected void initCoffeesMetaData(CachedRowSet crs) throws SQLException {
+ RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl();
+ crs.setType(RowSet.TYPE_SCROLL_INSENSITIVE);
+
+ /*
+ * CREATE TABLE COFFEES (
+ * COF_ID INTEGER NOT NULL,
+ * COF_NAME VARCHAR(32) NOT NULL,
+ * SUP_ID INTEGER NOT NULL,
+ * PRICE NUMBERIC(10,2 NOT NULL,
+ * SALES INTEGER NOT NULL,
+ * TOTAL INTEGER NOT NULL,
+ * PRIMARY KEY (COF_ID),
+ * FOREIGN KEY (SUP_ID) REFERENCES SUPPLIERS (SUP_ID) )
+ */
+ rsmd.setColumnCount(COFFEES_COLUMN_NAMES.length);
+ for(int i = 1; i <= COFFEES_COLUMN_NAMES.length; i++){
+ rsmd.setColumnName(i, COFFEES_COLUMN_NAMES[i-1]);
+ rsmd.setColumnLabel(i, rsmd.getColumnName(i));
+ }
+
+ rsmd.setColumnType(1, Types.INTEGER);
+ rsmd.setColumnType(2, Types.VARCHAR);
+ rsmd.setColumnType(3, Types.INTEGER);
+ rsmd.setColumnType(4, Types.NUMERIC);
+ rsmd.setPrecision(4, 10);
+ rsmd.setScale(4, 2);
+ rsmd.setColumnType(5, Types.INTEGER);
+ rsmd.setColumnType(6, Types.INTEGER);
+ crs.setMetaData(rsmd);
+ crs.setTableName(COFFEES_TABLE);
+
+ }
+
+ /*
+ * Add rows to COFFEES table
+ */
+ protected void createCoffeesRows(RowSet rs) throws SQLException {
+
+ // insert into COFFEES values(1, 'Colombian', 101, 7.99, 0, 0)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 1);
+ rs.updateString(2, "Colombian");
+ rs.updateInt(3, 101);
+ rs.updateBigDecimal(4, BigDecimal.valueOf(7.99));
+ rs.updateInt(5, 0);
+ rs.updateInt(6, 0);
+ rs.insertRow();
+ // insert into COFFEES values(2, 'French_Roast', 49, 8.99, 0, 0)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 2);
+ rs.updateString(2, "French_Roast");
+ rs.updateInt(3, 49);
+ rs.updateBigDecimal(4, BigDecimal.valueOf(8.99));
+ rs.updateInt(5, 0);
+ rs.updateInt(6, 0);
+ rs.insertRow();
+ // insert into COFFEES values(3, 'Espresso', 150, 9.99, 0, 0)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 3);
+ rs.updateString(2, "Espresso");
+ rs.updateInt(3, 150);
+ rs.updateBigDecimal(4, BigDecimal.valueOf(9.99));
+ rs.updateInt(5, 0);
+ rs.updateInt(6, 0);
+ rs.insertRow();
+ // insert into COFFEES values(4, 'Colombian_Decaf', 101, 8.99, 0, 0)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 4);
+ rs.updateString(2, "Colombian_Decaf");
+ rs.updateInt(3, 101);
+ rs.updateBigDecimal(4, BigDecimal.valueOf(8.99));
+ rs.updateInt(5, 0);
+ rs.updateInt(6, 0);
+ rs.insertRow();
+ // insert into COFFEES values(5, 'French_Roast_Decaf', 049, 9.99, 0, 0)
+ rs.moveToInsertRow();
+ rs.updateInt(1, 5);
+ rs.updateString(2, "French_Roast_Decaf");
+ rs.updateInt(3, 49);
+ rs.updateBigDecimal(4, BigDecimal.valueOf(9.99));
+ rs.updateInt(5, 0);
+ rs.updateInt(6, 0);
+ rs.insertRow();
+
+ }
+
+
+ /*
+ * Utility method to return the Primary Keys for a RowSet. The Primary
+ * keys are assumed to be in the first column of the RowSet
+ */
+ protected Object[] getPrimaryKeys(ResultSet rs) throws SQLException {
+ List<? super Object> result = new ArrayList<>();
+ if (rs == null) {
+ return null;
+ }
+ rs.beforeFirst();
+ while (rs.next()) {
+ result.add(rs.getInt(1));
+ }
+ return result.toArray();
+ }
+
+ /*
+ * Utility method to display the RowSet and will return the row count
+ * it found
+ */
+ protected int displayResults(ResultSet rs) throws SQLException {
+ int rows = 0;
+ ResultSetMetaData rsmd = rs.getMetaData();
+ int cols = rsmd.getColumnCount();
+ if (rs != null) {
+ rs.beforeFirst();
+ while (rs.next()) {
+ rows++;
+
+ for (int i = 0; i < cols; i++) {
+ System.out.print(rs.getString(i + 1) + " ");
+ }
+ System.out.println();
+ }
+ }
+
+ return rows;
+ }
+
+
+ // Insert common tests here
+
+ /*
+ * Validate that getCommand() returns null by default
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0000(RowSet rs) {
+ assertNull(rs.getCommand());
+ }
+
+ /*
+ * Validate that getCommand() returns command specified to setCommand
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0001(RowSet rs) throws Exception {
+ rs.setCommand(query);
+ assertTrue(rs.getCommand().equals(query));
+ }
+
+
+ /*
+ * Validate that getCurrency() returns the correct default value
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0002(RowSet rs) throws Exception {
+ assertTrue(rs.getConcurrency() == ResultSet.CONCUR_UPDATABLE);
+ }
+
+ /*
+ * Validate that getCurrency() returns the correct value
+ * after a call to setConcurrency())
+ */
+ @Test(dataProvider = "rowSetConcurrencyTypes")
+ public void commonRowSetTest0003(RowSet rs, int concurType) throws Exception {
+ rs.setConcurrency(concurType);
+ assertTrue(rs.getConcurrency() == concurType);
+ }
+
+ /*
+ * Validate that getCurrency() throws a SQLException for an invalid value
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonRowSetTest0004(RowSet rs) throws Exception {
+ rs.setConcurrency(ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ }
+
+ /*
+ * Validate that getDataSourceName() returns null by default
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0005(RowSet rs) throws Exception {
+ assertTrue(rs.getDataSourceName() == null);
+ }
+
+ /*
+ * Validate that getDataSourceName() returns the value specified
+ * by setDataSourceName() and getUrl() returns null
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0006(RowSet rs) throws Exception {
+ rs.setUrl(url);
+ rs.setDataSourceName(dsName);
+ assertTrue(rs.getDataSourceName().equals(dsName));
+ assertNull(rs.getUrl());
+ }
+
+ /*
+ * Validate that setDataSourceName() throws a SQLException for an empty
+ * String specified for the data source name
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonRowSetTest0007(RowSet rs) throws Exception {
+ String dsname = "";
+ rs.setDataSourceName(dsname);
+ }
+
+ /*
+ * Validate that getEscapeProcessing() returns false by default
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0008(RowSet rs) throws Exception {
+ assertTrue(rs.getEscapeProcessing());
+ }
+
+ /*
+ * Validate that getEscapeProcessing() returns value set by
+ * setEscapeProcessing()
+ */
+ @Test(dataProvider = "rowSetTrueFalse")
+ public void commonRowSetTest0009(RowSet rs, boolean val) throws Exception {
+ rs.setEscapeProcessing(val);
+ assertTrue(rs.getEscapeProcessing() == val);
+ }
+
+ /*
+ * Validate that getFetchDirection() returns the correct default value
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0010(RowSet rs) throws Exception {
+ assertTrue(rs.getFetchDirection() == ResultSet.FETCH_FORWARD);
+ }
+
+ /*
+ * Validate that getFetchDirection() returns the value set by
+ * setFetchDirection()
+ */
+ @Test(dataProvider = "rowSetFetchDirection")
+ public void commonRowSetTest0011(RowSet rs, int direction) throws Exception {
+ rs.setFetchDirection(direction);
+ assertTrue(rs.getFetchDirection() == direction);
+ }
+
+ /*
+ * Validate that setFetchSize() throws a SQLException for an invalid value
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonRowSetTest0013(RowSet rs) throws Exception {
+ rs.setFetchSize(-1);
+ }
+
+ /*
+ * Validate that setFetchSize() throws a SQLException for a
+ * value greater than getMaxRows()
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonRowSetTest0014(RowSet rs) throws Exception {
+ rs.setMaxRows(5);
+ rs.setFetchSize(rs.getMaxRows() + 1);
+ }
+
+ /*
+ * Validate that getFetchSize() returns the correct value after
+ * setFetchSize() has been called
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0015(RowSet rs) throws Exception {
+ int maxRows = 150;
+ rs.setFetchSize(0);
+ assertTrue(rs.getFetchSize() == 0);
+ rs.setFetchSize(100);
+ assertTrue(rs.getFetchSize() == 100);
+ rs.setMaxRows(maxRows);
+ rs.setFetchSize(maxRows);
+ assertTrue(rs.getFetchSize() == maxRows);
+ }
+
+ /*
+ * Validate that setMaxFieldSize() throws a SQLException for an invalid value
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonRowSetTest0016(RowSet rs) throws Exception {
+ rs.setMaxFieldSize(-1);
+ }
+
+ /*
+ * Validate that getMaxFieldSize() returns the value set by
+ * setMaxFieldSize()
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0017(RowSet rs) throws Exception {
+ rs.setMaxFieldSize(0);
+ assertTrue(rs.getMaxFieldSize() == 0);
+ rs.setMaxFieldSize(100);
+ assertTrue(rs.getMaxFieldSize() == 100);
+ rs.setMaxFieldSize(50);
+ assertTrue(rs.getMaxFieldSize() == 50);
+ }
+
+ /*
+ * Validate that isReadOnly() returns value set by
+ * setReadOnly()
+ */
+ @Test(dataProvider = "rowSetTrueFalse")
+ public void commonRowSetTest0018(RowSet rs, boolean val) throws Exception {
+ rs.setReadOnly(val);
+ assertTrue(rs.isReadOnly() == val);
+ }
+
+ /*
+ * Validate that getTransactionIsolation() returns value set by
+ * setTransactionIsolation()
+ */
+ @Test(dataProvider = "rowSetIsolationTypes")
+ public void commonRowSetTest0019(RowSet rs, int val) throws Exception {
+ rs.setTransactionIsolation(val);
+ assertTrue(rs.getTransactionIsolation() == val);
+ }
+
+ /*
+ * Validate that getType() returns value set by setType()
+ */
+ @Test(dataProvider = "rowSetScrollTypes")
+ public void commonRowSetTest0020(RowSet rs, int val) throws Exception {
+ rs.setType(val);
+ assertTrue(rs.getType() == val);
+ }
+
+ /*
+ * Validate that getEscapeProcessing() returns value set by
+ * setEscapeProcessing()
+ */
+ @Test(dataProvider = "rowSetTrueFalse")
+ public void commonRowSetTest0021(BaseRowSet rs, boolean val) throws Exception {
+ rs.setShowDeleted(val);
+ assertTrue(rs.getShowDeleted() == val);
+ }
+
+ /*
+ * Validate that getTypeMap() returns same value set by
+ * setTypeMap()
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0022(RowSet rs) throws Exception {
+ Map<String, Class<?>> map = new HashMap<>();
+ map.put("SUPERHERO", Class.forName("util.SuperHero"));
+ rs.setTypeMap(map);
+ assertTrue(rs.getTypeMap().equals(map));
+ }
+
+ /*
+ * Validate that getUsername() returns same value set by
+ * setUsername()
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0023(RowSet rs) throws Exception {
+ rs.setUsername(user);
+ assertTrue(rs.getUsername().equals(user));
+ }
+
+ /*
+ * Validate that getPassword() returns same password set by
+ * setPassword()
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0024(RowSet rs) throws Exception {
+ rs.setPassword(password);
+ assertTrue(rs.getPassword().equals(password));
+ }
+
+ /*
+ * Validate that getQueryTimeout() returns same value set by
+ * setQueryTimeout() and that 0 is a valid timeout value
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0025(RowSet rs) throws Exception {
+ int timeout = 0;
+ rs.setQueryTimeout(timeout);
+ assertTrue(rs.getQueryTimeout() == timeout);
+ }
+
+ /*
+ * Validate that getQueryTimeout() returns same value set by
+ * setQueryTimeout() and that 0 is a valid timeout value
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0026(RowSet rs) throws Exception {
+ int timeout = 10000;
+ rs.setQueryTimeout(timeout);
+ assertTrue(rs.getQueryTimeout() == timeout);
+ }
+
+ /*
+ * Validate that setQueryTimeout() throws a SQLException for a timeout
+ * value < 0
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonRowSetTest0027(RowSet rs) throws Exception {
+ rs.setQueryTimeout(-1);
+ }
+
+
+ /*
+ * Validate addRowSetListener does not throw an Exception when null is
+ * passed as the parameter
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0028(RowSet rs) throws Exception {
+ rs.addRowSetListener(null);
+ }
+
+ /*
+ * Validate removeRowSetListener does not throw an Exception when null is
+ * passed as the parameter
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0029(RowSet rs) throws Exception {
+ rs.removeRowSetListener(null);
+ }
+
+ /*
+ * Set two parameters and then validate clearParameters() will clear them
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0030(BaseRowSet rs) throws Exception {
+ rs.setInt(1, 1);
+ rs.setString(2, query);
+ assertTrue(rs.getParams().length == 2);
+ rs.clearParameters();
+ assertTrue(rs.getParams().length == 0);
+ }
+
+ /*
+ * Validate that getURL() returns same value set by
+ * setURL()
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonRowSetTest0031(RowSet rs) throws Exception {
+ rs.setUrl(url);
+ assertTrue(rs.getUrl().equals(url));
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0100(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setAsciiStream(1, is);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0101(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setAsciiStream("one", is);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0102(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setAsciiStream("one", is, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0103(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setBinaryStream(1, is);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0104(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setBinaryStream("one", is);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0105(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setBinaryStream("one", is, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0106(RowSet rs) throws Exception {
+ rs.setBigDecimal("one", BigDecimal.ONE);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0107(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setBlob(1, is);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0108(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setBlob("one", is);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0109(RowSet rs) throws Exception {
+ InputStream is = null;
+ rs.setBlob("one", is, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0110(RowSet rs) throws Exception {
+ rs.setBlob("one", new StubBlob());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0111(RowSet rs) throws Exception {
+ rs.setBoolean("one", true);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0112(RowSet rs) throws Exception {
+ byte b = 1;
+ rs.setByte("one", b);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0113(RowSet rs) throws Exception {
+ byte b = 1;
+ rs.setBytes("one", new byte[10]);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0114(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setCharacterStream("one", rdr, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0115(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setCharacterStream("one", rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0116(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setCharacterStream(1, rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0117(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setClob(1, rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0118(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setClob("one", rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0119(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setClob("one", rdr, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0120(RowSet rs) throws Exception {
+ rs.setClob("one", new StubClob());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0121(RowSet rs) throws Exception {
+ rs.setDate("one", Date.valueOf(LocalDate.now()));
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0122(RowSet rs) throws Exception {
+ rs.setDate("one", Date.valueOf(LocalDate.now()),
+ Calendar.getInstance());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0123(RowSet rs) throws Exception {
+ rs.setTime("one", Time.valueOf(LocalTime.now()));
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0124(RowSet rs) throws Exception {
+ rs.setTime("one", Time.valueOf(LocalTime.now()),
+ Calendar.getInstance());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0125(RowSet rs) throws Exception {
+ rs.setTimestamp("one", Timestamp.valueOf(LocalDateTime.now()));
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0126(RowSet rs) throws Exception {
+ rs.setTimestamp("one", Timestamp.valueOf(LocalDateTime.now()),
+ Calendar.getInstance());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0127(RowSet rs) throws Exception {
+ rs.setDouble("one", 2.0d);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0128(RowSet rs) throws Exception {
+ rs.setFloat("one", 2.0f);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0129(RowSet rs) throws Exception {
+ rs.setInt("one", 21);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0130(RowSet rs) throws Exception {
+ rs.setLong("one", 21l);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0131(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setNCharacterStream("one", rdr, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0132(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setNCharacterStream("one", rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0133(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setNCharacterStream(1, rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0134(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setNCharacterStream(1, rdr, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0135(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setClob("one", rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0136(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setClob("one", rdr, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0137(RowSet rs) throws Exception {
+ rs.setNClob("one", new StubNClob());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0138(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setNClob(1, rdr);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0139(RowSet rs) throws Exception {
+ Reader rdr = null;
+ rs.setNClob(1, rdr, query.length());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0140(RowSet rs) throws Exception {
+ rs.setNClob(1, new StubNClob());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0141(RowSet rs) throws Exception {
+ rs.setNString(1, query);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0142(RowSet rs) throws Exception {
+ rs.setNull("one", Types.INTEGER);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0143(RowSet rs) throws Exception {
+ rs.setNull("one", Types.INTEGER, "my.type");
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0144(RowSet rs) throws Exception {
+ rs.setObject("one", query, Types.VARCHAR);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0145(RowSet rs) throws Exception {
+ rs.setObject("one", query, Types.VARCHAR, 0);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0146(RowSet rs) throws Exception {
+ rs.setObject("one", query);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0147(RowSet rs) throws Exception {
+ RowId aRowid = null;
+ rs.setRowId("one", aRowid);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0148(RowSet rs) throws Exception {
+ rs.setSQLXML("one", new StubSQLXML());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0149(RowSet rs) throws Exception {
+ rs.setSQLXML(1, new StubSQLXML());
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0150(RowSet rs) throws Exception {
+ rs.setNString(1, query);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0151(RowSet rs) throws Exception {
+ rs.setNString("one", query);
+ }
+
+ /*
+ * This method is currently not implemented in BaseRowSet and will
+ * throw a SQLFeatureNotSupportedException
+ */
+ @Test(dataProvider = "rowSetType",
+ expectedExceptions = SQLFeatureNotSupportedException.class)
+ public void commonRowSetTest0152(RowSet rs) throws Exception {
+ short val = 21;
+ rs.setShort("one", val);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/cachedrowset/CachedRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test.rowset.cachedrowset;
+
+import java.sql.SQLException;
+import javax.sql.rowset.CachedRowSet;
+
+public class CachedRowSetTests extends CommonCachedRowSetTests {
+
+ @Override
+ protected CachedRowSet newInstance() throws SQLException {
+ return rsf.createCachedRowSet();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/cachedrowset/CommonCachedRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,1612 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 test.rowset.cachedrowset;
+
+import java.math.BigDecimal;
+import java.sql.Array;
+import java.sql.Date;
+import java.sql.JDBCType;
+import java.sql.Ref;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.sql.Types;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Collection;
+import javax.sql.RowSet;
+import javax.sql.rowset.CachedRowSet;
+import javax.sql.rowset.RowSetMetaDataImpl;
+import javax.sql.rowset.serial.SerialRef;
+import javax.sql.rowset.spi.SyncFactory;
+import javax.sql.rowset.spi.SyncProvider;
+import javax.sql.rowset.spi.SyncProviderException;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import test.rowset.CommonRowSetTests;
+import util.StubArray;
+import util.StubRef;
+import util.StubSyncProvider;
+import util.TestRowSetListener;
+
+public abstract class CommonCachedRowSetTests extends CommonRowSetTests {
+
+ /*
+ * DATATYPES Table column names
+ */
+ private final String[] DATATYPES_COLUMN_NAMES = {"AINTEGER", "ACHAR",
+ "AVARCHAR", "ALONG", "ABOOLEAN", "ASHORT", "ADOUBLE", "ABIGDECIMAL",
+ "AREAL", "ABYTE", "ADATE", "ATIME", "ATIMESTAMP", "ABYTES", "ARRAY",
+ "AREF", "AFLOAT"};
+
+ /*
+ * Initializes a RowSet containing the DATAYPES data
+ */
+ protected <T extends RowSet> T createDataTypesRowSet() throws SQLException {
+ T rs = (T) newInstance();
+ initDataTypesMetaData((CachedRowSet) rs);
+ createDataTypesRows(rs);
+ // Make sure you are not on the insertRow
+ rs.moveToCurrentRow();
+ return rs;
+ }
+
+ //DataProviders to use for common tests
+
+ /*
+ * DataProvider that uses a RowSet with the COFFEE_HOUSES Table
+ */
+ @DataProvider(name = "rowsetUsingCoffeeHouses")
+ protected Object[][] rowsetUsingCoffeeHouses() throws Exception {
+ RowSet rs = createCoffeeHousesRowSet();
+ return new Object[][]{
+ {rs}
+ };
+ }
+
+ /*
+ * DataProvider that uses a RowSet with the COFFEES Table
+ */
+ @DataProvider(name = "rowsetUsingCoffees")
+ protected Object[][] rowsetUsingCoffees() throws Exception {
+ RowSet rs = createCoffeesRowSet();
+ return new Object[][]{
+ {rs}
+ };
+ }
+
+ /*
+ * DataProvider that uses a RowSet with the DATAYPES Table and
+ * used to validate the various supported data types
+ */
+ @DataProvider(name = "rowsetUsingDataTypes")
+ protected Object[][] rowsetUsingDataTypes() throws Exception {
+
+ CachedRowSet rs = createDataTypesRowSet();
+ return new Object[][]{
+ {rs, JDBCType.INTEGER},
+ {rs, JDBCType.CHAR},
+ {rs, JDBCType.VARCHAR},
+ {rs, JDBCType.BIGINT},
+ {rs, JDBCType.BOOLEAN},
+ {rs, JDBCType.SMALLINT},
+ {rs, JDBCType.DOUBLE},
+ {rs, JDBCType.DECIMAL},
+ {rs, JDBCType.REAL},
+ {rs, JDBCType.TINYINT},
+ {rs, JDBCType.DATE},
+ {rs, JDBCType.TIME},
+ {rs, JDBCType.TIMESTAMP},
+ {rs, JDBCType.VARBINARY},
+ {rs, JDBCType.ARRAY},
+ {rs, JDBCType.REF},
+ {rs, JDBCType.FLOAT}
+ };
+ }
+
+ /*
+ * Initializes the DATAYPES table metadata
+ */
+ protected void initDataTypesMetaData(CachedRowSet crs) throws SQLException {
+ RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl();
+ crs.setType(RowSet.TYPE_SCROLL_INSENSITIVE);
+
+ rsmd.setColumnCount(DATATYPES_COLUMN_NAMES.length);
+
+ for (int i = 1; i <= DATATYPES_COLUMN_NAMES.length; i++) {
+ rsmd.setColumnName(i, DATATYPES_COLUMN_NAMES[i - 1]);
+ rsmd.setColumnLabel(i, rsmd.getColumnName(i));
+ }
+
+ rsmd.setColumnType(1, Types.INTEGER);
+ rsmd.setColumnType(2, Types.CHAR);
+ rsmd.setColumnType(3, Types.VARCHAR);
+ rsmd.setColumnType(4, Types.BIGINT);
+ rsmd.setColumnType(5, Types.BOOLEAN);
+ rsmd.setColumnType(6, Types.SMALLINT);
+ rsmd.setColumnType(7, Types.DOUBLE);
+ rsmd.setColumnType(8, Types.DECIMAL);
+ rsmd.setColumnType(9, Types.REAL);
+ rsmd.setColumnType(10, Types.TINYINT);
+ rsmd.setColumnType(11, Types.DATE);
+ rsmd.setColumnType(12, Types.TIME);
+ rsmd.setColumnType(13, Types.TIMESTAMP);
+ rsmd.setColumnType(14, Types.VARBINARY);
+ rsmd.setColumnType(15, Types.ARRAY);
+ rsmd.setColumnType(16, Types.REF);
+ rsmd.setColumnType(17, Types.FLOAT);
+ crs.setMetaData(rsmd);
+
+ }
+
+ /*
+ * Add rows to DATAYPES table
+ */
+ protected void createDataTypesRows(RowSet crs) throws SQLException {
+
+ Integer aInteger = 100;
+ String aChar = "Oswald Cobblepot";
+ Long aLong = Long.MAX_VALUE;
+ Short aShort = Short.MAX_VALUE;
+ Double aDouble = Double.MAX_VALUE;
+ BigDecimal aBigDecimal = BigDecimal.ONE;
+ Boolean aBoolean = false;
+ Float aFloat = Float.MAX_VALUE;
+ Byte aByte = Byte.MAX_VALUE;
+ Date aDate = Date.valueOf(LocalDate.now());
+ Time aTime = Time.valueOf(LocalTime.now());
+ Timestamp aTimeStamp = Timestamp.valueOf(LocalDateTime.now());
+ Array aArray = new StubArray("INTEGER", new Object[1]);
+ Ref aRef = new SerialRef(new StubRef("INTEGER", query));
+ byte[] bytes = new byte[10];
+ crs.moveToInsertRow();
+ crs.updateInt(1, aInteger);
+ crs.updateString(2, aChar);
+ crs.updateString(3, aChar);
+ crs.updateLong(4, aLong);
+ crs.updateBoolean(5, aBoolean);
+ crs.updateShort(6, aShort);
+ crs.updateDouble(7, aDouble);
+ crs.updateBigDecimal(8, aBigDecimal);
+ crs.updateFloat(9, aFloat);
+ crs.updateByte(10, aByte);
+ crs.updateDate(11, aDate);
+ crs.updateTime(12, aTime);
+ crs.updateTimestamp(13, aTimeStamp);
+ crs.updateBytes(14, bytes);
+ crs.updateArray(15, aArray);
+ crs.updateRef(16, aRef);
+ crs.updateDouble(17, aDouble);
+ crs.insertRow();
+ crs.moveToCurrentRow();
+
+ }
+
+ /*
+ * Dermine if a Row exists in a ResultSet by its primary key
+ * If the parameter deleteRow is true, delete the row and validate
+ * the RowSet indicates it is deleted
+ */
+ protected boolean findRowByPrimaryKey(RowSet rs, int id, int idPos,
+ boolean deleteRow) throws Exception {
+ boolean foundRow = false;
+ rs.beforeFirst();
+ while (rs.next()) {
+ if (rs.getInt(idPos) == id) {
+ foundRow = true;
+ if (deleteRow) {
+ rs.deleteRow();
+ // validate row is marked as deleted
+ assertTrue(rs.rowDeleted());
+ }
+ break;
+ }
+ }
+ return foundRow;
+ }
+
+ /*
+ * Wrapper method to find if a row exists within a RowSet by its primary key
+ */
+ protected boolean findRowByPrimaryKey(RowSet rs, int id, int idPos) throws Exception {
+ return findRowByPrimaryKey(rs, id, idPos, false);
+ }
+
+ /*
+ * Wrapper method to find if a row exists within a RowSet by its primary key
+ * and delete it
+ */
+ protected boolean deleteRowByPrimaryKey(RowSet rs, int id, int idPos) throws Exception {
+ return findRowByPrimaryKey(rs, id, idPos, true);
+ }
+
+ /*
+ * Utility method that compares two ResultSetMetaDataImpls for containing
+ * the same values
+ */
+ private void compareMetaData(ResultSetMetaData rsmd,
+ ResultSetMetaData rsmd1) throws SQLException {
+
+ assertEquals(rsmd1.getColumnCount(), rsmd.getColumnCount());
+ int cols = rsmd.getColumnCount();
+ for (int i = 1; i <= cols; i++) {
+ assertTrue(rsmd1.getCatalogName(i).equals(rsmd.getCatalogName(i)));
+ assertTrue(rsmd1.getColumnClassName(i).equals(rsmd.getColumnClassName(i)));
+ assertTrue(rsmd1.getColumnDisplaySize(i) == rsmd.getColumnDisplaySize(i));
+ assertTrue(rsmd1.getColumnLabel(i).equals(rsmd.getColumnLabel(i)));
+ assertTrue(rsmd1.getColumnName(i).equals(rsmd.getColumnName(i)));
+ assertTrue(rsmd1.getColumnType(i) == rsmd.getColumnType(i));
+ assertTrue(rsmd1.getPrecision(i) == rsmd.getPrecision(i));
+ assertTrue(rsmd1.getScale(i) == rsmd.getScale(i));
+ assertTrue(rsmd1.getSchemaName(i).equals(rsmd.getSchemaName(i)));
+ assertTrue(rsmd1.getTableName(i).equals(rsmd.getTableName(i)));
+ assertTrue(rsmd1.isAutoIncrement(i) == rsmd.isAutoIncrement(i));
+ assertTrue(rsmd1.isCaseSensitive(i) == rsmd.isCaseSensitive(i));
+ assertTrue(rsmd1.isCurrency(i) == rsmd.isCurrency(i));
+ assertTrue(rsmd1.isDefinitelyWritable(i) == rsmd.isDefinitelyWritable(i));
+ assertTrue(rsmd1.isNullable(i) == rsmd.isNullable(i));
+ assertTrue(rsmd1.isReadOnly(i) == rsmd.isReadOnly(i));
+ assertTrue(rsmd1.isSearchable(i) == rsmd.isSearchable(i));
+ assertTrue(rsmd1.isSigned(i) == rsmd.isSigned(i));
+ assertTrue(rsmd1.isWritable(i) == rsmd.isWritable(i));
+
+ }
+ }
+
+ /*
+ * Utility method to compare two rowsets
+ */
+ private void compareRowSets(CachedRowSet crs, CachedRowSet crs1) throws Exception {
+
+ int rows = crs.size();
+ assertTrue(rows == crs1.size());
+
+ ResultSetMetaData rsmd = crs.getMetaData();
+
+ compareMetaData(rsmd, crs1.getMetaData());
+ int cols = rsmd.getColumnCount();
+
+ for (int row = 1; row <= rows; row++) {
+ crs.absolute((row));
+ crs1.absolute(row);
+ for (int col = 1; col <= cols; col++) {
+ compareColumnValue(JDBCType.valueOf(rsmd.getColumnType(col)),
+ crs, crs1, col);
+ }
+ }
+
+ }
+
+ /*
+ * Utility method to compare two columns
+ */
+ private void compareColumnValue(JDBCType type, ResultSet rs, ResultSet rs1,
+ int col) throws SQLException {
+
+ switch (type) {
+ case INTEGER:
+ assertTrue(rs.getInt(col) == rs1.getInt(col));
+ break;
+ case CHAR:
+ case VARCHAR:
+ assertTrue(rs.getString(col).equals(rs1.getString(col)));
+ break;
+ case BIGINT:
+ assertTrue(rs.getLong(col) == rs1.getLong(col));
+ break;
+ case BOOLEAN:
+ assertTrue(rs.getBoolean(col) == rs1.getBoolean(col));
+ break;
+ case SMALLINT:
+ assertTrue(rs.getShort(col) == rs1.getShort(col));
+ break;
+ case DOUBLE:
+ case FLOAT:
+ assertTrue(rs.getDouble(col) == rs1.getDouble(col));
+ break;
+ case DECIMAL:
+ assertTrue(rs.getBigDecimal(col).equals(rs1.getBigDecimal(col)));
+ break;
+ case REAL:
+ assertTrue(rs.getFloat(col) == rs1.getFloat(col));
+ break;
+ case TINYINT:
+ assertTrue(rs.getByte(col) == rs1.getByte(col));
+ break;
+ case DATE:
+ assertTrue(rs.getDate(col).equals(rs1.getDate(col)));
+ break;
+ case TIME:
+ assertTrue(rs.getTime(col).equals(rs1.getTime(col)));
+ break;
+ case TIMESTAMP:
+ assertTrue(rs.getTimestamp(col).equals(rs1.getTimestamp(col)));
+ break;
+ }
+ }
+
+ /*
+ * Validate SyncProviderException is thrown when acceptChanges is called
+ * but there is not a way to make a connection to the datasource
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SyncProviderException.class)
+ public void commonCachedRowSetTest0000(CachedRowSet rs) throws Exception {
+ rs.acceptChanges();
+ rs.close();
+ }
+
+ /*
+ * Validate SyncProviderException is thrown when acceptChanges is called
+ * when null is passed as the datasource
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SyncProviderException.class)
+ public void commonCachedRowSetTest0001(CachedRowSet rs) throws Exception {
+ rs.acceptChanges(null);
+ rs.close();
+ }
+
+ /*
+ * Validate that that RIOPtimsticProvider is the default SyncProvider
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0002(CachedRowSet rs) throws SQLException {
+ SyncProvider sp = rs.getSyncProvider();
+ assertTrue(sp instanceof com.sun.rowset.providers.RIOptimisticProvider);
+ rs.close();
+ }
+
+ /*
+ * Validate that you can specify a SyncProvider
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0003(CachedRowSet rs) throws SQLException {
+
+ // Register a provider and make sure it is avaiable
+ SyncFactory.registerProvider(stubProvider);
+ rs.setSyncProvider(stubProvider);
+ SyncProvider sp = rs.getSyncProvider();
+ assertTrue(sp instanceof StubSyncProvider);
+ SyncFactory.unregisterProvider(stubProvider);
+ rs.close();
+ }
+
+ /*
+ * Create a RowSetListener and validate that notifyRowSetChanged is called
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0004(CachedRowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.release();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
+ rs.close();
+ }
+
+ /*
+ * Create a RowSetListener and validate that notifyRowSetChanged is called
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0005(CachedRowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.restoreOriginal();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
+ rs.close();
+ }
+
+ /*
+ * Create a RowSetListener and validate that notifyRowChanged is called
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0006(RowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.moveToInsertRow();
+ rs.updateInt(1, 10024);
+ rs.updateString(2, "Sacramento");
+ rs.updateInt(3, 1987);
+ rs.updateInt(4, 2341);
+ rs.updateInt(5, 4328);
+ rs.insertRow();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED));
+ rs.close();
+ }
+
+ /*
+ * Create a multiple RowSetListeners and validate that notifyRowChanged,
+ * notifiyMoved is called on all listners
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0007(RowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ TestRowSetListener rsl2 = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.addRowSetListener(rsl2);
+ rs.first();
+ rs.updateInt(1, 1961);
+ rs.updateString(2, "Pittsburgh");
+ rs.updateInt(3, 1987);
+ rs.updateInt(4, 2341);
+ rs.updateInt(5, 6689);
+ rs.updateRow();
+ assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED
+ | TestRowSetListener.ROW_CHANGED));
+ assertTrue(rsl2.isNotified(TestRowSetListener.CURSOR_MOVED
+ | TestRowSetListener.ROW_CHANGED));
+ rs.close();
+ }
+
+ /*
+ * Create a RowSetListener and validate that notifyRowChanged and
+ * notifyCursorMoved are called
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0008(CachedRowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+
+ rs.first();
+ assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED));
+ rs.deleteRow();
+ assertTrue(
+ rsl.isNotified(TestRowSetListener.ROW_CHANGED | TestRowSetListener.CURSOR_MOVED));
+ rsl.resetFlag();
+ rs.setShowDeleted(true);
+ rs.undoDelete();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED));
+ rs.close();
+ }
+
+ /*
+ * Create a RowSetListener and validate that notifyCursorMoved is called
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0009(RowSet rs) throws Exception {
+ TestRowSetListener rsl = new TestRowSetListener();
+ rs.addRowSetListener(rsl);
+ rs.beforeFirst();
+ assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED));
+ rs.close();
+ }
+
+ /*
+ * Validate that getTableName() returns the proper values
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0010(CachedRowSet rs) throws Exception {
+ assertNull(rs.getTableName());
+ rs.setTableName(COFFEE_HOUSES_TABLE);
+ assertTrue(rs.getTableName().equals(COFFEE_HOUSES_TABLE));
+ rs.close();
+ }
+
+ /*
+ * Validate that getKeyColumns() returns the proper values
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0011(CachedRowSet rs) throws Exception {
+ int[] pkeys = {1, 3};
+ assertNull(rs.getKeyColumns());
+ rs.setKeyColumns(pkeys);
+ assertEquals(rs.getKeyColumns(), pkeys);
+ rs.close();
+ }
+
+ /*
+ * Validate that setMatchColumn throws a SQLException if the column
+ * index specified is out of range
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0012(CachedRowSet rs) throws Exception {
+ rs.setMatchColumn(-1);
+ rs.close();
+ }
+
+ /*
+ * Validate that setMatchColumn throws a SQLException if the column
+ * index specified is out of range
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0013(CachedRowSet rs) throws Exception {
+ int[] cols = {1, -1};
+ rs.setMatchColumn(cols);
+ rs.close();
+ }
+
+ /*
+ * Validate that setMatchColumn throws a SQLException if the column
+ * index specified is out of range
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0014(CachedRowSet rs) throws Exception {
+ rs.setMatchColumn((String) null);
+ rs.close();
+ }
+
+ /*
+ * Validate that setMatchColumn throws a SQLException if the column
+ * index specified is out of range
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0015(CachedRowSet rs) throws Exception {
+ String[] cols = {"ID", null};
+ rs.setMatchColumn(cols);
+ }
+
+ /*
+ * Validate that getMatchColumn returns the same value specified by
+ * setMatchColumn
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false)
+ public void commonCachedRowSetTest0016(CachedRowSet rs) throws Exception {
+ int[] expectedCols = {1};
+ String[] expectedColNames = {"ID"};
+ rs.setMatchColumn(1);
+ int[] actualCols = rs.getMatchColumnIndexes();
+ String[] actualColNames = rs.getMatchColumnNames();
+ for (int i = 0; i < actualCols.length; i++) {
+ System.out.println(actualCols[i]);
+ }
+ assertEquals(actualCols, expectedCols);
+ assertEquals(actualColNames, expectedColNames);
+ rs.close();
+ }
+
+ /*
+ * Validate that getMatchColumn returns the same value specified by
+ * setMatchColumn
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false)
+ public void commonCachedRowSetTest0017(CachedRowSet rs) throws Exception {
+ int[] expectedCols = {1};
+ String[] expectedColNames = {"ID"};
+ rs.setMatchColumn(expectedColNames[0]);
+ int[] actualCols = rs.getMatchColumnIndexes();
+ String[] actualColNames = rs.getMatchColumnNames();
+ assertEquals(actualCols, expectedCols);
+ assertEquals(actualColNames, expectedColNames);
+ rs.close();
+ }
+
+ /*
+ * Validate that getMatchColumn returns the same valid value specified by
+ * setMatchColumn
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false)
+ public void commonCachedRowSetTest0018(CachedRowSet rs) throws Exception {
+ int[] expectedCols = {1, 3};
+ String[] expectedColNames = {"COF_ID", "SUP_ID"};
+ rs.setMatchColumn(expectedCols);
+ int[] actualCols = rs.getMatchColumnIndexes();
+ String[] actualColNames = rs.getMatchColumnNames();
+ assertEquals(actualCols, expectedCols);
+ assertEquals(actualColNames, expectedColNames);
+ assertEquals(actualCols, expectedCols);
+ rs.close();
+ }
+
+ /*
+ * Validate that getMatchColumn returns the same valid value specified by
+ * setMatchColumn
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false)
+ public void commonCachedRowSetTest0019(CachedRowSet rs) throws Exception {
+ int[] expectedCols = {1, 3};
+ String[] expectedColNames = {"COF_ID", "SUP_ID"};
+ rs.setMatchColumn(expectedColNames);
+ int[] actualCols = rs.getMatchColumnIndexes();
+ String[] actualColNames = rs.getMatchColumnNames();
+ assertEquals(actualCols, expectedCols);
+ assertEquals(actualColNames, expectedColNames);
+ rs.close();
+ }
+
+ /*
+ * Validate that getMatchColumnIndexes throws a SQLException if
+ * unsetMatchColumn has been called
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0020(CachedRowSet rs) throws Exception {
+ rs.setMatchColumn(1);
+ int[] actualCols = rs.getMatchColumnIndexes();
+ assertTrue(actualCols != null);
+ rs.unsetMatchColumn(1);
+ actualCols = rs.getMatchColumnIndexes();
+ rs.close();
+ }
+
+ /*
+ * Validate that getMatchColumnNames throws a SQLException if
+ * unsetMatchColumn has been called
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0021(CachedRowSet rs) throws Exception {
+ String matchColumn = "ID";
+ rs.setMatchColumn(matchColumn);
+ String[] actualColNames = rs.getMatchColumnNames();
+ assertTrue(actualColNames != null);
+ rs.unsetMatchColumn(matchColumn);
+ actualColNames = rs.getMatchColumnNames();
+ rs.close();
+ }
+
+ /*
+ * Validate that getMatchColumnIndexes throws a SQLException if
+ * unsetMatchColumn has been called
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0022(CachedRowSet rs) throws Exception {
+ int[] expectedCols = {1, 3};
+ rs.setMatchColumn(expectedCols);
+ int[] actualCols = rs.getMatchColumnIndexes();
+ assertTrue(actualCols != null);
+ rs.unsetMatchColumn(expectedCols);
+ actualCols = rs.getMatchColumnIndexes();
+ rs.close();
+ }
+
+ /*
+ * Validate that getMatchColumnNames throws a SQLException if
+ * unsetMatchColumn has been called
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0023(CachedRowSet rs) throws Exception {
+ String[] expectedColNames = {"COF_ID", "SUP_ID"};
+ rs.setMatchColumn(expectedColNames);
+ String[] actualColNames = rs.getMatchColumnNames();
+ assertTrue(actualColNames != null);
+ rs.unsetMatchColumn(expectedColNames);
+ actualColNames = rs.getMatchColumnNames();
+ rs.close();
+ }
+
+ /*
+ * Validate size() returns the correct number of rows
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0024(CachedRowSet rs) throws Exception {
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ rs.close();
+ }
+
+ /*
+ * Validate that the correct rows are returned comparing the primary
+ * keys
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0025(RowSet rs) throws SQLException {
+ assertEquals(getPrimaryKeys(rs), COFFEE_HOUSES_PRIMARY_KEYS);
+ rs.close();
+ }
+
+ /*
+ * Delete a row within the RowSet using its primary key
+ * Validate the visibility of the row depending on the value of
+ * setShowdelete
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0026(CachedRowSet rs) throws Exception {
+ Object[] afterDelete = {
+ 10023, 33002, 10040, 32001, 10042, 10024, 10039, 10041,
+ 33005, 33010, 10037, 10034, 32004
+ };
+ int rowToDelete = 10035;
+ // All rows should be found
+ assertEquals(getPrimaryKeys(rs), COFFEE_HOUSES_PRIMARY_KEYS);
+ // Delete the row
+ assertTrue(deleteRowByPrimaryKey(rs, rowToDelete, 1));
+ // With setShowDeleted(false) which is the default,
+ // the deleted row should not be visible
+ assertFalse(findRowByPrimaryKey(rs, rowToDelete, 1));
+ assertEquals(getPrimaryKeys(rs), afterDelete);
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ // With setShowDeleted(true), the deleted row should be visible
+ rs.setShowDeleted(true);
+ assertTrue(findRowByPrimaryKey(rs, rowToDelete, 1));
+ rs.close();
+ }
+
+ /*
+ * Validate that there is no page size by default
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0027(CachedRowSet rs) throws Exception {
+ assertTrue(rs.getPageSize() == 0);
+ rs.close();
+ }
+
+ /*
+ * Validate the value you set via setPageSize is returned by getPageSize
+ * then reset to having no limit
+ */
+ @Test(dataProvider = "rowSetType")
+ public void commonCachedRowSetTest0028(CachedRowSet rs) throws Exception {
+ int rows = 100;
+ rs.setPageSize(rows);
+ assertTrue(rows == rs.getPageSize());
+ rs.setPageSize(0);
+ assertTrue(rs.getPageSize() == 0);
+ rs.close();
+ }
+
+ /*
+ * Validate SQLException is thrown when an invalid value is specified
+ * for setPageSize
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0029(CachedRowSet rs) throws Exception {
+ rs.setPageSize(-1);
+ rs.close();
+ }
+
+ /*
+ * Validate SQLException is thrown when nextPage is called without a
+ * call to populate or execute
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0030(CachedRowSet rs) throws Exception {
+ rs.nextPage();
+ rs.close();
+ }
+
+ /*
+ * Validate SQLException is thrown when previousPage is called without a
+ * call to populate or execute
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0031(CachedRowSet rs) throws Exception {
+ rs.previousPage();
+ rs.close();
+ }
+
+
+ /*
+ * Validate SQLException is thrown when execute is called
+ * but there is not a way to make a connection to the datasource
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0032(CachedRowSet rs) throws Exception {
+ rs.execute(null);
+ rs.close();
+ }
+
+ /*
+ * Validate SQLException is thrown when execute is called
+ * but there is not a way to make a connection to the datasource
+ */
+ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0033(CachedRowSet rs) throws Exception {
+ rs.execute();
+ rs.close();
+ }
+
+ /*
+ * Validate that toCollection(<column>) returns the proper values
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0034(CachedRowSet rs) throws Exception {
+ Object[] cities = {"Mendocino", "Seattle", "SF", "Portland", "SF",
+ "Sacramento", "Carmel", "LA", "Olympia", "Seattle", "SF",
+ "LA", "San Jose", "Eugene"};
+ rs.beforeFirst();
+ assertEquals(rs.toCollection(2).toArray(), cities);
+ assertEquals(rs.toCollection("CITY").toArray(), cities);
+ rs.close();
+ }
+
+ /*
+ * Validate that toCollection() returns the proper values
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0035(CachedRowSet rs) throws Exception {
+ Collection<?> col = rs.toCollection();
+ assertTrue(rs.size() == col.size());
+ assertTrue(rs.toCollection().containsAll(col)
+ && col.containsAll(rs.toCollection()));
+ try ( // Validate that False is returned when compared to a different RowSet;
+ CachedRowSet crs1 = createCoffeesRowSet()) {
+ assertFalse(crs1.toCollection().containsAll(col)
+ && col.containsAll(crs1.toCollection()));
+ }
+ rs.close();
+
+ }
+
+ /*
+ * Validate that createCopy() returns the proper values
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0036(CachedRowSet rs) throws Exception {
+ try (CachedRowSet crs1 = rs.createCopy()) {
+ compareRowSets(rs, crs1);
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate that createCopySchema() returns the proper values
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0037(CachedRowSet rs) throws Exception {
+ try (CachedRowSet crs1 = rs.createCopySchema()) {
+ assertTrue(crs1.size() == 0);
+ compareMetaData(crs1.getMetaData(), rs.getMetaData());
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate that createCopyNoConstraints() returns the proper values
+ * and getMatchColumnIndexes should throw a SQLException. This test
+ * specifies setMatchColumn(int)
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0038(CachedRowSet rs) throws Exception {
+ rs.setMatchColumn(1);
+ try (CachedRowSet crs1 = rs.createCopyNoConstraints()) {
+ assertTrue(crs1.size() == COFFEE_HOUSES_ROWS);
+ compareRowSets(rs, crs1);
+ boolean recievedSQE = false;
+ try {
+ int[] indexes = crs1.getMatchColumnIndexes();
+ } catch (SQLException e) {
+ recievedSQE = true;
+ }
+ assertTrue(recievedSQE);
+ recievedSQE = false;
+ try {
+ String[] colNames = crs1.getMatchColumnNames();
+ } catch (SQLException e) {
+ recievedSQE = true;
+ }
+ assertTrue(recievedSQE);
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate that createCopyNoConstraints() returns the proper values
+ * and getMatchColumnIndexes should throw a SQLException. This test
+ * specifies setMatchColumn(String)
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0039(CachedRowSet rs) throws Exception {
+ rs.setMatchColumn("ID");
+ try (CachedRowSet crs1 = rs.createCopyNoConstraints()) {
+ assertTrue(crs1.size() == COFFEE_HOUSES_ROWS);
+ compareRowSets(rs, crs1);
+ boolean recievedSQE = false;
+ try {
+ int[] indexes = crs1.getMatchColumnIndexes();
+ } catch (SQLException e) {
+ recievedSQE = true;
+ }
+ assertTrue(recievedSQE);
+ recievedSQE = false;
+ try {
+ String[] colNames = crs1.getMatchColumnNames();
+ } catch (SQLException e) {
+ recievedSQE = true;
+ }
+ assertTrue(recievedSQE);
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate that columnUpdated works with the various datatypes specifying
+ * the column index
+ */
+ @Test(dataProvider = "rowsetUsingDataTypes")
+ public void commonCachedRowSetTest0040(CachedRowSet rs, JDBCType type) throws Exception {
+ rs.beforeFirst();
+ assertTrue(rs.next());
+ switch (type) {
+ case INTEGER:
+ assertFalse(rs.columnUpdated(1));
+ rs.updateInt(1, Integer.MIN_VALUE);
+ assertTrue(rs.columnUpdated(1));
+ break;
+ case CHAR:
+ assertFalse(rs.columnUpdated(2));
+ rs.updateString(2, "foo");
+ assertTrue(rs.columnUpdated(2));
+ break;
+ case VARCHAR:
+ assertFalse(rs.columnUpdated(3));
+ rs.updateString(3, "foo");
+ assertTrue(rs.columnUpdated(3));
+ break;
+ case BIGINT:
+ assertFalse(rs.columnUpdated(4));
+ rs.updateLong(4, Long.MIN_VALUE);
+ assertTrue(rs.columnUpdated(4));
+ break;
+ case BOOLEAN:
+ assertFalse(rs.columnUpdated(5));
+ rs.updateBoolean(5, false);
+ assertTrue(rs.columnUpdated(5));
+ break;
+ case SMALLINT:
+ assertFalse(rs.columnUpdated(6));
+ rs.updateShort(6, Short.MIN_VALUE);
+ assertTrue(rs.columnUpdated(6));
+ break;
+ case DOUBLE:
+ assertFalse(rs.columnUpdated(7));
+ rs.updateDouble(7, Double.MIN_VALUE);
+ assertTrue(rs.columnUpdated(7));
+ break;
+ case DECIMAL:
+ assertFalse(rs.columnUpdated(8));
+ rs.updateBigDecimal(8, BigDecimal.TEN);
+ assertTrue(rs.columnUpdated(8));
+ break;
+ case REAL:
+ assertFalse(rs.columnUpdated(9));
+ rs.updateFloat(9, Float.MIN_VALUE);
+ assertTrue(rs.columnUpdated(9));
+ break;
+ case TINYINT:
+ assertFalse(rs.columnUpdated(10));
+ rs.updateByte(10, Byte.MIN_VALUE);
+ assertTrue(rs.columnUpdated(10));
+ break;
+ case DATE:
+ assertFalse(rs.columnUpdated(11));
+ rs.updateDate(11, Date.valueOf(LocalDate.now()));
+ assertTrue(rs.columnUpdated(11));
+ break;
+ case TIME:
+ assertFalse(rs.columnUpdated(12));
+ rs.updateTime(12, Time.valueOf(LocalTime.now()));
+ assertTrue(rs.columnUpdated(12));
+ break;
+ case TIMESTAMP:
+ assertFalse(rs.columnUpdated(13));
+ rs.updateTimestamp(13, Timestamp.valueOf(LocalDateTime.now()));
+ assertTrue(rs.columnUpdated(13));
+ break;
+ case VARBINARY:
+ assertFalse(rs.columnUpdated(14));
+ rs.updateBytes(14, new byte[1]);
+ assertTrue(rs.columnUpdated(14));
+ break;
+ case ARRAY:
+ assertFalse(rs.columnUpdated(15));
+ rs.updateArray(15, new StubArray("VARCHAR", new Object[10]));
+ assertTrue(rs.columnUpdated(15));
+ break;
+ case REF:
+ assertFalse(rs.columnUpdated(16));
+ rs.updateRef(16, new StubRef("INTEGER", query));
+ assertTrue(rs.columnUpdated(16));
+ break;
+ case FLOAT:
+ assertFalse(rs.columnUpdated(17));
+ rs.updateDouble(17, Double.MIN_NORMAL);
+ assertTrue(rs.columnUpdated(17));
+ }
+
+ }
+
+ /*
+ * Validate that columnUpdated works with the various datatypes specifying
+ * the column name
+ */
+ @Test(dataProvider = "rowsetUsingDataTypes")
+ public void commonCachedRowSetTest0041(CachedRowSet rs, JDBCType type) throws Exception {
+ rs.beforeFirst();
+ assertTrue(rs.next());
+ switch (type) {
+ case INTEGER:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[0]));
+ rs.updateInt(DATATYPES_COLUMN_NAMES[0], Integer.MIN_VALUE);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[0]));
+ break;
+ case CHAR:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[1]));
+ rs.updateString(DATATYPES_COLUMN_NAMES[1], "foo");
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[1]));
+ break;
+ case VARCHAR:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[2]));
+ rs.updateString(DATATYPES_COLUMN_NAMES[2], "foo");
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[2]));
+ break;
+ case BIGINT:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[3]));
+ rs.updateLong(DATATYPES_COLUMN_NAMES[3], Long.MIN_VALUE);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[3]));
+ break;
+ case BOOLEAN:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[4]));
+ rs.updateBoolean(DATATYPES_COLUMN_NAMES[4], false);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[4]));
+ break;
+ case SMALLINT:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[5]));
+ rs.updateShort(DATATYPES_COLUMN_NAMES[5], Short.MIN_VALUE);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[5]));
+ break;
+ case DOUBLE:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[6]));
+ rs.updateDouble(DATATYPES_COLUMN_NAMES[6], Double.MIN_VALUE);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[6]));
+ break;
+ case DECIMAL:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[7]));
+ rs.updateBigDecimal(DATATYPES_COLUMN_NAMES[7], BigDecimal.TEN);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[7]));
+ break;
+ case REAL:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[8]));
+ rs.updateFloat(DATATYPES_COLUMN_NAMES[8], Float.MIN_VALUE);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[8]));
+ break;
+ case TINYINT:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[9]));
+ rs.updateByte(DATATYPES_COLUMN_NAMES[9], Byte.MIN_VALUE);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[9]));
+ break;
+ case DATE:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[10]));
+ rs.updateDate(DATATYPES_COLUMN_NAMES[10], Date.valueOf(LocalDate.now()));
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[10]));
+ break;
+ case TIME:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[11]));
+ rs.updateTime(DATATYPES_COLUMN_NAMES[11], Time.valueOf(LocalTime.now()));
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[11]));
+ break;
+ case TIMESTAMP:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[12]));
+ rs.updateTimestamp(DATATYPES_COLUMN_NAMES[12], Timestamp.valueOf(LocalDateTime.now()));
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[12]));
+ break;
+ case VARBINARY:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[13]));
+ rs.updateBytes(DATATYPES_COLUMN_NAMES[13], new byte[1]);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[13]));
+ break;
+ case ARRAY:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[14]));
+ rs.updateArray(DATATYPES_COLUMN_NAMES[14], new StubArray("VARCHAR", new Object[10]));
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[14]));
+ break;
+ case REF:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[15]));
+ rs.updateRef(DATATYPES_COLUMN_NAMES[15], new StubRef("INTEGER", query));
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[15]));
+ break;
+ case FLOAT:
+ assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[16]));
+ rs.updateDouble(DATATYPES_COLUMN_NAMES[16], Double.MIN_NORMAL);
+ assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[16]));
+ break;
+ }
+
+ }
+
+ /*
+ * Validate isBeforeFirst(), isFirst() and first() return the correct
+ * results
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0042(RowSet rs) throws Exception {
+ assertFalse(rs.isBeforeFirst());
+ assertFalse(rs.isFirst());
+ rs.beforeFirst();
+ assertTrue(rs.isBeforeFirst());
+ assertFalse(rs.isFirst());
+ rs.next();
+ assertFalse(rs.isBeforeFirst());
+ assertTrue(rs.isFirst());
+ rs.next();
+ assertFalse(rs.isBeforeFirst());
+ assertFalse(rs.isFirst());
+ rs.first();
+ assertFalse(rs.isBeforeFirst());
+ assertTrue(rs.isFirst());
+ rs.close();
+ }
+
+ /*
+ * Validate isAfterLast(), isLast() and last() return the correct
+ * results
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0043(RowSet rs) throws Exception {
+ assertFalse(rs.isAfterLast());
+ assertFalse(rs.isLast());
+ rs.afterLast();
+ assertTrue(rs.isAfterLast());
+ assertFalse(rs.isLast());
+ rs.previous();
+ assertFalse(rs.isAfterLast());
+ assertTrue(rs.isLast());
+ rs.previous();
+ assertFalse(rs.isAfterLast());
+ assertFalse(rs.isLast());
+ rs.last();
+ assertFalse(rs.isAfterLast());
+ assertTrue(rs.isLast());
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoDelete is called on the
+ * insertRow
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0044(CachedRowSet rs) throws Exception {
+ rs.insertRow();
+ rs.undoDelete();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoDelete is called when
+ * cursor is before the first row
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0045(CachedRowSet rs) throws Exception {
+ rs.setShowDeleted(true);
+ rs.beforeFirst();
+ rs.undoDelete();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoDelete is called when
+ * cursor is after the last row
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0046(CachedRowSet rs) throws Exception {
+ rs.setShowDeleted(true);
+ rs.afterLast();
+ rs.undoDelete();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoUpdate is called on the
+ * insertRow
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0047(CachedRowSet rs) throws Exception {
+ rs.insertRow();
+ rs.undoUpdate();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoUpdate is called when
+ * cursor is before the first row
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0048(CachedRowSet rs) throws Exception {
+ rs.setShowDeleted(true);
+ rs.beforeFirst();
+ rs.undoUpdate();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoUpdate is called when
+ * cursor is after the last row
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0049(CachedRowSet rs) throws Exception {
+ rs.setShowDeleted(true);
+ rs.afterLast();
+ rs.undoUpdate();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoInsert is called on the
+ * insertRow
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0050(CachedRowSet rs) throws Exception {
+ rs.insertRow();
+ rs.undoInsert();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoInsert is called when
+ * cursor is before the first row
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0051(CachedRowSet rs) throws Exception {
+ rs.setShowDeleted(true);
+ rs.beforeFirst();
+ rs.undoInsert();
+ rs.close();
+ }
+
+ /*
+ * Validate a SQLException is thrown when undoInsert is called when
+ * cursor is after the last row
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses",
+ expectedExceptions = SQLException.class)
+ public void commonCachedRowSetTest0052(CachedRowSet rs) throws Exception {
+ rs.setShowDeleted(true);
+ rs.afterLast();
+ rs.undoInsert();
+ rs.close();
+ }
+
+ /*
+ * Insert a row, then call undoInsert to roll back the insert and validate
+ * the row is not there
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0053(CachedRowSet rs) throws Exception {
+ int rowToInsert = 1961;
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ // Add new row
+ rs.moveToInsertRow();
+ rs.updateInt(1, rowToInsert);
+ rs.updateString(2, "GOTHAM");
+ rs.updateInt(3, 3450);
+ rs.updateInt(4, 2005);
+ rs.updateInt(5, 5455);
+ rs.insertRow();
+ rs.moveToCurrentRow();
+ // check that the number of rows has increased
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1);
+ assertTrue(findRowByPrimaryKey(rs, rowToInsert, 1));
+ rs.undoInsert();
+ // Check to make sure the row is no longer there
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ assertFalse(findRowByPrimaryKey(rs, rowToInsert, 1));
+ rs.close();
+ }
+
+ /*
+ * Insert a row, delete the row and then call undoDelete to make sure it
+ * is comes back
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0054(CachedRowSet rs) throws Exception {
+ int rowToDelete = 1961;
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ // Add new row
+ rs.moveToInsertRow();
+ rs.updateInt(1, rowToDelete);
+ rs.updateString(2, "GOTHAM");
+ rs.updateInt(3, 3450);
+ rs.updateInt(4, 2005);
+ rs.updateInt(5, 5455);
+ rs.insertRow();
+ rs.moveToCurrentRow();
+ // check that the number of rows has increased
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1);
+ assertTrue(findRowByPrimaryKey(rs, rowToDelete, 1));
+ rs.absolute(COFFEE_HOUSES_ROWS + 1);
+ rs.deleteRow();
+ // Check to make sure the row is no longer there
+ //assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ assertFalse(findRowByPrimaryKey(rs, rowToDelete, 1));
+ rs.setShowDeleted(true);
+ rs.absolute(COFFEE_HOUSES_ROWS + 1);
+ rs.undoDelete();
+ // check that the row is back
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1);
+ assertTrue(findRowByPrimaryKey(rs, rowToDelete, 1));
+ rs.close();
+ }
+
+ /*
+ * Insert a row, modify a field and then call undoUpdate to revert the
+ * insert
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0055(CachedRowSet rs) throws Exception {
+ int rowToInsert = 1961;
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ // Add new row
+ rs.moveToInsertRow();
+ rs.updateInt(1, rowToInsert);
+ rs.updateString(2, "GOTHAM");
+ rs.updateInt(3, 3450);
+ rs.updateInt(4, 2005);
+ rs.updateInt(5, 5455);
+ rs.insertRow();
+ rs.moveToCurrentRow();
+ // check that the number of rows has increased
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1);
+ assertTrue(findRowByPrimaryKey(rs, rowToInsert, 1));
+ rs.absolute(COFFEE_HOUSES_ROWS + 1);
+ // Save off the original column values
+ String f2 = rs.getString(2);
+ int f3 = rs.getInt(3);
+ rs.updateString(2, "SMALLVILLE");
+ rs.updateInt(3, 500);
+ // Validate the columns have been updated
+ assertTrue(rs.columnUpdated(2));
+ assertTrue(rs.columnUpdated(3));
+ // Undo the update and validate it has taken place
+ rs.absolute(COFFEE_HOUSES_ROWS + 1);
+ rs.undoUpdate();
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ assertFalse(findRowByPrimaryKey(rs, rowToInsert, 1));
+ rs.close();
+ }
+
+ /*
+ * Validate getOriginal returns a ResultSet which is a copy of the original
+ * RowSet
+ */
+ @Test(dataProvider = "rowsetUsingCoffees")
+ public void commonCachedRowSetTest0056(CachedRowSet rs) throws Exception {
+ String coffee = "Hazelnut";
+ int sales = 100;
+ int id = 200;
+ Object[] updatedPkeys = {1, id, 3, 4, 5};
+ // Change the coffee name and sales total for row 2 and save the
+ // previous values
+ rs.absolute(2);
+ int origId = rs.getInt(1);
+ String origCoffee = rs.getString(2);
+ int origSales = rs.getInt(5);
+ rs.updateInt(1, id);
+ rs.updateString(2, coffee);
+ rs.updateInt(5, sales);
+ // MetaData should match
+ try ( // Get the original original RowSet and validate that the changes
+ // are only made to the current, not the original
+ ResultSet rs1 = rs.getOriginal()) {
+ // MetaData should match
+ compareMetaData(rs.getMetaData(), rs1.getMetaData());
+ assertTrue(rs1.isBeforeFirst());
+ assertTrue(rs1.getConcurrency() == ResultSet.CONCUR_UPDATABLE);
+ assertTrue(rs1.getType() == ResultSet.TYPE_SCROLL_INSENSITIVE);
+ rs1.absolute(2);
+ // Check original rowset is not changed
+ assertTrue(rs1.getInt(1) == origId);
+ assertTrue(rs1.getString(2).equals(origCoffee));
+ assertTrue(rs1.getInt(5) == origSales);
+ assertEquals(getPrimaryKeys(rs1), COFFEES_PRIMARY_KEYS);
+ // Check current rowset
+ assertTrue(rs.getInt(1) == id);
+ assertTrue(rs.getString(2).equals(coffee));
+ assertTrue(rs.getInt(5) == sales);
+ assertEquals(getPrimaryKeys(rs), updatedPkeys);
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate getOriginalRow returns a ResultSet which is a copy of the
+ * original row that was modified
+ */
+ @Test(dataProvider = "rowsetUsingCoffees")
+ public void commonCachedRowSetTest0057(CachedRowSet rs) throws Exception {
+ String coffee = "Hazelnut";
+ int sales = 100;
+ int id = 200;
+ Object[] updatedPkeys = {1, id, 3, 4, 5};
+ // Change the coffee name and sales total for row 2 and save the
+ // previous values
+ rs.absolute(2);
+ int origId = rs.getInt(1);
+ String origCoffee = rs.getString(2);
+ int origSales = rs.getInt(5);
+ rs.updateInt(1, id);
+ rs.updateString(2, coffee);
+ rs.updateInt(5, sales);
+ // MetaData should match
+ try ( // Get the original original row and validate that the changes
+ // are only made to the current, not the original
+ ResultSet rs1 = rs.getOriginalRow()) {
+ // MetaData should match
+ compareMetaData(rs.getMetaData(), rs1.getMetaData());
+ assertTrue(rs1.isBeforeFirst());
+ assertTrue(rs1.getConcurrency() == ResultSet.CONCUR_UPDATABLE);
+ assertTrue(rs1.getType() == ResultSet.TYPE_SCROLL_INSENSITIVE);
+ rs1.next();
+ assertTrue(rs1.isFirst() && rs1.isLast());
+ assertTrue(rs1.getRow() == 1);
+ // Check original row is not changed
+ assertTrue(rs1.getInt(1) == origId);
+ assertTrue(rs1.getString(2).equals(origCoffee));
+ assertTrue(rs1.getInt(5) == origSales);
+ // Check current row
+ assertTrue(rs.getInt(1) == id);
+ assertTrue(rs.getString(2).equals(coffee));
+ assertTrue(rs.getInt(5) == sales);
+ assertEquals(getPrimaryKeys(rs), updatedPkeys);
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate that restoreOrginal will restore the RowSet to its
+ * state prior to the insert of a row
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0058(CachedRowSet rs) throws Exception {
+ int rowToInsert = 1961;
+ assertTrue(rs.size() == COFFEE_HOUSES_ROWS);
+ try ( // Add new row
+ CachedRowSet crs1 = rsf.createCachedRowSet()) {
+ rs.beforeFirst();
+ crs1.populate(rs);
+ TestRowSetListener rsl = new TestRowSetListener();
+ crs1.addRowSetListener(rsl);
+ crs1.moveToInsertRow();
+ crs1.updateInt(1, rowToInsert);
+ crs1.updateString(2, "GOTHAM");
+ crs1.updateInt(3, 3450);
+ crs1.updateInt(4, 2005);
+ crs1.updateInt(5, 5455);
+ crs1.insertRow();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED));
+ crs1.moveToCurrentRow();
+ assertTrue(findRowByPrimaryKey(crs1, rowToInsert, 1));
+ // Restore back to our original state and the
+ // previously inserted row should not be there
+ rsl.resetFlag();
+ crs1.restoreOriginal();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
+ assertTrue(crs1.isBeforeFirst());
+ crs1.last();
+ assertFalse(crs1.rowInserted());
+ assertFalse(findRowByPrimaryKey(crs1, rowToInsert, 1));
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate that restoreOrginal will restore the RowSet to its
+ * state prior to deleting a row
+ */
+ @Test(dataProvider = "rowsetUsingCoffees", enabled = true)
+ public void commonCachedRowSetTest0059(CachedRowSet rs) throws Exception {
+ int rowToDelete = 2;
+ try (CachedRowSet crs1 = rsf.createCachedRowSet()) {
+ rs.beforeFirst();
+ crs1.populate(rs);
+ TestRowSetListener rsl = new TestRowSetListener();
+ crs1.addRowSetListener(rsl);
+ // Delete a row, the PK is also the absolute position as a List
+ // backs the RowSet
+ crs1.absolute(rowToDelete);
+ crs1.deleteRow();
+ assertTrue(crs1.rowDeleted());
+ assertFalse(findRowByPrimaryKey(crs1, rowToDelete, 1));
+ // Restore back to our original state and the
+ // previously deleted row should be there
+ rsl.resetFlag();
+ crs1.restoreOriginal();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
+ assertTrue(crs1.isBeforeFirst());
+ crs1.absolute(rowToDelete);
+ assertFalse(crs1.rowDeleted());
+ assertTrue(findRowByPrimaryKey(crs1, rowToDelete, 1));
+ }
+ rs.close();
+ }
+
+ /*
+ * Validate that restoreOrginal will restore the RowSet to its
+ * state prior to updating a row
+ */
+ @Test(dataProvider = "rowsetUsingCoffees", enabled = true)
+ public void commonCachedRowSetTest0060(CachedRowSet rs) throws Exception {
+ int rowToUpdate = 2;
+ String coffee = "Hazelnut";
+ try (CachedRowSet crs1 = rsf.createCachedRowSet()) {
+ rs.beforeFirst();
+ crs1.populate(rs);
+ TestRowSetListener rsl = new TestRowSetListener();
+ crs1.addRowSetListener(rsl);
+ // Delete a row, the PK is also the absolute position as a List
+ // backs the RowSet
+ crs1.absolute(rowToUpdate);
+ String origCoffee = crs1.getString(2);
+ crs1.updateString(2, coffee);
+ assertTrue(crs1.columnUpdated(2));
+ crs1.updateRow();
+ assertTrue(crs1.rowUpdated());
+ assertFalse(origCoffee.equals(crs1.getString(2)));
+ // Restore back to our original state and the
+ // previous value for the column within the row should be there
+ rsl.resetFlag();
+ crs1.restoreOriginal();
+ assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED));
+ assertTrue(crs1.isBeforeFirst());
+ // absolute() is failing for some reason so need to look at this later
+ crs1.next();
+ crs1.next();
+ assertFalse(crs1.columnUpdated(2));
+ assertFalse(crs1.rowUpdated());
+ assertTrue(origCoffee.equals(crs1.getString(2)));
+ }
+ rs.close();
+ }
+
+ /*
+ * Initialize a RowSet via the populate method. Validate it matches
+ * the original ResultSet
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0061(CachedRowSet rs) throws Exception {
+ try (CachedRowSet crs1 = rsf.createCachedRowSet()) {
+ rs.beforeFirst();
+ crs1.populate(rs);
+ compareRowSets(rs, crs1);
+ }
+ rs.close();
+ }
+
+ /*
+ * Initialize a RowSet via the populate method specifying a starting row.
+ * Validate it matches the original ResultSet starting for the specofied
+ * offset
+ */
+ @Test(dataProvider = "rowsetUsingCoffeeHouses")
+ public void commonCachedRowSetTest0062(CachedRowSet rs) throws Exception {
+ Object[] expectedRows = {
+ 32001, 10042, 10024, 10039, 10041, 33005, 33010, 10035, 10037,
+ 10034, 32004
+ };
+ int startingRow = 4;
+ try (CachedRowSet crs1 = rsf.createCachedRowSet()) {
+ rs.beforeFirst();
+ crs1.populate(rs, startingRow);
+ assertEquals(crs1.size(), COFFEE_HOUSES_ROWS - startingRow + 1);
+ assertEquals(getPrimaryKeys(crs1), expectedRows);
+ }
+ rs.close();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/filteredrowset/CityFilter.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 test.rowset.filteredrowset;
+
+import java.sql.SQLException;
+import javax.sql.RowSet;
+import javax.sql.rowset.Predicate;
+
+/*
+ * Simple implementation of Predicate which is used to filter rows based
+ * on a City.
+ */
+public class CityFilter implements Predicate {
+
+ private final String[] cities;
+ private String colName = null;
+ private int colNumber = -1;
+
+ public CityFilter(String[] cities, String colName) {
+ this.cities = cities;
+ this.colName = colName;
+ }
+
+ public CityFilter(String[] cities, int colNumber) {
+ this.cities = cities;
+ this.colNumber = colNumber;
+ }
+
+ public boolean evaluate(Object value, String colName) {
+
+ if (colName.equalsIgnoreCase(this.colName)) {
+ for (String city : cities) {
+ if (city.equalsIgnoreCase((String) value)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean evaluate(Object value, int colNumber) {
+
+ if (colNumber == this.colNumber) {
+ for (String city : this.cities) {
+ if (city.equalsIgnoreCase((String) value)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public boolean evaluate(RowSet rs) {
+
+ boolean result = false;
+
+ if (rs == null) {
+ return false;
+ }
+
+ try {
+ for (String city : cities) {
+
+ String val = "";
+ if (colNumber > 0) {
+ val = (String) rs.getObject(colNumber);
+ } else if (colName != null) {
+ val = (String) rs.getObject(colName);
+ }
+
+ if (val.equalsIgnoreCase(city)) {
+ return true;
+ }
+ }
+ } catch (SQLException e) {
+ result = false;
+ }
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/filteredrowset/FilteredRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 test.rowset.filteredrowset;
+
+import java.sql.SQLException;
+import javax.sql.RowSet;
+import javax.sql.rowset.FilteredRowSet;
+import javax.sql.rowset.Predicate;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import test.rowset.webrowset.CommonWebRowSetTests;
+
+public class FilteredRowSetTests extends CommonWebRowSetTests {
+
+ private FilteredRowSet frs;
+
+ @BeforeMethod
+ public void setUpMethod() throws Exception {
+ frs = createCoffeeHousesRowSet();
+ }
+
+ @AfterMethod
+ public void tearDownMethod() throws Exception {
+ frs.close();
+ }
+
+ protected FilteredRowSet newInstance() throws SQLException {
+ return rsf.createFilteredRowSet();
+ }
+
+ /*
+ * Validate getFilter returns null if setFilter has not been called
+ */
+ @Test
+ public void FilteredRowSetTest0000() throws SQLException {
+ assertNull(frs.getFilter());
+ }
+
+ /*
+ * Call setFilter to set a Predicate and validate that getFilter
+ * returns the correct Predicate
+ */
+ @Test
+ public void FilteredRowSetTest0001() throws SQLException {
+ Predicate p = new PrimaryKeyFilter(0, 100030, 1);
+ frs.setFilter(p);
+ assertTrue(frs.getFilter().equals(p));
+ frs.setFilter(null);
+ assertNull(frs.getFilter());
+ }
+
+ /*
+ * Validate that the correct rows are returned when a Predicate using
+ * a column index is used
+ */
+ @Test
+ public void FilteredRowSetTest0002() throws SQLException {
+ Object[] expectedKeys = {
+ 10023, 10040, 10042, 10024, 10039, 10041, 10035, 10037, 10034
+ };
+ frs.setFilter(new PrimaryKeyFilter(10000, 10999, 1));
+ assertEquals(getPrimaryKeys(frs), expectedKeys);
+ }
+
+ /*
+ * Validate that the correct rows are returned when a Predicate using
+ * a column Label is used
+ */
+ @Test
+ public void FilteredRowSetTest0003() throws SQLException {
+ Object[] expectedKeys = {
+ 10023, 10040, 10042, 10024, 10039, 10041, 10035, 10037, 10034
+ };
+ frs.setFilter(new PrimaryKeyFilter(10000, 10999, "STORE_ID"));
+ assertEquals(getPrimaryKeys(frs), expectedKeys);
+
+ }
+
+ /*
+ * Validate that the correct rows are returned when a Predicate using
+ * a column index is used
+ */
+ @Test
+ public void FilteredRowSetTest0004() throws SQLException {
+ Object[] expectedKeys = {
+ 10040, 10042, 10041, 10035, 10037
+ };
+ String[] cityArray = {"SF", "LA"};
+ frs.setFilter(new CityFilter(cityArray, 2));
+ assertEquals(getPrimaryKeys(frs), expectedKeys);
+ }
+
+ /*
+ * Validate that the correct rows are returned when a Predicate using
+ * a column Label is used
+ */
+ @Test
+ public void FilteredRowSetTest0005() throws SQLException {
+ Object[] expectedKeys = {
+ 10040, 10042, 10041, 10035, 10037
+ };
+ String[] cityArray = {"SF", "LA"};
+ frs.setFilter(new CityFilter(cityArray, "CITY"));
+ assertEquals(getPrimaryKeys(frs), expectedKeys);
+ }
+
+
+ // Tests that are common but need to be disabled due to an implementation bug
+
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0043(RowSet rs) throws Exception {
+ // Need to fix bug in FilteredRowSets
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/filteredrowset/PrimaryKeyFilter.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 test.rowset.filteredrowset;
+
+import javax.sql.RowSet;
+import javax.sql.rowset.Predicate;
+
+/*
+ * Simple implementation of Predicate which is used to filter rows based
+ * on the Primary Key.
+ */
+public class PrimaryKeyFilter implements Predicate {
+
+ private final int lo;
+ private final int hi;
+ private String colName = null;
+ private int colNumber = -1;
+
+ public PrimaryKeyFilter(int lo, int hi, int colNumber) {
+ this.lo = lo;
+ this.hi = hi;
+ this.colNumber = colNumber;
+ }
+
+ public PrimaryKeyFilter(int lo, int hi, String colName) {
+ this.lo = lo;
+ this.hi = hi;
+ this.colName = colName;
+ }
+
+ public boolean evaluate(Object value, String columnName) {
+
+ boolean result = false;
+ if (columnName.equalsIgnoreCase(this.colName)) {
+ int columnValue = ((Integer) value);
+ result = (columnValue >= this.lo) && (columnValue <= this.hi);
+ }
+ return result;
+ }
+
+ public boolean evaluate(Object value, int columnNumber) {
+
+ boolean result = false;
+ if (this.colNumber == columnNumber) {
+ int columnValue = (Integer) value;
+ result = (columnValue >= this.lo) && (columnValue <= this.hi);
+ }
+ return result;
+ }
+
+ public boolean evaluate(RowSet rs) {
+
+ boolean result = false;
+ try {
+ int columnValue = -1;
+
+ if (this.colNumber > 0) {
+ columnValue = rs.getInt(this.colNumber);
+ } else if (this.colName != null) {
+ columnValue = rs.getInt(this.colName);
+ }
+ if ((columnValue >= this.lo) && (columnValue <= this.hi)) {
+ result = true;
+ }
+
+ } catch (Exception e) {
+ System.out.println("Error:" + e.getMessage());
+ result = false;
+ }
+ return result;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/joinrowset/JoinRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,324 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 test.rowset.joinrowset;
+
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.List;
+import javax.sql.RowSet;
+import javax.sql.rowset.CachedRowSet;
+import javax.sql.rowset.JoinRowSet;
+import javax.sql.rowset.RowSetMetaDataImpl;
+import javax.sql.rowset.WebRowSet;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import test.rowset.webrowset.CommonWebRowSetTests;
+
+public class JoinRowSetTests extends CommonWebRowSetTests {
+
+ private final String SUPPLIERS_TABLE = "SUPPLIERS";
+ // Expected COF_IDs to be found
+ private final Object[] EXPECTED = {4, 1};
+ // SUPPLIERS Primary Key to use to validate the joins
+ private final int SUP_ID = 101;
+ // Join Column between the SUPPLIERS and COFFEES table
+ private final String JOIN_COLNAME = "SUP_ID";
+ // Column index in COFFEES table which contains SUP_ID
+ private final int COFFEES_JOIN_COLUMN_INDEX = 3;
+ // Column index in SUPPLIERS table which contains SUP_ID
+ private final int SUPPLIERS_JOIN_COLUMN_INDEX = 1;
+
+ @Override
+ protected JoinRowSet newInstance() throws SQLException {
+ return rsf.createJoinRowSet();
+ }
+
+ /*
+ * Initializes the SUPPLIERS metadata
+ */
+ private void initSuppliersMetaData(CachedRowSet crs) throws SQLException {
+ RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl();
+
+ /*
+ * CREATE TABLE SUPPLIERS (
+ * SUP_ID INTEGER NOT NULL,
+ * SUP_NAME VARCHAR(32) NOT NULL,
+ * STREET VARCHAR(32) NOT NULL,
+ * CITY VARCHAR(32) NOT NULL,
+ * STATE CHAR(2) NOT NULL,
+ * ZIP CHAR(5) NOT NULL,
+ * PRIMARY KEY (SUP_ID))
+ */
+ rsmd.setColumnCount(6);
+ rsmd.setColumnName(1, "SUP_ID");
+ rsmd.setColumnName(2, "SUP_NAME");
+ rsmd.setColumnName(3, "STREET");
+ rsmd.setColumnName(4, "CITY");
+ rsmd.setColumnName(5, "STATE");
+ rsmd.setColumnName(6, "ZIP");
+
+ rsmd.setColumnType(1, Types.INTEGER);
+ rsmd.setColumnType(2, Types.VARCHAR);
+ rsmd.setColumnType(3, Types.VARCHAR);
+ rsmd.setColumnType(4, Types.VARCHAR);
+ rsmd.setColumnType(5, Types.CHAR);
+ rsmd.setColumnType(6, Types.CHAR);
+ crs.setMetaData(rsmd);
+ crs.setTableName(SUPPLIERS_TABLE);
+ }
+
+ /*
+ * Add rows to SUPPLIERS table
+ */
+ protected void createSuppiersRows(RowSet rs) throws SQLException {
+
+ // insert into SUPPLIERS values(49, 'Superior Coffee', '1 Party Place',
+ // 'Mendocino', 'CA', '95460')
+ rs.moveToInsertRow();
+ rs.updateInt(1, 49);
+ rs.updateString(2, "Superior Coffee");
+ rs.updateString(3, "1 Party Place");
+ rs.updateString(4, "Mendocino");
+ rs.updateString(5, "CA");
+ rs.updateString(6, "95460");
+ rs.insertRow();
+
+ // insert into SUPPLIERS values(101, 'Acme, Inc.', '99 Market Street',
+ // 'Groundsville', 'CA', '95199')
+ rs.moveToInsertRow();
+ rs.updateInt(1, 101);
+ rs.updateString(2, "Acme, Inc.");
+ rs.updateString(3, "99 Market Street");
+ rs.updateString(4, "Groundsville");
+ rs.updateString(5, "CA");
+ rs.updateString(6, "95199");
+ rs.insertRow();
+ // insert into SUPPLIERS values(150, 'The High Ground',
+ // '100 Coffee Lane', 'Meadows', 'CA', '93966')
+ rs.moveToInsertRow();
+ rs.updateInt(1, 150);
+ rs.updateString(2, "The High Ground");
+ rs.updateString(3, "100 Coffee Lane");
+ rs.updateString(4, "Meadows");
+ rs.updateString(5, "CA");
+ rs.updateString(6, "93966");
+ rs.insertRow();
+ // insert into SUPPLIERS values(456," 'Restaurant Supplies, Inc.',
+ // '200 Magnolia Street', 'Meadows', 'CA', '93966')
+ rs.moveToInsertRow();
+ rs.updateInt(1, 456);
+ rs.updateString(2, "Restaurant Supplies, Inc.");
+ rs.updateString(3, "200 Magnolia Stree");
+ rs.updateString(4, "Meadows");
+ rs.updateString(5, "CA");
+ rs.updateString(6, "93966");
+ rs.insertRow();
+ // insert into SUPPLIERS values(927, 'Professional Kitchen',
+ // '300 Daisy Avenue', 'Groundsville'," 'CA', '95199')
+ rs.moveToInsertRow();
+ rs.updateInt(1, 927);
+ rs.updateString(2, "Professional Kitchen");
+ rs.updateString(3, "300 Daisy Avenue");
+ rs.updateString(4, "Groundsville");
+ rs.updateString(5, "CA");
+ rs.updateString(6, "95199");
+ rs.insertRow();
+ }
+
+ /*
+ * DataProvider used to set parameters for basic types that are supported
+ */
+ @DataProvider(name = "createCachedRowSetsToUse")
+ private Object[][] createCachedRowSetsToUse() throws SQLException {
+ CachedRowSet crs = rsf.createCachedRowSet();
+ initCoffeesMetaData(crs);
+ createCoffeesRows(crs);
+ // Make sure you are not on the insertRow
+ crs.moveToCurrentRow();
+ CachedRowSet crs1 = rsf.createCachedRowSet();
+ initSuppliersMetaData(crs1);
+ createSuppiersRows(crs1);
+ // Make sure you are not on the insertRow
+ crs1.moveToCurrentRow();
+ return new Object[][]{
+ {crs, crs1}
+ };
+ }
+
+ /*
+ * Validate that the correct coffees are returned for SUP_ID
+ */
+ private void validateResults(final JoinRowSet jrs) throws SQLException {
+ List<Integer> results = new ArrayList<>();
+ jrs.beforeFirst();
+ while (jrs.next()) {
+ if (jrs.getInt(JOIN_COLNAME) == SUP_ID) {
+ results.add(jrs.getInt("COF_ID"));
+ }
+ }
+ assertEquals(results.toArray(), EXPECTED);
+ }
+
+ /*
+ * Join two CachedRowSets specifying a column name to join against
+ */
+ @Test(dataProvider = "createCachedRowSetsToUse")
+ public void joinRowSetTests0000(CachedRowSet crs, CachedRowSet crs1)
+ throws Exception {
+
+ try (JoinRowSet jrs = newInstance()) {
+ jrs.addRowSet(crs, JOIN_COLNAME);
+ jrs.addRowSet(crs1, JOIN_COLNAME);
+ validateResults(jrs);
+ crs.close();
+ crs1.close();
+ }
+ }
+
+ /*
+ * Join two CachedRowSets specifying a column index to join against
+ */
+ @Test(dataProvider = "createCachedRowSetsToUse")
+ public void joinRowSetTests0001(CachedRowSet crs, CachedRowSet crs1)
+ throws Exception {
+
+ try (JoinRowSet jrs = newInstance()) {
+ jrs.addRowSet(crs, COFFEES_JOIN_COLUMN_INDEX);
+ jrs.addRowSet(crs1, SUPPLIERS_JOIN_COLUMN_INDEX);
+ validateResults(jrs);
+ crs.close();
+ crs1.close();
+ }
+ }
+
+ /*
+ * Join two CachedRowSets specifying a column name to join against
+ */
+ @Test(dataProvider = "createCachedRowSetsToUse")
+ public void joinRowSetTests0002(CachedRowSet crs, CachedRowSet crs1)
+ throws Exception {
+
+ try (JoinRowSet jrs = newInstance()) {
+ RowSet[] rowsets = {crs, crs1};
+ String[] joinCols = {JOIN_COLNAME, JOIN_COLNAME};
+ jrs.addRowSet(rowsets, joinCols);
+ validateResults(jrs);
+ crs.close();
+ crs1.close();
+ }
+ }
+
+ /*
+ * Join two CachedRowSets specifying a column index to join against
+ */
+ @Test(dataProvider = "createCachedRowSetsToUse")
+ public void joinRowSetTests0003(CachedRowSet crs, CachedRowSet crs1)
+ throws Exception {
+
+ try (JoinRowSet jrs = newInstance()) {
+ RowSet[] rowsets = {crs, crs1};
+ int[] joinCols = {COFFEES_JOIN_COLUMN_INDEX,
+ SUPPLIERS_JOIN_COLUMN_INDEX};
+ jrs.addRowSet(rowsets, joinCols);
+ validateResults(jrs);
+ crs.close();
+ crs1.close();
+ }
+ }
+
+ /*
+ * Join two CachedRowSets specifying a column name to join against
+ */
+ @Test(dataProvider = "createCachedRowSetsToUse")
+ public void joinRowSetTests0005(CachedRowSet crs, CachedRowSet crs1)
+ throws Exception {
+
+ try (JoinRowSet jrs = newInstance()) {
+ crs.setMatchColumn(JOIN_COLNAME);
+ crs1.setMatchColumn(JOIN_COLNAME);
+ jrs.addRowSet(crs);
+ jrs.addRowSet(crs1);
+ validateResults(jrs);
+ crs.close();
+ crs1.close();
+ }
+ }
+
+ /*
+ * Join two CachedRowSets specifying a column index to join against
+ */
+ @Test(dataProvider = "createCachedRowSetsToUse")
+ public void joinRowSetTests0006(CachedRowSet crs, CachedRowSet crs1)
+ throws Exception {
+
+ try (JoinRowSet jrs = newInstance()) {
+ crs.setMatchColumn(COFFEES_JOIN_COLUMN_INDEX);
+ crs1.setMatchColumn(SUPPLIERS_JOIN_COLUMN_INDEX);
+
+ jrs.addRowSet(crs);
+ jrs.addRowSet(crs1);
+ validateResults(jrs);
+ crs.close();
+ crs1.close();
+ }
+ }
+
+ // Disabled tests due to bugs in JoinRowSet
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0004(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0005(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0008(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0026(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0027(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0053(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0054(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType", enabled = false)
+ public void commonCachedRowSetTest0055(CachedRowSet rs) throws Exception {
+ }
+
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0009(WebRowSet wrs1) throws Exception {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/webrowset/CommonWebRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,400 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 test.rowset.webrowset;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.InputStreamReader;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStreamWriter;
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.util.Arrays;
+import javax.sql.rowset.WebRowSet;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertEqualsNoOrder;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+import test.rowset.cachedrowset.CommonCachedRowSetTests;
+
+public abstract class CommonWebRowSetTests extends CommonCachedRowSetTests {
+
+ protected final String XMLFILEPATH = System.getProperty("test.src", ".")
+ + File.separatorChar + "xml" + File.separatorChar;
+ protected final String COFFEE_ROWS_XML = XMLFILEPATH + "COFFEE_ROWS.xml";
+ protected final String DELETED_COFFEE_ROWS_XML
+ = XMLFILEPATH + "DELETED_COFFEE_ROWS.xml";
+ protected final String MODFIED_DELETED_COFFEE_ROWS_XML
+ = XMLFILEPATH + "MODFIED_DELETED_COFFEE_ROWS.xml";
+ protected final String UPDATED_COFFEE_ROWS_XML
+ = XMLFILEPATH + "UPDATED_COFFEE_ROWS.xml";
+ protected final String INSERTED_COFFEE_ROWS_XML
+ = XMLFILEPATH + "INSERTED_COFFEE_ROWS.xml";
+ protected final String UPDATED_INSERTED_COFFEE_ROWS_XML
+ = XMLFILEPATH + "UPDATED_INSERTED_COFFEE_ROWS.xml";
+
+
+ /*
+ * Utility method to write a WebRowSet XML file via an OutputStream
+ */
+ protected ByteArrayOutputStream writeWebRowSetWithOutputStream(WebRowSet rs) throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
+ rs.writeXml(oos);
+ }
+ return baos;
+ }
+
+ /*
+ * Utility method to write a WebRowSet XML file via an OutputStream
+ * and populating the WebRowSet via a ResultSet
+ */
+ protected ByteArrayOutputStream writeWebRowSetWithOutputStream(ResultSet rs) throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
+ WebRowSet wrs = rsf.createWebRowSet();
+ wrs.writeXml(rs, oos);
+ }
+ return baos;
+ }
+
+
+ /*
+ * Utility method to popoulate a WebRowSet via a InputStream
+ */
+ protected WebRowSet readWebRowSetWithOInputStream(ByteArrayOutputStream baos) throws Exception {
+ WebRowSet wrs1 = rsf.createWebRowSet();
+ try (ObjectInputStream ois
+ = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()))) {
+ wrs1.readXml(ois);
+ }
+ return wrs1;
+ }
+
+ /*
+ * Utility method to write a WebRowSet XML file via an Writer
+ */
+ protected ByteArrayOutputStream writeWebRowSetWithOutputStreamWithWriter(WebRowSet rs) throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ OutputStreamWriter osw = new OutputStreamWriter(baos);
+ rs.writeXml(osw);
+ return baos;
+ }
+
+ /*
+ * Utility method to write a WebRowSet XML file via an Writer and populating
+ * the WebRowSet via a ResultSet
+ */
+ protected ByteArrayOutputStream writeWebRowSetWithOutputStreamWithWriter(ResultSet rs) throws Exception {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ OutputStreamWriter osw = new OutputStreamWriter(baos);
+ WebRowSet wrs = rsf.createWebRowSet();
+ wrs.writeXml(rs, osw);
+ return baos;
+ }
+
+ /*
+ * Utility method to popoulate a WebRowSet via a Readar
+ */
+ protected WebRowSet readWebRowSetWithOInputStreamWithReader(ByteArrayOutputStream baos) throws Exception {
+ WebRowSet wrs1 = rsf.createWebRowSet();
+ InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(baos.toByteArray()));
+ wrs1.readXml(isr);
+ return wrs1;
+ }
+
+ /*
+ * Validate the expected Rows are contained within the RowSet
+ */
+ @Test(dataProvider = "rowsetUsingCoffees")
+ public void WebRowSetTest0000(WebRowSet wrs) throws Exception {
+ assertEquals(getPrimaryKeys(wrs), COFFEES_PRIMARY_KEYS);
+ assertEquals(wrs.size(), COFFEES_ROWS);
+ wrs.close();
+ }
+
+ /*
+ * Validate the expected Rows are contained within the RowSet
+ * populated by readXML(Reader)
+ */
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0001(WebRowSet wrs1) throws Exception {
+
+ try (FileReader fr = new FileReader(COFFEE_ROWS_XML)) {
+ wrs1.readXml(fr);
+ }
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ assertEquals(wrs1.size(), COFFEES_ROWS);
+ wrs1.close();
+
+ }
+
+ /*
+ * Validate the expected Rows are contained within the RowSet
+ * populated by readXML(InputStream)
+ */
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0002(WebRowSet wrs1) throws Exception {
+ try (FileInputStream fis = new FileInputStream(COFFEE_ROWS_XML)) {
+ wrs1.readXml(fis);
+ }
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ assertEquals(wrs1.size(), COFFEES_ROWS);
+ wrs1.close();
+ }
+
+ /*
+ * Write a WebRowSet via writeXML(OutputStream), read it
+ * back via readXML(InputStream) and validate the primary keys
+ * are the same
+ */
+ @Test(dataProvider = "rowsetUsingCoffees")
+ public void WebRowSetTest0003(WebRowSet wrs) throws Exception {
+ ByteArrayOutputStream baos = writeWebRowSetWithOutputStream(wrs);
+ try (WebRowSet wrs1 = readWebRowSetWithOInputStream(baos)) {
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ assertEquals(wrs1.size(), COFFEES_ROWS);
+ }
+ }
+
+ /*
+ * Write a ResultSet via writeXML(OutputStream), read it
+ * back via readXML(InputStream) and validate the primary keys
+ * are the same
+ */
+ @Test(dataProvider = "rowsetUsingCoffees")
+ public void WebRowSetTest0004(WebRowSet wrs) throws Exception {
+ ResultSet rs = wrs;
+ rs.beforeFirst();
+ ByteArrayOutputStream baos = writeWebRowSetWithOutputStream(rs);
+ try (WebRowSet wrs1 = readWebRowSetWithOInputStream(baos)) {
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ assertEquals(wrs1.size(), COFFEES_ROWS);
+ }
+ }
+
+ /*
+ * Write a WebRowSet via writeXML(Writer), read it
+ * back via readXML(Reader) and validate the primary keys
+ * are the same
+ */
+ @Test(dataProvider = "rowsetUsingCoffees")
+ public void WebRowSetTest0005(WebRowSet wrs) throws Exception {
+ ByteArrayOutputStream baos = writeWebRowSetWithOutputStreamWithWriter(wrs);
+ try (WebRowSet wrs1 = readWebRowSetWithOInputStreamWithReader(baos)) {
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ assertEquals(wrs1.size(), COFFEES_ROWS);
+ }
+ }
+
+ /*
+ * Write a WebRowSet via writeXML(Writer), read it
+ * back via readXML(Reader) and validate the primary keys
+ * are the same
+ */
+ @Test(dataProvider = "rowsetUsingCoffees")
+ public void WebRowSetTest0006(WebRowSet wrs) throws Exception {
+ ResultSet rs = wrs;
+ rs.beforeFirst();
+ ByteArrayOutputStream baos = writeWebRowSetWithOutputStreamWithWriter(rs);
+ try (WebRowSet wrs1 = readWebRowSetWithOInputStreamWithReader(baos)) {
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ assertEquals(wrs1.size(), COFFEES_ROWS);
+ }
+ }
+
+ /*
+ * Validate the expected Rows are contained within the RowSet
+ * after deleting the specified rows
+ */
+ @Test(dataProvider = "rowsetUsingCoffees", enabled = false)
+ public void WebRowSetTest0007(WebRowSet wrs) throws Exception {
+ assertEquals(getPrimaryKeys(wrs), COFFEES_PRIMARY_KEYS);
+ int[] rowsToDelete = {2, 4};
+ assertEquals(getPrimaryKeys(wrs), COFFEES_PRIMARY_KEYS);
+ for (int row : rowsToDelete) {
+ assertTrue(deleteRowByPrimaryKey(wrs, row, 1));
+ }
+
+ FileInputStream fis = new FileInputStream(MODFIED_DELETED_COFFEE_ROWS_XML);
+ try (WebRowSet wrs1 = rsf.createWebRowSet()) {
+ wrs1.readXml(fis);
+ // With setShowDeleted(false) which is the default,
+ // the deleted row should not be visible
+ for (int row : rowsToDelete) {
+ assertTrue(findRowByPrimaryKey(wrs1, row, 1));
+ }
+ assertTrue(wrs.size() == COFFEES_ROWS);
+ // With setShowDeleted(true), the deleted row should be visible
+ for (int row : rowsToDelete) {
+ assertTrue(findRowByPrimaryKey(wrs, row, 1));
+ }
+ }
+ }
+
+ /*
+ * Validate the expected Rows are contained within the RowSet
+ * that was populated by reading an xml file with all rows
+ * marked as a currentRow
+ */
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0008(WebRowSet wrs1) throws Exception {
+ FileInputStream fis = new FileInputStream(COFFEE_ROWS_XML);
+ wrs1.readXml(fis);
+ assertTrue(wrs1.size() == COFFEES_ROWS);
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ // Validate that the rows are not marked as deleted, inserted or updated
+ wrs1.beforeFirst();
+ while (wrs1.next()) {
+ assertFalse(wrs1.rowDeleted());
+ assertFalse(wrs1.rowInserted());
+ assertFalse(wrs1.rowUpdated());
+ }
+ wrs1.close();
+ }
+
+ /*
+ * Read an XML file to populate a WebRowSet and validate that the rows
+ * that are marked as deleted are marked as such in the WebRowSet
+ * Also validate that they are or are not visible based on the
+ * setShowDeleted value
+ */
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0009(WebRowSet wrs1) throws Exception {
+ int[] rowsToDelete = {2, 4};
+ Object[] expectedRows = {1, 3, 5};
+ FileInputStream fis = new FileInputStream(DELETED_COFFEE_ROWS_XML);
+ wrs1.readXml(fis);
+ assertTrue(wrs1.size() == COFFEES_ROWS);
+ assertEquals(getPrimaryKeys(wrs1), expectedRows);
+ // With setShowDeleted(false) which is the default,
+ // the deleted row should not be visible
+ for (int row : rowsToDelete) {
+ assertFalse(findRowByPrimaryKey(wrs1, row, 1));
+ }
+ // With setShowDeleted(true), the deleted row should be visible
+ wrs1.setShowDeleted(true);
+ for (int row : rowsToDelete) {
+ assertTrue(findRowByPrimaryKey(wrs1, row, 1));
+ }
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ wrs1.close();
+
+ }
+
+ /*
+ * Validate that the correct row in the WebRowSet that had been created
+ * from an xml file is marked as updated and contains the correct values
+ */
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0010(WebRowSet wrs1) throws Exception {
+ FileInputStream fis = new FileInputStream(UPDATED_COFFEE_ROWS_XML);
+ wrs1.readXml(fis);
+ assertTrue(wrs1.size() == COFFEES_ROWS);
+ assertEquals(getPrimaryKeys(wrs1), COFFEES_PRIMARY_KEYS);
+ wrs1.beforeFirst();
+ while (wrs1.next()) {
+ if (wrs1.getInt(1) == 3) {
+ assertTrue(wrs1.rowUpdated());
+ assertTrue(wrs1.getInt(5) == 21 && wrs1.getInt(6) == 69);
+ assertFalse(wrs1.rowDeleted());
+ assertFalse(wrs1.rowInserted());
+ } else {
+ assertFalse(wrs1.rowUpdated());
+ assertFalse(wrs1.rowDeleted());
+ assertFalse(wrs1.rowInserted());
+ }
+ }
+ wrs1.close();
+ }
+
+ /*
+ * Validate the correct row is marked as inserted in a WebRowSet
+ * that is read from an xml file
+ */
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0011(WebRowSet wrs1) throws Exception {
+ int expectedSize = COFFEES_ROWS + 2;
+ int addedRowPK = 15;
+ int addedRowPK2 = 20;
+ Object[] expected = Arrays.copyOf(COFFEES_PRIMARY_KEYS, expectedSize);
+ expected[expectedSize - 2] = addedRowPK;
+ expected[expectedSize - 1] = addedRowPK2;
+ FileInputStream fis = new FileInputStream(INSERTED_COFFEE_ROWS_XML);
+ wrs1.readXml(fis);
+ assertTrue(wrs1.size() == expectedSize);
+ assertEqualsNoOrder(getPrimaryKeys(wrs1), expected);
+ wrs1.beforeFirst();
+ while (wrs1.next()) {
+ if (wrs1.getInt(1) == 15 || wrs1.getInt(1) == 20) {
+ assertTrue(wrs1.rowInserted());
+ assertFalse(wrs1.rowDeleted());
+ assertFalse(wrs1.rowUpdated());
+ } else {
+ assertFalse(wrs1.rowInserted());
+ assertFalse(wrs1.rowDeleted());
+ assertFalse(wrs1.rowUpdated());
+ }
+ }
+ wrs1.close();
+ }
+
+ /*
+ * Read an xml file which contains a row that was inserted and updated
+ */
+ @Test(dataProvider = "rowSetType")
+ public void WebRowSetTest0012(WebRowSet wrs1) throws Exception {
+ int expectedSize = COFFEES_ROWS + 1;
+ int addedRowPK = 100;
+ Object[] expected = Arrays.copyOf(COFFEES_PRIMARY_KEYS, expectedSize);
+ expected[expectedSize - 1] = addedRowPK;
+ FileInputStream fis = new FileInputStream(UPDATED_INSERTED_COFFEE_ROWS_XML);
+ wrs1.readXml(fis);
+ assertTrue(wrs1.size() == expectedSize);
+ assertEquals(getPrimaryKeys(wrs1), expected);
+ wrs1.beforeFirst();
+ while (wrs1.next()) {
+ if (wrs1.getInt(1) == addedRowPK) {
+ // Row that was inserted and updated
+ assertTrue(wrs1.rowUpdated());
+ assertTrue(
+ wrs1.getBigDecimal(4).equals(BigDecimal.valueOf(12.99))
+ && wrs1.getInt(6) == 125);
+ assertFalse(wrs1.rowDeleted());
+ assertTrue(wrs1.rowInserted());
+ } else {
+ // Remaining rows should only be inserted
+ assertFalse(wrs1.rowUpdated());
+ assertFalse(wrs1.rowDeleted());
+ assertTrue(wrs1.rowInserted());
+ }
+ }
+ wrs1.close();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/test/rowset/webrowset/WebRowSetTests.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package test.rowset.webrowset;
+
+import java.sql.SQLException;
+import javax.sql.rowset.WebRowSet;
+
+public class WebRowSetTests extends CommonWebRowSetTests {
+
+ @Override
+ protected WebRowSet newInstance() throws SQLException {
+ return rsf.createWebRowSet();
+ }
+
+}
--- a/jdk/test/javax/sql/testng/util/StubSyncProvider.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/javax/sql/testng/util/StubSyncProvider.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -51,12 +51,12 @@
@Override
public RowSetReader getRowSetReader() {
- throw new UnsupportedOperationException("Not supported yet.");
+ return null;
}
@Override
public RowSetWriter getRowSetWriter() {
- throw new UnsupportedOperationException("Not supported yet.");
+ return null;
}
@Override
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/xml/COFFEE_ROWS.xml Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,191 @@
+<?xml version="1.0"?>
+<webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
+ <properties>
+ <command><null/></command>
+ <concurrency>1008</concurrency>
+ <datasource><null/></datasource>
+ <escape-processing>true</escape-processing>
+ <fetch-direction>1000</fetch-direction>
+ <fetch-size>0</fetch-size>
+ <isolation-level>2</isolation-level>
+ <key-columns>
+ </key-columns>
+ <map>
+ </map>
+ <max-field-size>0</max-field-size>
+ <max-rows>0</max-rows>
+ <query-timeout>0</query-timeout>
+ <read-only>true</read-only>
+ <rowset-type>ResultSet.TYPE_SCROLL_INSENSITIVE</rowset-type>
+ <show-deleted>false</show-deleted>
+ <table-name>COFFEES</table-name>
+ <url><null/></url>
+ <sync-provider>
+ <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name>
+ <sync-provider-vendor>Oracle Corporation</sync-provider-vendor>
+ <sync-provider-version>1.0</sync-provider-version>
+ <sync-provider-grade>2</sync-provider-grade>
+ <data-source-lock>1</data-source-lock>
+ </sync-provider>
+ </properties>
+ <metadata>
+ <column-count>6</column-count>
+ <column-definition>
+ <column-index>1</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>COF_NAME</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>2</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SUP_ID</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>12</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>3</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>PRICE</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>4</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SALES</column-name>
+ <schema-name></schema-name>
+ <column-precision>10</column-precision>
+ <column-scale>2</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>2</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>5</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>TOTAL</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>6</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name><null/></column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ </metadata>
+ <data>
+ <currentRow>
+ <columnValue>1</columnValue>
+ <columnValue>Colombian</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>7.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>2</columnValue>
+ <columnValue>French_Roast</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>3</columnValue>
+ <columnValue>Espresso</columnValue>
+ <columnValue>150</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>4</columnValue>
+ <columnValue>Colombian_Decaf</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>5</columnValue>
+ <columnValue>French_Roast_Decaf</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ </data>
+</webRowSet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/xml/DELETED_COFFEE_ROWS.xml Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,191 @@
+<?xml version="1.0"?>
+<webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
+ <properties>
+ <command>SELECT * FROM COFFEES</command>
+ <concurrency>1008</concurrency>
+ <datasource><null/></datasource>
+ <escape-processing>true</escape-processing>
+ <fetch-direction>1000</fetch-direction>
+ <fetch-size>0</fetch-size>
+ <isolation-level>2</isolation-level>
+ <key-columns>
+ </key-columns>
+ <map>
+ </map>
+ <max-field-size>0</max-field-size>
+ <max-rows>0</max-rows>
+ <query-timeout>0</query-timeout>
+ <read-only>true</read-only>
+ <rowset-type>ResultSet.TYPE_SCROLL_INSENSITIVE</rowset-type>
+ <show-deleted>false</show-deleted>
+ <table-name>COFFEES</table-name>
+ <url>jdbc:derby://localhost:1527/testDB;create=true</url>
+ <sync-provider>
+ <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name>
+ <sync-provider-vendor>Oracle Corporation</sync-provider-vendor>
+ <sync-provider-version>1.0</sync-provider-version>
+ <sync-provider-grade>2</sync-provider-grade>
+ <data-source-lock>1</data-source-lock>
+ </sync-provider>
+ </properties>
+ <metadata>
+ <column-count>6</column-count>
+ <column-definition>
+ <column-index>1</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>COF_NAME</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>2</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SUP_ID</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>12</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>3</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>PRICE</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>4</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SALES</column-name>
+ <schema-name></schema-name>
+ <column-precision>10</column-precision>
+ <column-scale>2</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>2</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>5</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>TOTAL</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>6</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name><null/></column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ </metadata>
+ <data>
+ <currentRow>
+ <columnValue>1</columnValue>
+ <columnValue>Colombian</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>7.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <deleteRow>
+ <columnValue>2</columnValue>
+ <columnValue>French_Roast</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </deleteRow>
+ <currentRow>
+ <columnValue>3</columnValue>
+ <columnValue>Espresso</columnValue>
+ <columnValue>150</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <deleteRow>
+ <columnValue>4</columnValue>
+ <columnValue>Colombian_Decaf</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </deleteRow>
+ <currentRow>
+ <columnValue>5</columnValue>
+ <columnValue>French_Roast_Decaf</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ </data>
+</webRowSet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/xml/INSERTED_COFFEE_ROWS.xml Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,207 @@
+<?xml version="1.0"?>
+<webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
+ <properties>
+ <command><null/></command>
+ <concurrency>1008</concurrency>
+ <datasource><null/></datasource>
+ <escape-processing>true</escape-processing>
+ <fetch-direction>1000</fetch-direction>
+ <fetch-size>0</fetch-size>
+ <isolation-level>2</isolation-level>
+ <key-columns>
+ </key-columns>
+ <map>
+ </map>
+ <max-field-size>0</max-field-size>
+ <max-rows>0</max-rows>
+ <query-timeout>0</query-timeout>
+ <read-only>true</read-only>
+ <rowset-type>ResultSet.TYPE_SCROLL_INSENSITIVE</rowset-type>
+ <show-deleted>false</show-deleted>
+ <table-name>COFFEES</table-name>
+ <url><null/></url>
+ <sync-provider>
+ <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name>
+ <sync-provider-vendor>Oracle Corporation</sync-provider-vendor>
+ <sync-provider-version>1.0</sync-provider-version>
+ <sync-provider-grade>2</sync-provider-grade>
+ <data-source-lock>1</data-source-lock>
+ </sync-provider>
+ </properties>
+ <metadata>
+ <column-count>6</column-count>
+ <column-definition>
+ <column-index>1</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>COF_NAME</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>2</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SUP_ID</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>12</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>3</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>PRICE</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>4</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SALES</column-name>
+ <schema-name></schema-name>
+ <column-precision>10</column-precision>
+ <column-scale>2</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>2</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>5</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>TOTAL</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>6</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name><null/></column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ </metadata>
+ <data>
+ <currentRow>
+ <columnValue>1</columnValue>
+ <columnValue>Colombian</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>7.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>2</columnValue>
+ <columnValue>French_Roast</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>3</columnValue>
+ <columnValue>Espresso</columnValue>
+ <columnValue>150</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>4</columnValue>
+ <columnValue>Colombian_Decaf</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <insertRow>
+ <columnValue>15</columnValue>
+ <columnValue>Hazelnut</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <insertRow>
+ <columnValue>20</columnValue>
+ <columnValue>French Vanilla</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <currentRow>
+ <columnValue>5</columnValue>
+ <columnValue>French_Roast_Decaf</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ </data>
+</webRowSet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/xml/MODFIED_DELETED_COFFEE_ROWS.xml Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,191 @@
+<?xml version="1.0"?>
+<webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
+ <properties>
+ <command><null/></command>
+ <concurrency>1008</concurrency>
+ <datasource><null/></datasource>
+ <escape-processing>true</escape-processing>
+ <fetch-direction>1000</fetch-direction>
+ <fetch-size>0</fetch-size>
+ <isolation-level>2</isolation-level>
+ <key-columns>
+ </key-columns>
+ <map>
+ </map>
+ <max-field-size>0</max-field-size>
+ <max-rows>0</max-rows>
+ <query-timeout>0</query-timeout>
+ <read-only>true</read-only>
+ <rowset-type>ResultSet.TYPE_SCROLL_INSENSITIVE</rowset-type>
+ <show-deleted>false</show-deleted>
+ <table-name>COFFEES</table-name>
+ <url><null/></url>
+ <sync-provider>
+ <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name>
+ <sync-provider-vendor>Oracle Corporation</sync-provider-vendor>
+ <sync-provider-version>1.0</sync-provider-version>
+ <sync-provider-grade>2</sync-provider-grade>
+ <data-source-lock>1</data-source-lock>
+ </sync-provider>
+ </properties>
+ <metadata>
+ <column-count>6</column-count>
+ <column-definition>
+ <column-index>1</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>COF_NAME</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>2</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SUP_ID</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>12</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>3</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>PRICE</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>4</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SALES</column-name>
+ <schema-name></schema-name>
+ <column-precision>10</column-precision>
+ <column-scale>2</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>2</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>5</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>TOTAL</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>6</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name><null/></column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ </metadata>
+ <data>
+ <insertRow>
+ <columnValue>1</columnValue>
+ <columnValue>Colombian</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>7.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <modifyRow>
+ <columnValue>2</columnValue>
+ <columnValue>French_Roast</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </modifyRow>
+ <insertRow>
+ <columnValue>3</columnValue>
+ <columnValue>Espresso</columnValue>
+ <columnValue>150</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <modifyRow>
+ <columnValue>4</columnValue>
+ <columnValue>Colombian_Decaf</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </modifyRow>
+ <insertRow>
+ <columnValue>5</columnValue>
+ <columnValue>French_Roast_Decaf</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ </data>
+</webRowSet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/xml/UPDATED_COFFEE_ROWS.xml Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,193 @@
+<?xml version="1.0"?>
+<webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
+ <properties>
+ <command>SELECT * FROM COFFEES</command>
+ <concurrency>1008</concurrency>
+ <datasource><null/></datasource>
+ <escape-processing>true</escape-processing>
+ <fetch-direction>1000</fetch-direction>
+ <fetch-size>0</fetch-size>
+ <isolation-level>2</isolation-level>
+ <key-columns>
+ </key-columns>
+ <map>
+ </map>
+ <max-field-size>0</max-field-size>
+ <max-rows>0</max-rows>
+ <query-timeout>0</query-timeout>
+ <read-only>true</read-only>
+ <rowset-type>ResultSet.TYPE_SCROLL_INSENSITIVE</rowset-type>
+ <show-deleted>false</show-deleted>
+ <table-name>COFFEES</table-name>
+ <url>jdbc:derby://localhost:1527/testDB;create=true</url>
+ <sync-provider>
+ <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name>
+ <sync-provider-vendor>Oracle Corporation</sync-provider-vendor>
+ <sync-provider-version>1.0</sync-provider-version>
+ <sync-provider-grade>2</sync-provider-grade>
+ <data-source-lock>1</data-source-lock>
+ </sync-provider>
+ </properties>
+ <metadata>
+ <column-count>6</column-count>
+ <column-definition>
+ <column-index>1</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>COF_NAME</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>2</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SUP_ID</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>12</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>3</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>PRICE</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>4</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SALES</column-name>
+ <schema-name></schema-name>
+ <column-precision>10</column-precision>
+ <column-scale>2</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>2</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>5</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>TOTAL</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>6</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name><null/></column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ </metadata>
+ <data>
+ <currentRow>
+ <columnValue>1</columnValue>
+ <columnValue>Colombian</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>7.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>2</columnValue>
+ <columnValue>French_Roast</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>3</columnValue>
+ <columnValue>Espresso</columnValue>
+ <columnValue>150</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <updateRow>21</updateRow>
+ <columnValue>0</columnValue>
+ <updateRow>69</updateRow>
+ </currentRow>
+ <currentRow>
+ <columnValue>4</columnValue>
+ <columnValue>Colombian_Decaf</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ <currentRow>
+ <columnValue>5</columnValue>
+ <columnValue>French_Roast_Decaf</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </currentRow>
+ </data>
+</webRowSet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/sql/testng/xml/UPDATED_INSERTED_COFFEE_ROWS.xml Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,201 @@
+<?xml version="1.0"?>
+<webRowSet xmlns="http://java.sun.com/xml/ns/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://java.sun.com/xml/ns/jdbc http://java.sun.com/xml/ns/jdbc/webrowset.xsd">
+ <properties>
+ <command><null/></command>
+ <concurrency>1008</concurrency>
+ <datasource><null/></datasource>
+ <escape-processing>true</escape-processing>
+ <fetch-direction>1000</fetch-direction>
+ <fetch-size>0</fetch-size>
+ <isolation-level>2</isolation-level>
+ <key-columns>
+ </key-columns>
+ <map>
+ </map>
+ <max-field-size>0</max-field-size>
+ <max-rows>0</max-rows>
+ <query-timeout>0</query-timeout>
+ <read-only>true</read-only>
+ <rowset-type>ResultSet.TYPE_SCROLL_INSENSITIVE</rowset-type>
+ <show-deleted>false</show-deleted>
+ <table-name>COFFEES</table-name>
+ <url><null/></url>
+ <sync-provider>
+ <sync-provider-name>com.sun.rowset.providers.RIOptimisticProvider</sync-provider-name>
+ <sync-provider-vendor>Oracle Corporation</sync-provider-vendor>
+ <sync-provider-version>1.0</sync-provider-version>
+ <sync-provider-grade>2</sync-provider-grade>
+ <data-source-lock>1</data-source-lock>
+ </sync-provider>
+ </properties>
+ <metadata>
+ <column-count>6</column-count>
+ <column-definition>
+ <column-index>1</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>COF_NAME</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>2</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SUP_ID</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>12</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>3</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>PRICE</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>4</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>SALES</column-name>
+ <schema-name></schema-name>
+ <column-precision>10</column-precision>
+ <column-scale>2</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>2</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>5</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name>TOTAL</column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ <column-definition>
+ <column-index>6</column-index>
+ <auto-increment>false</auto-increment>
+ <case-sensitive>false</case-sensitive>
+ <currency>false</currency>
+ <nullable>0</nullable>
+ <signed>false</signed>
+ <searchable>false</searchable>
+ <column-display-size>0</column-display-size>
+ <column-label><null/></column-label>
+ <column-name><null/></column-name>
+ <schema-name></schema-name>
+ <column-precision>0</column-precision>
+ <column-scale>0</column-scale>
+ <table-name></table-name>
+ <catalog-name></catalog-name>
+ <column-type>4</column-type>
+ <column-type-name><null/></column-type-name>
+ </column-definition>
+ </metadata>
+ <data>
+ <insertRow>
+ <columnValue>1</columnValue>
+ <columnValue>Colombian</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>7.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <insertRow>
+ <columnValue>2</columnValue>
+ <columnValue>French_Roast</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <insertRow>
+ <columnValue>3</columnValue>
+ <columnValue>Espresso</columnValue>
+ <columnValue>150</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <insertRow>
+ <columnValue>4</columnValue>
+ <columnValue>Colombian_Decaf</columnValue>
+ <columnValue>101</columnValue>
+ <columnValue>8.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <insertRow>
+ <columnValue>5</columnValue>
+ <columnValue>French_Roast_Decaf</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <columnValue>0</columnValue>
+ <columnValue>0</columnValue>
+ </insertRow>
+ <insertRow>
+ <columnValue>100</columnValue>
+ <columnValue>Mocha</columnValue>
+ <columnValue>49</columnValue>
+ <columnValue>9.99</columnValue>
+ <updateRow>12.99</updateRow>
+ <columnValue>20</columnValue>
+ <columnValue>35</columnValue>
+ <updateRow>125</updateRow>
+ </insertRow>
+ </data>
+</webRowSet>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JButton/4796987/bug4796987.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 4796987
+ * @summary XP Only: JButton.setBorderPainted() does not work with XP L&F
+ * @author Alexander Scherbatiy
+ * @library ../../regtesthelpers
+ * @build Util
+ * @run main bug4796987
+ */
+
+import java.awt.*;
+import javax.swing.*;
+import sun.awt.OSInfo;
+import sun.awt.SunToolkit;
+import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;
+
+public class bug4796987 {
+
+ private static JButton button1;
+ private static JButton button2;
+
+ public static void main(String[] args) throws Exception {
+ if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS
+ && OSInfo.getWindowsVersion() == OSInfo.WINDOWS_XP) {
+ UIManager.setLookAndFeel(new WindowsLookAndFeel());
+ testButtonBorder();
+ }
+ }
+
+ private static void testButtonBorder() throws Exception {
+ SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ SwingUtilities.invokeAndWait(new Runnable() {
+
+ public void run() {
+ createAndShowGUI();
+ }
+ });
+
+ toolkit.realSync();
+ Thread.sleep(500);
+
+ Point p1 = Util.getCenterPoint(button1);
+ Point p2 = Util.getCenterPoint(button2);
+
+ Color color = robot.getPixelColor(p1.x, p2.x);
+ for (int dx = p1.x; dx < p2.x - p1.x; dx++) {
+ robot.mouseMove(p1.x + dx, p1.y);
+ if (!color.equals(robot.getPixelColor(p1.x + dx, p1.y))) {
+ throw new RuntimeException("Button has border and background!");
+ }
+ }
+ }
+
+ private static JButton getButton() {
+ JButton button = new JButton();
+ button.setBorderPainted(false);
+ button.setFocusable(false);
+ return button;
+ }
+
+ private static void createAndShowGUI() {
+ JFrame frame = new JFrame("Test");
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.setSize(200, 200);
+
+ JButton button = new JButton();
+ button.setBorder(null);
+
+ JPanel panel = new JPanel(new BorderLayout(50, 50));
+ panel.add(getButton(), BorderLayout.CENTER);
+ panel.add(button1 = getButton(), BorderLayout.WEST);
+ panel.add(button2 = getButton(), BorderLayout.EAST);
+ frame.getContentPane().add(panel);
+ frame.setVisible(true);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/8062561/bug8062561.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Robot;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.concurrent.TimeUnit;
+import javax.swing.JFileChooser;
+import javax.swing.SwingUtilities;
+import javax.swing.filechooser.FileSystemView;
+import sun.awt.OSInfo;
+
+/**
+ * @test
+ * @bug 8062561
+ * @summary File system view returns null default directory
+ * @run main/othervm bug8062561 GENERATE_POLICY
+ * @run main/othervm/policy=security.policy bug8062561 CHECK_DEFAULT_DIR run
+ */
+public class bug8062561 {
+
+ private static final String POLICY_FILE = "security2.policy";
+ private static volatile boolean fileChooserIsShown = false;
+
+ public static void main(String[] args) throws Exception {
+
+ String test = args[0];
+
+ switch (test) {
+ case "GENERATE_POLICY":
+ generatePolicyFile();
+ break;
+ case "CHECK_DEFAULT_DIR":
+ checkDefaultDirectory();
+ break;
+ case "CHECK_FILE_CHOOSER":
+ checkFileChooser();
+ break;
+ default:
+ throw new RuntimeException("Wrong argument!");
+ }
+ }
+
+ private static void checkDefaultDirectory() {
+ if (System.getSecurityManager() == null) {
+ throw new RuntimeException("Security manager is not set!");
+ }
+
+ File defaultDirectory = FileSystemView.getFileSystemView().
+ getDefaultDirectory();
+ if (defaultDirectory != null) {
+ throw new RuntimeException("File system default directory is null!");
+ }
+ }
+ private static volatile JFileChooser fileChooser;
+
+ private static void checkFileChooser() throws Exception {
+ if (System.getSecurityManager() == null) {
+ throw new RuntimeException("Security manager is not set!");
+ }
+
+ Robot robot = new Robot();
+ robot.setAutoDelay(50);
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ public void run() {
+ fileChooser = new JFileChooser();
+ fileChooser.showOpenDialog(null);
+ fileChooserIsShown = true;
+ System.out.println("Start file chooser: " + fileChooserIsShown);
+ }
+ });
+
+ long time = System.currentTimeMillis();
+ while (fileChooser == null) {
+ if (System.currentTimeMillis() - time >= 10000) {
+ throw new RuntimeException("FileChoser is not shown!");
+ }
+ Thread.sleep(500);
+ }
+
+ Thread.sleep(500);
+ robot.keyPress(KeyEvent.VK_ESCAPE);
+ robot.keyRelease(KeyEvent.VK_ESCAPE);
+ System.exit(0);
+ }
+
+ private static void generatePolicyFile() throws Exception {
+ if (System.getSecurityManager() != null) {
+ throw new RuntimeException("Security manager should be null!");
+ }
+
+ if (!OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS)) {
+ return;
+ }
+
+ File defaultDirectory = FileSystemView.getFileSystemView().
+ getDefaultDirectory();
+
+ if (defaultDirectory == null) {
+ throw new RuntimeException("Default directory is null!");
+ }
+
+ File policyFile = new File(POLICY_FILE);
+ if (!policyFile.exists()) {
+ policyFile.createNewFile();
+ }
+
+ try (PrintWriter writer = new PrintWriter(policyFile, "UTF-8")) {
+ writer.println("grant {");
+ String documents = defaultDirectory.getCanonicalPath();
+ documents = documents.replace('\\', '/');
+ // Documents permission
+ writer.print(" permission java.io.FilePermission");
+ writer.print(" \"" + documents + "\",");
+ writer.println(" \"read\";");
+ // Desktop permission
+ writer.print(" permission java.io.FilePermission");
+ writer.print(" \"" + documents.replace("Documents", "Desktop") + "\",");
+ writer.println(" \"read\";");
+ // robot permission // "java.awt.AWTPermission" "createRobot"
+ writer.print(" permission java.awt.AWTPermission");
+ writer.println(" \"createRobot\";");
+ writer.println("};");
+ }
+
+ performTest();
+ }
+
+ private static void performTest() throws Exception {
+ String javaPath = System.getProperty("java.home", "");
+ String command = javaPath + File.separator + "bin" + File.separator + "java"
+ + " -Djava.security.manager -Djava.security.policy=" + POLICY_FILE
+ + " bug8062561 CHECK_FILE_CHOOSER";
+ System.out.println(command);
+ boolean processExit = false;
+
+ Process process = Runtime.getRuntime().exec(command);
+
+ try {
+ processExit = process.waitFor(20, TimeUnit.SECONDS);
+ } catch (IllegalThreadStateException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println("[RESULT] : "
+ + "The sub process has cleanly exited : PASS");
+
+ InputStream errorStream = process.getErrorStream();
+ System.out.println("========= Child process stderr ========");
+ boolean exception = dumpStream(errorStream);
+ if (exception) {
+ throw new RuntimeException("[RESULT] :"
+ + " Exception in child process : FAIL");
+ }
+ System.out.println("=======================================");
+
+ InputStream processInputStream = process.getInputStream();
+ System.out.println("========= Child process output ========");
+ dumpStream(processInputStream);
+ System.out.println("=======================================");
+
+ if (!processExit) {
+ process.destroy();
+ throw new RuntimeException("[RESULT] : "
+ + "The sub process has not exited : FAIL");
+ }
+ }
+
+ public static boolean dumpStream(InputStream in) throws IOException {
+ String tempString;
+ int count = in.available();
+ boolean exception = false;
+ while (count > 0) {
+ byte[] b = new byte[count];
+ in.read(b);
+ tempString = new String(b);
+ if (!exception) {
+ exception = tempString.indexOf("Exception") != -1;
+ }
+ System.out.println(tempString);
+ count = in.available();
+ }
+
+ return exception;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/8062561/security.policy Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,5 @@
+grant {
+
+ permission java.util.PropertyPermission "user.home", "read";
+ permission java.util.PropertyPermission "user.dir", "read";
+};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JFileChooser/8062561/security2.policy Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,1 @@
+// Autogenerated file
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/JToolTip/6219960/bug6219960.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.GridLayout;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.AWTException;
+import java.awt.IllegalComponentStateException;
+import java.awt.event.InputEvent;
+import javax.swing.JButton;
+import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.SwingUtilities;
+import javax.swing.ToolTipManager;
+import javax.swing.table.DefaultTableModel;
+
+/**
+ * @test
+ * @bug 6219960
+ * @summary null reference in ToolTipManager
+ * @run main bug6219960
+ */
+public class bug6219960 {
+
+ private static final String QUESTION = "Question";
+
+ static volatile JFrame frame;
+ static JTable table;
+
+ public static void main(String[] args) throws Exception {
+ Robot robot = new Robot();
+ SwingUtilities.invokeAndWait(bug6219960::createAndShowGUI);
+ robot.waitForIdle();
+ showModal("The tooltip should be showing. Press ok with mouse. And don't move it.");
+ robot.waitForIdle();
+ showModal("Now press ok and move the mouse inside the table (don't leave it).");
+ robot.waitForIdle();
+ }
+
+ private static void createAndShowGUI() {
+ ToolTipManager.sharedInstance().setDismissDelay(10 * 60 * 1000);
+ frame = new JFrame();
+ frame.setLocation(20, 20);
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ JDesktopPane desk = new JDesktopPane();
+ JInternalFrame iframe = new JInternalFrame();
+ iframe.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
+ desk.add(iframe);
+ JButton save = new JButton();
+ save.setToolTipText("Wait for dialog to show.");
+ save.setText("Wait for the tooltip to show.");
+ JPanel panel = new JPanel(new GridLayout(1, 2));
+ panel.add(save);
+ table = createTable();
+ panel.add(new JScrollPane(table));
+ iframe.setContentPane(panel);
+ frame.getContentPane().add(desk);
+ frame.setSize(800, 600);
+ iframe.setSize(640, 480);
+ iframe.validate();
+ iframe.setVisible(true);
+ frame.validate();
+ frame.setVisible(true);
+ try {
+ iframe.setSelected(true);
+ } catch (Exception e) {
+ throw new AssertionError(e);
+ }
+
+ try {
+ Robot robot = new Robot();
+ Rectangle bounds = frame.getBounds();
+ int centerX = (int) (bounds.getX() + bounds.getWidth() / 6);
+ int centerY = (int) (bounds.getY() + bounds.getHeight() / 6);
+ robot.mouseMove(centerX, centerY);
+ } catch (AWTException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static void showModal(final String msg) throws Exception {
+
+ new Thread(() -> {
+
+ int timeout = 3000;
+ long endTime = System.currentTimeMillis() + timeout;
+
+ while (System.currentTimeMillis() <= endTime) {
+ if (pressOK(frame)) {
+ return;
+ }
+ }
+ throw new RuntimeException("Internal frame has not been found!");
+ }).start();
+
+ Thread.sleep(900);
+
+ SwingUtilities.invokeAndWait(() -> {
+ JOptionPane.showInternalMessageDialog(table, msg,
+ QUESTION,
+ JOptionPane.PLAIN_MESSAGE);
+ });
+ }
+
+ private static JTable createTable() {
+ DefaultTableModel model = new DefaultTableModel();
+ JTable table = new JTable(model);
+ table.setFillsViewportHeight(true);
+ return table;
+ }
+
+ private static boolean pressOK(Component comp) {
+
+ JInternalFrame internalFrame
+ = findModalInternalFrame(comp, QUESTION);
+
+ if (internalFrame == null) {
+ return false;
+ }
+
+ JButton button = (JButton) findButton(internalFrame);
+
+ if (button == null) {
+ return false;
+ }
+
+ try {
+ Robot robot = new Robot();
+ Point location = button.getLocationOnScreen();
+ Rectangle bounds = button.getBounds();
+ int centerX = (int) (location.getX() + bounds.getWidth() / 2);
+ int centerY = (int) (location.getY() + bounds.getHeight() / 2);
+ robot.mouseMove(centerX, centerY);
+ robot.mousePress(InputEvent.BUTTON1_MASK);
+ robot.mouseRelease(InputEvent.BUTTON1_MASK);
+ } catch (IllegalComponentStateException ignore) {
+ return false;
+ } catch (AWTException e) {
+ throw new RuntimeException(e);
+ }
+ return true;
+ }
+
+ private static JInternalFrame findModalInternalFrame(Component comp, String title) {
+
+ if (comp instanceof JInternalFrame) {
+ JInternalFrame internalFrame = (JInternalFrame) comp;
+ if (internalFrame.getTitle().equals(title)) {
+ return (JInternalFrame) comp;
+ }
+ }
+
+ if (comp instanceof Container) {
+ Container cont = (Container) comp;
+ for (int i = 0; i < cont.getComponentCount(); i++) {
+ JInternalFrame result = findModalInternalFrame(cont.getComponent(i), title);
+ if (result != null) {
+ return result;
+ }
+ }
+ }
+ return null;
+ }
+
+ private static JButton findButton(Component comp) {
+
+ if (comp instanceof JButton) {
+ return (JButton) comp;
+ }
+
+ if (comp instanceof Container) {
+ Container cont = (Container) comp;
+ for (int i = 0; i < cont.getComponentCount(); i++) {
+ JButton result = findButton(cont.getComponent(i));
+ if (result != null) {
+ return result;
+ }
+ }
+ }
+ return null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/swing/UIDefaults/7180976/Pending.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+
+/**
+ * @test
+ * @bug 7180976
+ * @author Sergey Bylokhov
+ */
+public final class Pending implements Runnable {
+
+ private static volatile boolean passed;
+
+ public static void main(final String[] args) throws Exception {
+ SwingUtilities.invokeLater(new Pending());
+ Thread.sleep(10000);
+ if (!passed) {
+ throw new RuntimeException("Test failed");
+ }
+ }
+
+ @Override
+ public void run() {
+ UIManager.put("foobar", "Pending");
+ UIManager.get("foobar");
+ passed = true;
+ }
+}
\ No newline at end of file
--- a/jdk/test/jdk/nio/zipfs/ZipFSTester.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/jdk/nio/zipfs/ZipFSTester.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -45,6 +45,7 @@
import java.nio.file.attribute.BasicFileAttributes;
import java.nio.file.spi.FileSystemProvider;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
@@ -67,7 +68,7 @@
*
* @test
* @bug 6990846 7009092 7009085 7015391 7014948 7005986 7017840 7007596
- * 7157656 8002390 7012868 7012856 8015728 8038500 8040059
+ * 7157656 8002390 7012868 7012856 8015728 8038500 8040059 8069211
* @summary Test Zip filesystem provider
* @run main ZipFSTester
* @run main/othervm/java.security.policy=test.policy ZipFSTester
@@ -89,6 +90,7 @@
test2(fs); // more tests
}
testTime(jarFile);
+ test8069211();
}
static void test0(FileSystem fs)
@@ -416,6 +418,29 @@
Files.delete(fsPath);
}
+ static void test8069211() throws Exception {
+ // create a new filesystem, copy this file into it
+ Map<String, Object> env = new HashMap<String, Object>();
+ env.put("create", "true");
+ Path fsPath = getTempPath();
+ try (FileSystem fs = newZipFileSystem(fsPath, env);) {
+ OutputStream out = Files.newOutputStream(fs.getPath("/foo"));
+ out.write("hello".getBytes());
+ out.close();
+ out.close();
+ }
+ try (FileSystem fs = newZipFileSystem(fsPath, new HashMap<String, Object>())) {
+ if (!Arrays.equals(Files.readAllBytes(fs.getPath("/foo")),
+ "hello".getBytes())) {
+ throw new RuntimeException("entry close() failed");
+ }
+ } catch (Exception x) {
+ throw new RuntimeException("entry close() failed", x);
+ } finally {
+ Files.delete(fsPath);
+ }
+ }
+
private static FileSystem newZipFileSystem(Path path, Map<String, ?> env)
throws Exception
{
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/FilterClassLoader.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.testlibrary;
+
+import java.util.function.Predicate;
+/**
+ * A classloader, which using target classloader in case provided condition
+ * for class name is met, and using parent otherwise
+ */
+public class FilterClassLoader extends ClassLoader {
+
+ private final ClassLoader target;
+ private final Predicate<String> condition;
+
+ public FilterClassLoader(ClassLoader target, ClassLoader parent,
+ Predicate<String> condition) {
+ super(parent);
+ this.condition = condition;
+ this.target = target;
+ }
+
+ @Override
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ if (condition.test(name)) {
+ return target.loadClass(name);
+ }
+ return super.loadClass(name);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/ParentLastURLClassLoader.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package jdk.testlibrary;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+
+/**
+ * An url classloader, which trying to load class from provided URL[] first,
+ * and using parent classloader in case it failed
+ */
+public class ParentLastURLClassLoader extends URLClassLoader {
+
+ public ParentLastURLClassLoader(URL urls[], ClassLoader parent) {
+ super(urls, parent);
+ }
+
+ @Override
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ try {
+ Class c = findClass(name);
+ if (c != null) {
+ return c;
+ }
+ } catch (ClassNotFoundException e) {
+ // ignore
+ }
+ return super.loadClass(name);
+ }
+}
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/Platform.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/Platform.java Tue Jan 27 13:58:55 2015 -0500
@@ -28,6 +28,15 @@
private static final String dataModel = System.getProperty("sun.arch.data.model");
private static final String vmVersion = System.getProperty("java.vm.version");
private static final String osArch = System.getProperty("os.arch");
+ private static final String vmName = System.getProperty("java.vm.name");
+
+ public static boolean isClient() {
+ return vmName.endsWith(" Client VM");
+ }
+
+ public static boolean isServer() {
+ return vmName.endsWith(" Server VM");
+ }
public static boolean is32bit() {
return dataModel.equals("32");
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/Utils.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/lib/testlibrary/jdk/testlibrary/Utils.java Tue Jan 27 13:58:55 2015 -0500
@@ -39,6 +39,7 @@
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.concurrent.TimeUnit;
+import java.util.function.BooleanSupplier;
/**
* Common library for various test helper functions.
@@ -271,25 +272,6 @@
}
/**
- * Returns file content as a list of strings
- *
- * @param file File to operate on
- * @return List of strings
- * @throws IOException
- */
- public static List<String> fileAsList(File file) throws IOException {
- assertTrue(file.exists() && file.isFile(),
- file.getAbsolutePath() + " does not exist or not a file");
- List<String> output = new ArrayList<>();
- try (BufferedReader reader = new BufferedReader(new FileReader(file.getAbsolutePath()))) {
- while (reader.ready()) {
- output.add(reader.readLine().replace(NEW_LINE, ""));
- }
- }
- return output;
- }
-
- /**
* Adjusts the provided timeout value for the TIMEOUT_FACTOR
* @param tOut the timeout value to be adjusted
* @return The timeout value adjusted for the value of "test.timeout.factor"
@@ -298,4 +280,50 @@
public static long adjustTimeout(long tOut) {
return Math.round(tOut * Utils.TIMEOUT_FACTOR);
}
+
+ /**
+ * Wait for condition to be true
+ *
+ * @param condition, a condition to wait for
+ */
+ public static final void waitForCondition(BooleanSupplier condition) {
+ waitForCondition(condition, -1L, 100L);
+ }
+
+ /**
+ * Wait until timeout for condition to be true
+ *
+ * @param condition, a condition to wait for
+ * @param timeout a time in milliseconds to wait for condition to be true
+ * specifying -1 will wait forever
+ * @return condition value, to determine if wait was successfull
+ */
+ public static final boolean waitForCondition(BooleanSupplier condition,
+ long timeout) {
+ return waitForCondition(condition, timeout, 100L);
+ }
+
+ /**
+ * Wait until timeout for condition to be true for specified time
+ *
+ * @param condition, a condition to wait for
+ * @param timeout a time in milliseconds to wait for condition to be true,
+ * specifying -1 will wait forever
+ * @param sleepTime a time to sleep value in milliseconds
+ * @return condition value, to determine if wait was successfull
+ */
+ public static final boolean waitForCondition(BooleanSupplier condition,
+ long timeout, long sleepTime) {
+ long startTime = System.currentTimeMillis();
+ while (!(condition.getAsBoolean() || (timeout != -1L
+ && ((System.currentTimeMillis() - startTime) > timeout)))) {
+ try {
+ Thread.sleep(sleepTime);
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new Error(e);
+ }
+ }
+ return condition.getAsBoolean();
+ }
}
--- a/jdk/test/sun/awt/datatransfer/DataFlavorComparatorTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/awt/datatransfer/DataFlavorComparatorTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -29,13 +29,14 @@
*/
import sun.awt.datatransfer.DataTransferer;
-
+import java.util.Comparator;
+import sun.datatransfer.DataFlavorUtil;
import java.awt.datatransfer.DataFlavor;
public class DataFlavorComparatorTest {
public static void main(String[] args) {
- DataTransferer.DataFlavorComparator comparator = new DataTransferer.DataFlavorComparator();
+ Comparator<DataFlavor> comparator = DataFlavorUtil.getDataFlavorComparator();
DataFlavor flavor1 = DataFlavor.imageFlavor;
DataFlavor flavor2 = DataFlavor.selectionHtmlFlavor;
if (comparator.compare(flavor1, flavor2) == 0) {
--- a/jdk/test/sun/misc/JarIndex/JarIndexMergeForClassLoaderTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/misc/JarIndex/JarIndexMergeForClassLoaderTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -48,14 +48,7 @@
static final File tmpFolder = new File(testClassesDir);
static {
- String javaHome = System.getProperty("java.home");
- if (javaHome.endsWith("jre")) {
- int index = javaHome.lastIndexOf(slash);
- if (index != -1)
- javaHome = javaHome.substring(0, index);
- }
-
- jar = javaHome + slash + "bin" + slash + "jar";
+ jar = System.getProperty("java.home") + slash + "bin" + slash + "jar";
}
public static void main(String[] args) throws Exception {
--- a/jdk/test/sun/misc/JarIndex/metaInfFilenames/Basic.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/misc/JarIndex/metaInfFilenames/Basic.java Tue Jan 27 13:58:55 2015 -0500
@@ -78,7 +78,6 @@
* URLClassLoader. Each request to the HTTP server is recorded to ensure
* only the correct amount of requests are being made.
*
- * Note: Needs jdk/lib/tools.jar in the classpath to compile and run.
*/
public class Basic {
@@ -160,14 +159,7 @@
static String jar;
static {
- String javaHome = System.getProperty("java.home");
- if (javaHome.endsWith("jre")) {
- int index = javaHome.lastIndexOf(slash);
- if (index != -1)
- javaHome = javaHome.substring(0, index);
- }
-
- jar = javaHome + slash+ "bin" + slash + "jar";
+ jar = System.getProperty("java.home") + slash+ "bin" + slash + "jar";
}
/* create the index */
--- a/jdk/test/sun/reflect/CallerSensitive/CallerSensitiveFinder.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/reflect/CallerSensitive/CallerSensitiveFinder.java Tue Jan 27 13:58:55 2015 -0500
@@ -26,20 +26,22 @@
import static com.sun.tools.classfile.ConstantPool.*;
import java.io.File;
import java.io.IOException;
-import java.nio.file.FileVisitResult;
+import java.io.UncheckedIOException;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
+import java.util.stream.Stream;
/*
* @test
@@ -52,8 +54,10 @@
public class CallerSensitiveFinder {
private static int numThreads = 3;
private static boolean verbose = false;
+ private final ExecutorService pool;
+
public static void main(String[] args) throws Exception {
- List<Path> classes = new ArrayList<>();
+ Stream<Path> classes = null;
String testclasses = System.getProperty("test.classes", ".");
int i = 0;
while (i < args.length) {
@@ -65,25 +69,30 @@
if (!p.toFile().exists()) {
throw new IllegalArgumentException(arg + " does not exist");
}
- classes.add(p);
+ classes = Stream.of(p);
}
}
- if (classes.isEmpty()) {
- classes.addAll(PlatformClassPath.getJREClasses());
+
+ if (classes == null) {
+ classes = getPlatformClasses();
}
- CallerSensitiveFinder csfinder = new CallerSensitiveFinder();
+ CallerSensitiveFinder csfinder = new CallerSensitiveFinder();
List<String> errors = csfinder.run(classes);
+
if (!errors.isEmpty()) {
throw new RuntimeException(errors.size() +
" caller-sensitive methods are missing @CallerSensitive annotation");
}
}
- private final List<String> csMethodsMissingAnnotation = new ArrayList<>();
+ private final List<String> csMethodsMissingAnnotation =
+ Collections.synchronizedList(new ArrayList<>());
private final ReferenceFinder finder;
public CallerSensitiveFinder() {
this.finder = new ReferenceFinder(getFilter(), getVisitor());
+ pool = Executors.newFixedThreadPool(numThreads);
+
}
private ReferenceFinder.Filter getFilter() {
@@ -123,11 +132,17 @@
};
}
- public List<String> run(List<Path> classes) throws IOException, InterruptedException,
+ public List<String> run(Stream<Path> classes)throws IOException, InterruptedException,
ExecutionException, ConstantPoolException
{
- ExecutorService pool = Executors.newFixedThreadPool(numThreads);
- for (Path path : classes) {
+ classes.forEach(this::processPath);
+ waitForCompletion();
+ pool.shutdown();
+ return csMethodsMissingAnnotation;
+ }
+
+ void processPath(Path path) {
+ try {
ClassFileReader reader = ClassFileReader.newInstance(path);
for (ClassFile cf : reader.getClassFiles()) {
String classFileName = cf.getName();
@@ -137,10 +152,11 @@
// - visit and find method references matching the given method name
pool.submit(getTask(cf));
}
+ } catch (IOException x) {
+ throw new UncheckedIOException(x);
+ } catch (ConstantPoolException x) {
+ throw new RuntimeException(x);
}
- waitForCompletion();
- pool.shutdown();
- return csMethodsMissingAnnotation;
}
private static final String CALLER_SENSITIVE_ANNOTATION = "Lsun/reflect/CallerSensitive;";
@@ -178,61 +194,34 @@
for (FutureTask<Void> t : tasks) {
t.get();
}
+ if (tasks.isEmpty()) {
+ throw new RuntimeException("No classes found, or specified.");
+ }
System.out.println("Parsed " + tasks.size() + " classfiles");
}
- static class PlatformClassPath {
- static List<Path> getJREClasses() throws IOException {
- List<Path> result = new ArrayList<Path>();
- Path home = Paths.get(System.getProperty("java.home"));
-
- if (home.endsWith("jre")) {
- // jar files in <javahome>/jre/lib
- // skip <javahome>/lib
- result.addAll(addJarFiles(home.resolve("lib")));
- } else if (home.resolve("lib").toFile().exists()) {
- // either a JRE or a jdk build image
- File classes = home.resolve("classes").toFile();
- if (classes.exists() && classes.isDirectory()) {
- // jdk build outputdir
- result.add(classes.toPath());
- }
- // add other JAR files
- result.addAll(addJarFiles(home.resolve("lib")));
- } else {
- throw new RuntimeException("\"" + home + "\" not a JDK home");
- }
- return result;
- }
+ static Stream<Path> getPlatformClasses() throws IOException {
+ Path home = Paths.get(System.getProperty("java.home"));
- static List<Path> addJarFiles(final Path root) throws IOException {
- final List<Path> result = new ArrayList<Path>();
- final Path ext = root.resolve("ext");
- Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
- @Override
- public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
- throws IOException {
- if (dir.equals(root) || dir.equals(ext)) {
- return FileVisitResult.CONTINUE;
- } else {
- // skip other cobundled JAR files
- return FileVisitResult.SKIP_SUBTREE;
- }
- }
+ // Either an exploded build or an image.
+ File classes = home.resolve("modules").toFile();
+ if (classes.isDirectory()) {
+ return Stream.of(classes.toPath());
+ } else {
+ return jrtPaths();
+ }
+ }
- @Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
- throws IOException {
- File f = file.toFile();
- String fn = f.getName();
- // parse alt-rt.jar as well
- if (fn.endsWith(".jar") && !fn.equals("jfxrt.jar")) {
- result.add(file);
- }
- return FileVisitResult.CONTINUE;
- }
- });
- return result;
+ static Stream<Path> jrtPaths() {
+ FileSystem jrt = FileSystems.getFileSystem(URI.create("jrt:/"));
+ Path root = jrt.getPath("/");
+
+ try {
+ return Files.walk(root)
+ .filter(p -> p.getNameCount() > 1)
+ .filter(p -> p.toString().endsWith(".class"));
+ } catch (IOException x) {
+ throw new UncheckedIOException(x);
}
}
}
--- a/jdk/test/sun/reflect/CallerSensitive/MissingCallerSensitive.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/reflect/CallerSensitive/MissingCallerSensitive.java Tue Jan 27 13:58:55 2015 -0500
@@ -34,11 +34,13 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
+import java.util.stream.Stream;
+
public class MissingCallerSensitive {
public static void main(String[] args) throws Exception {
String testclasses = System.getProperty("test.classes", ".");
- List<Path> classes = new ArrayList<>();
- classes.add(Paths.get(testclasses, "MissingCallerSensitive.class"));
+
+ Stream<Path> classes = Stream.of(Paths.get(testclasses, "MissingCallerSensitive.class"));
CallerSensitiveFinder csfinder = new CallerSensitiveFinder();
List<String> errors = csfinder.run(classes);
--- a/jdk/test/sun/security/ec/TestEC.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/ec/TestEC.java Tue Jan 27 13:58:55 2015 -0500
@@ -59,6 +59,10 @@
public class TestEC {
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
// MD5 is used in this test case, don't disable MD5 algorithm.
Security.setProperty(
"jdk.certpath.disabledAlgorithms", "MD2, RSA keySize < 1024");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/Mac/MacKAT.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.UnsupportedEncodingException;
+import java.security.Provider;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * @test
+ * @bug 4846410 6313661 4963723
+ * @summary Basic known-answer-test for Hmac algorithms
+ * @author Andreas Sterbenz
+ * @library ..
+ * @run main MacKAT
+ */
+public class MacKAT extends PKCS11Test {
+
+ private final static byte[] ALONG, BLONG, BKEY, BKEY_20, DDDATA_50,
+ AAKEY_20, CDDATA_50, AAKEY_131;
+
+ static {
+ ALONG = new byte[1024 * 128];
+ Arrays.fill(ALONG, (byte)'a');
+ BLONG = new byte[1024 * 128];
+ Random random = new Random(12345678);
+ random.nextBytes(BLONG);
+ BKEY = new byte[128];
+ random.nextBytes(BKEY);
+ BKEY_20 = new byte[20];
+ Arrays.fill(BKEY_20, (byte) 0x0b);
+ DDDATA_50 = new byte[50];
+ Arrays.fill(DDDATA_50, (byte) 0xdd);
+ AAKEY_20 = new byte[20];
+ Arrays.fill(AAKEY_20, (byte) 0xaa);
+ CDDATA_50 = new byte[50];
+ Arrays.fill(CDDATA_50, (byte) 0xcd);
+ AAKEY_131 = new byte[131];
+ Arrays.fill(AAKEY_131, (byte) 0xaa);
+ }
+
+ private final static Test[] tests = {
+ newMacTest("SslMacMD5",
+ ALONG,
+ "f4:ad:01:71:51:f6:89:56:72:a3:32:bf:d9:2a:f2:a5",
+ "1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
+ newMacTest("SslMacMD5",
+ BLONG,
+ "34:1c:ad:a0:95:57:32:f8:8e:80:8f:ee:b2:d8:23:e5",
+ "76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71"),
+ newMacTest("SslMacSHA1",
+ ALONG,
+ "11:c1:71:2e:61:be:4b:cf:bc:6d:e2:4c:58:ae:27:30:0b:24:a4:87",
+ "23:ae:dd:61:87:6c:7a:45:47:2f:2c:8f:ea:64:99:3e:27:5f:97:a5"),
+ newMacTest("SslMacSHA1",
+ BLONG,
+ "84:af:57:0a:af:ef:16:93:90:50:da:88:f8:ad:1a:c5:66:6c:94:d0",
+ "9b:bb:e2:aa:9b:28:1c:95:0e:ea:30:21:98:a5:7e:31:9e:bf:5f:51"),
+ newMacTest("HmacMD5",
+ ALONG,
+ "76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71",
+ "1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
+ newMacTest("HmacMD5",
+ BLONG,
+ "6c:22:79:bb:34:9e:da:f4:f5:cf:df:0c:62:3d:59:e0",
+ "76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71"),
+ newMacTest("HmacMD5",
+ BLONG,
+ "e6:ad:00:c9:49:6b:98:fe:53:a2:b9:2d:7d:41:a2:03",
+ BKEY),
+ newMacTest("HmacSHA1",
+ ALONG,
+ "9e:b3:6e:35:fa:fb:17:2e:2b:f3:b0:4a:9d:38:83:c4:5f:6d:d9:00",
+ "1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
+ newMacTest("HmacSHA1",
+ BLONG,
+ "80:2d:5b:ea:08:df:a4:1f:e5:3e:1c:fa:fc:ad:dd:31:da:15:60:2c",
+ "76:00:4a:72:98:9b:65:ec:2e:f1:43:c4:65:4a:13:71"),
+ newMacTest("HmacSHA1",
+ BLONG,
+ "a2:fa:2a:85:18:0e:94:b2:a5:e2:17:8b:2a:29:7a:95:cd:e8:aa:82",
+ BKEY),
+ newMacTest("HmacSHA256",
+ ALONG,
+ "3f:6d:08:df:0c:90:b0:e9:ed:13:4a:2e:c3:48:1d:3d:3e:61:2e:f1:"
+ + "30:c2:63:c4:58:57:03:c2:cb:87:15:07",
+ "1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
+ newMacTest("HmacSHA256",
+ BLONG,
+ "e2:4e:a3:b9:0b:b8:99:e4:71:cf:ca:9f:f8:4e:f0:34:8b:19:9f:33:"
+ + "4b:1a:b7:13:f7:c8:57:92:e3:03:74:78",
+ BKEY),
+ newMacTest("HmacSHA384",
+ ALONG,
+ "d0:f0:d4:54:1c:0a:6d:81:ed:15:20:d7:0c:96:06:61:a0:ff:c9:ff:"
+ + "91:e9:a0:cd:e2:45:64:9d:93:4c:a9:fa:89:ae:c0:90:e6:"
+ + "0b:a1:a0:56:80:57:3b:ed:4b:b0:71",
+ "1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
+ newMacTest("HmacSHA384",
+ BLONG,
+ "75:c4:ca:c7:f7:58:9d:d3:23:b1:1b:5c:93:2d:ec:7a:03:dc:8c:eb:"
+ + "8d:fe:79:46:4f:30:e7:99:62:de:44:e2:38:95:0e:79:91:"
+ + "78:2f:a4:05:0a:f0:17:10:38:a1:8e",
+ BKEY),
+ newMacTest("HmacSHA512",
+ ALONG,
+ "41:ea:4c:e5:31:3f:7c:18:0e:5e:95:a9:25:0a:10:58:e6:40:53:88:"
+ + "82:4f:5a:da:6f:29:de:04:7b:8e:d7:ed:7c:4d:b8:2a:48:"
+ + "2d:17:2a:2d:59:bb:81:9c:bf:33:40:04:77:44:fb:45:25:"
+ + "1f:fd:b9:29:f4:a6:69:a3:43:6f",
+ "1b:34:61:29:05:0d:73:db:25:d0:dd:64:06:29:f6:8a"),
+ newMacTest("HmacSHA512",
+ BLONG,
+ "fb:cf:4b:c6:d5:49:5a:5b:0b:d9:2a:32:f5:fa:68:d2:68:a4:0f:ae:"
+ + "53:fc:49:12:e6:1d:53:cf:b2:cb:c5:c5:f2:2d:86:bd:14:"
+ + "61:30:c3:a6:6f:44:1f:77:9b:aa:a1:22:48:a9:dd:d0:45:"
+ + "86:d1:a1:82:53:13:c4:03:06:a3",
+ BKEY),
+
+ // Test vectors From RFC 4231
+ newMacTest("HmacSHA224",
+ bytes("Hi There"),
+ "89:6f:b1:12:8a:bb:df:19:68:32:10:7c:d4:9d:f3:3f:47:b4:b1:16:"
+ + "99:12:ba:4f:53:68:4b:22",
+ BKEY_20),
+ newMacTest("HmacSHA224",
+ bytes("what do ya want for nothing?"),
+ "a3:0e:01:09:8b:c6:db:bf:45:69:0f:3a:7e:9e:6d:0f:8b:be:a2:a3:"
+ + "9e:61:48:00:8f:d0:5e:44",
+ bytes("Jefe")),
+ newMacTest("HmacSHA224",
+ DDDATA_50,
+ "7f:b3:cb:35:88:c6:c1:f6:ff:a9:69:4d:7d:6a:d2:64:93:65:b0:c1:"
+ + "f6:5d:69:d1:ec:83:33:ea",
+ AAKEY_20),
+ newMacTest("HmacSHA224",
+ CDDATA_50,
+ "6c:11:50:68:74:01:3c:ac:6a:2a:bc:1b:b3:82:62:7c:ec:6a:90:d8:"
+ + "6e:fc:01:2d:e7:af:ec:5a",
+ "01:02:03:04:05:06:07:08:09:0a:0b:0c:0d:0e:0f:10:11:12:13:14:"
+ + "15:16:17:18:19"),
+ newMacTest("HmacSHA224",
+ bytes("Test Using Larger Than Block-Size Key - Hash Key First"),
+ "95:e9:a0:db:96:20:95:ad:ae:be:9b:2d:6f:0d:bc:e2:d4:99:f1:12:"
+ + "f2:d2:b7:27:3f:a6:87:0e",
+ AAKEY_131),
+ newMacTest("HmacSHA224",
+ bytes("This is a test using a larger than block-size key and "
+ + "a larger than block-size data. The key needs to be "
+ + "hashed before being used by the HMAC algorithm."),
+ "3a:85:41:66:ac:5d:9f:02:3f:54:d5:17:d0:b3:9d:bd:94:67:70:db:"
+ + "9c:2b:95:c9:f6:f5:65:d1",
+ AAKEY_131),
+ };
+
+ public static void main(String[] args) throws Exception {
+ main(new MacKAT());
+ }
+
+ @Override
+ public void main(Provider p) throws Exception {
+ long start = System.currentTimeMillis();
+
+ List<String> algorithms = getSupportedAlgorithms("Mac", "", p);
+ for (Test test : tests) {
+ if(!algorithms.contains(test.getAlg())) {
+ continue;
+ }
+ test.run(p);
+ }
+
+ System.out.println("All tests passed");
+ long stop = System.currentTimeMillis();
+ System.out.println("Done (" + (stop - start) + " ms).");
+ }
+
+ private static byte[] bytes(String s) {
+ try {
+ return s.getBytes("UTF8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private static Test newMacTest(String alg, byte[] input, String macvalue,
+ String key) {
+ return new MacTest(alg, input, parse(macvalue), parse(key));
+ }
+
+ private static Test newMacTest(String alg, byte[] input, String macvalue,
+ byte[] key) {
+ return new MacTest(alg, input, parse(macvalue), key);
+ }
+
+ interface Test {
+ void run(Provider p) throws Exception;
+ String getAlg();
+ }
+
+ static class MacTest implements Test {
+ private final String alg;
+ private final byte[] input;
+ private final byte[] macvalue;
+ private final byte[] key;
+
+ MacTest(String alg, byte[] input, byte[] macvalue, byte[] key) {
+ this.alg = alg;
+ this.input = input;
+ this.macvalue = macvalue;
+ this.key = key;
+ }
+
+ @Override
+ public String getAlg() {
+ return alg;
+ }
+
+ @Override
+ public void run(Provider p) throws Exception {
+ Mac mac = Mac.getInstance(alg, p);
+ SecretKey keySpec = new SecretKeySpec(key, alg);
+ mac.init(keySpec);
+ mac.update(input);
+ byte[] macv = mac.doFinal();
+ if (Arrays.equals(macvalue, macv) == false) {
+ System.out.println("Mac test for " + alg + " failed:");
+ if (input.length < 256) {
+ System.out.println("input: "
+ + PKCS11Test.toString(input));
+ }
+ System.out.println("key: " + PKCS11Test.toString(key));
+ System.out.println("macvalue: "
+ + PKCS11Test.toString(macvalue));
+ System.out.println("calculated: " + PKCS11Test.toString(macv));
+ throw new Exception("Mac test for " + alg + " failed");
+ }
+ System.out.println("passed: " + alg);
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/pkcs11/Mac/MacSameTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Provider;
+import java.security.SecureRandom;
+import java.util.List;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * @test
+ * @bug 8048603
+ * @summary Check if doFinal and update operation result in same Mac
+ * @author Yu-Ching Valerie Peng, Bill Situ, Alexander Fomin
+ * @library ..
+ * @run main MacSameTest
+ */
+public class MacSameTest extends PKCS11Test {
+
+ private static final int MESSAGE_SIZE = 25;
+ private static final int OFFSET = 5;
+ private static final int KEY_SIZE = 70;
+
+ /**
+ * Initialize a message, instantiate a Mac object,
+ * initialize the object with a SecretKey,
+ * feed the message into the Mac object
+ * all at once and get the output MAC as result1.
+ * Reset the Mac object, chop the message into three pieces,
+ * feed into the Mac object sequentially, and get the output MAC as result2.
+ * Finally, compare result1 and result2 and see if they are the same.
+ *
+ * @param args the command line arguments
+ */
+ public static void main(String[] args) throws Exception {
+ main(new MacSameTest());
+ }
+
+ @Override
+ public void main(Provider p) {
+ List<String> algorithms = getSupportedAlgorithms("Mac", "Hmac", p);
+ boolean success = true;
+ for (String alg : algorithms) {
+ try {
+ doTest(alg, p);
+ } catch (Exception e) {
+ System.out.println("Unexpected exception: " + e);
+ e.printStackTrace();
+ success = false;
+ }
+ }
+
+ if (!success) {
+ throw new RuntimeException("Test failed");
+ }
+ }
+
+ private void doTest(String algo, Provider provider)
+ throws NoSuchAlgorithmException, NoSuchProviderException,
+ InvalidKeyException {
+ System.out.println("Test " + algo);
+ Mac mac;
+ try {
+ mac = Mac.getInstance(algo, provider);
+ } catch (NoSuchAlgorithmException nsae) {
+ if ("SunPKCS11-Solaris".equals(provider.getName())) {
+ // depending on Solaris configuration,
+ // it can support HMAC or not with Mac
+ System.out.println("Expected NoSuchAlgorithmException thrown: "
+ + nsae);
+ return;
+ }
+ throw nsae;
+ }
+
+ byte[] plain = new byte[MESSAGE_SIZE];
+ for (int i = 0; i < MESSAGE_SIZE; i++) {
+ plain[i] = (byte) (i % 256);
+ }
+
+ byte[] tail = new byte[plain.length - OFFSET];
+ System.arraycopy(plain, OFFSET, tail, 0, tail.length);
+
+ SecureRandom srdm = new SecureRandom();
+ byte[] keyVal = new byte[KEY_SIZE];
+ srdm.nextBytes(keyVal);
+ SecretKeySpec keySpec = new SecretKeySpec(keyVal, "HMAC");
+
+ mac.init(keySpec);
+ byte[] result1 = mac.doFinal(plain);
+
+ mac.reset();
+ mac.update(plain[0]);
+ mac.update(plain, 1, OFFSET - 1);
+ byte[] result2 = mac.doFinal(tail);
+
+ if (!java.util.Arrays.equals(result1, result2)) {
+ throw new RuntimeException("result1 and result2 are not the same");
+ }
+ }
+
+}
--- a/jdk/test/sun/security/pkcs11/PKCS11Test.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/pkcs11/PKCS11Test.java Tue Jan 27 13:58:55 2015 -0500
@@ -582,4 +582,21 @@
return r;
}
+ /**
+ * Returns supported algorithms of specified type.
+ */
+ static List<String> getSupportedAlgorithms(String type, String alg,
+ Provider p) {
+ // prepare a list of supported algorithms
+ List<String> algorithms = new ArrayList<>();
+ Set<Provider.Service> services = p.getServices();
+ for (Provider.Service service : services) {
+ if (service.getType().equals(type)
+ && service.getAlgorithm().startsWith(alg)) {
+ algorithms.add(service.getAlgorithm());
+ }
+ }
+ return algorithms;
+ }
+
}
--- a/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -43,6 +43,10 @@
private static String[] cmdArgs;
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
cmdArgs = args;
main(new ClientJSSEServerJSSE());
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/provider/FileInputStreamPool/FileInputStreamPoolTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8047769
+ * @summary SecureRandom should be more frugal with file descriptors
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.ref.Reference;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.UndeclaredThrowableException;
+import java.util.Arrays;
+
+public class FileInputStreamPoolTest {
+
+ static final byte[] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8};
+
+ static void testCaching(File file) throws IOException {
+ InputStream in1 = TestProxy.FileInputStreamPool_getInputStream(file);
+ InputStream in2 = TestProxy.FileInputStreamPool_getInputStream(file);
+ assertTrue(in1 == in2,
+ "1st InputStream: " + in1 +
+ " is not same as 2nd: " + in2);
+
+ byte[] readBytes = new byte[bytes.length];
+ int nread = in1.read(readBytes);
+ assertTrue(bytes.length == nread,
+ "short read: " + nread +
+ " bytes of expected: " + bytes.length);
+ assertTrue(Arrays.equals(readBytes, bytes),
+ "readBytes: " + Arrays.toString(readBytes) +
+ " not equal to expected: " + Arrays.toString(bytes));
+ }
+
+ static void assertTrue(boolean test, String message) {
+ if (!test) {
+ throw new AssertionError(message);
+ }
+ }
+
+ static void processReferences() {
+ // make JVM process References
+ System.gc();
+ // help ReferenceHandler thread enqueue References
+ while (TestProxy.Reference_tryHandlePending(false)) {}
+ // help run Finalizers
+ System.runFinalization();
+ }
+
+ public static void main(String[] args) throws Exception {
+ // 1st create temporary file
+ File file = File.createTempFile("test", ".dat");
+ try (AutoCloseable acf = () -> {
+ // On Windows, failure to delete file is probably a consequence
+ // of the file still being opened - so the test should fail.
+ assertTrue(file.delete(),
+ "Can't delete: " + file + " (is it still open?)");
+ }) {
+ try (FileOutputStream out = new FileOutputStream(file)) {
+ out.write(bytes);
+ }
+
+ // test caching 1t time
+ testCaching(file);
+
+ processReferences();
+
+ // test caching 2nd time - this should only succeed if the stream
+ // is re-opened as a consequence of cleared WeakReference
+ testCaching(file);
+
+ processReferences();
+ }
+ }
+
+ /**
+ * A proxy for (package)private static methods:
+ * sun.security.provider.FileInputStreamPool.getInputStream
+ * java.lang.ref.Reference.tryHandlePending
+ */
+ static class TestProxy {
+ private static final Method getInputStreamMethod;
+ private static final Method tryHandlePendingMethod;
+
+ static {
+ try {
+ Class<?> fileInputStreamPoolClass =
+ Class.forName("sun.security.provider.FileInputStreamPool");
+ getInputStreamMethod =
+ fileInputStreamPoolClass.getDeclaredMethod(
+ "getInputStream", File.class);
+ getInputStreamMethod.setAccessible(true);
+
+ tryHandlePendingMethod = Reference.class.getDeclaredMethod(
+ "tryHandlePending", boolean.class);
+ tryHandlePendingMethod.setAccessible(true);
+ } catch (Exception e) {
+ throw new Error(e);
+ }
+ }
+
+ static InputStream FileInputStreamPool_getInputStream(File file)
+ throws IOException {
+ try {
+ return (InputStream) getInputStreamMethod.invoke(null, file);
+ } catch (InvocationTargetException e) {
+ Throwable te = e.getTargetException();
+ if (te instanceof IOException) {
+ throw (IOException) te;
+ } else if (te instanceof RuntimeException) {
+ throw (RuntimeException) te;
+ } else if (te instanceof Error) {
+ throw (Error) te;
+ } else {
+ throw new UndeclaredThrowableException(te);
+ }
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ static boolean Reference_tryHandlePending(boolean waitForNotify) {
+ try {
+ return (boolean) tryHandlePendingMethod
+ .invoke(null, waitForNotify);
+ } catch (InvocationTargetException e) {
+ Throwable te = e.getTargetException();
+ if (te instanceof RuntimeException) {
+ throw (RuntimeException) te;
+ } else if (te instanceof Error) {
+ throw (Error) te;
+ } else {
+ throw new UndeclaredThrowableException(te);
+ }
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/ssl/ClientHandshaker/LengthCheckTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,814 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8044860
+ * @summary Vectors and fixed length fields should be verified
+ * for allowed sizes.
+ * @run main/othervm LengthCheckTest
+ */
+
+/**
+ * A SSLEngine usage example which simplifies the presentation
+ * by removing the I/O and multi-threading concerns.
+ *
+ * The test creates two SSLEngines, simulating a client and server.
+ * The "transport" layer consists two byte buffers: think of them
+ * as directly connected pipes.
+ *
+ * Note, this is a *very* simple example: real code will be much more
+ * involved. For example, different threading and I/O models could be
+ * used, transport mechanisms could close unexpectedly, and so on.
+ *
+ * When this application runs, notice that several messages
+ * (wrap/unwrap) pass before any application data is consumed or
+ * produced. (For more information, please see the SSL/TLS
+ * specifications.) There may several steps for a successful handshake,
+ * so it's typical to see the following series of operations:
+ *
+ * client server message
+ * ====== ====== =======
+ * wrap() ... ClientHello
+ * ... unwrap() ClientHello
+ * ... wrap() ServerHello/Certificate
+ * unwrap() ... ServerHello/Certificate
+ * wrap() ... ClientKeyExchange
+ * wrap() ... ChangeCipherSpec
+ * wrap() ... Finished
+ * ... unwrap() ClientKeyExchange
+ * ... unwrap() ChangeCipherSpec
+ * ... unwrap() Finished
+ * ... wrap() ChangeCipherSpec
+ * ... wrap() Finished
+ * unwrap() ... ChangeCipherSpec
+ * unwrap() ... Finished
+ */
+
+import javax.net.ssl.*;
+import javax.net.ssl.SSLEngineResult.*;
+import java.io.*;
+import java.security.*;
+import java.nio.*;
+import java.util.List;
+import java.util.ArrayList;
+import sun.security.ssl.ProtocolVersion;
+
+public class LengthCheckTest {
+
+ /*
+ * Enables logging of the SSLEngine operations.
+ */
+ private static final boolean logging = true;
+
+ /*
+ * Enables the JSSE system debugging system property:
+ *
+ * -Djavax.net.debug=all
+ *
+ * This gives a lot of low-level information about operations underway,
+ * including specific handshake messages, and might be best examined
+ * after gaining some familiarity with this application.
+ */
+ private static final boolean debug = false;
+ private static final boolean dumpBufs = true;
+
+ private final SSLContext sslc;
+
+ private SSLEngine clientEngine; // client Engine
+ private ByteBuffer clientOut; // write side of clientEngine
+ private ByteBuffer clientIn; // read side of clientEngine
+
+ private SSLEngine serverEngine; // server Engine
+ private ByteBuffer serverOut; // write side of serverEngine
+ private ByteBuffer serverIn; // read side of serverEngine
+
+ private HandshakeTest handshakeTest;
+
+ /*
+ * For data transport, this example uses local ByteBuffers. This
+ * isn't really useful, but the purpose of this example is to show
+ * SSLEngine concepts, not how to do network transport.
+ */
+ private ByteBuffer cTOs; // "reliable" transport client->server
+ private ByteBuffer sTOc; // "reliable" transport server->client
+
+ /*
+ * The following is to set up the keystores.
+ */
+ private static final String pathToStores = "../../../../javax/net/ssl/etc";
+ private static final String keyStoreFile = "keystore";
+ private static final String trustStoreFile = "truststore";
+ private static final String passwd = "passphrase";
+
+ private static final String keyFilename =
+ System.getProperty("test.src", ".") + "/" + pathToStores +
+ "/" + keyStoreFile;
+ private static final String trustFilename =
+ System.getProperty("test.src", ".") + "/" + pathToStores +
+ "/" + trustStoreFile;
+
+ // Define a few basic TLS record and message types we might need
+ private static final int TLS_RECTYPE_CCS = 0x14;
+ private static final int TLS_RECTYPE_ALERT = 0x15;
+ private static final int TLS_RECTYPE_HANDSHAKE = 0x16;
+ private static final int TLS_RECTYPE_APPDATA = 0x17;
+
+ private static final int TLS_HS_HELLO_REQUEST = 0x00;
+ private static final int TLS_HS_CLIENT_HELLO = 0x01;
+ private static final int TLS_HS_SERVER_HELLO = 0x02;
+ private static final int TLS_HS_CERTIFICATE = 0x0B;
+ private static final int TLS_HS_SERVER_KEY_EXCHG = 0x0C;
+ private static final int TLS_HS_CERT_REQUEST = 0x0D;
+ private static final int TLS_HS_SERVER_HELLO_DONE = 0x0E;
+ private static final int TLS_HS_CERT_VERIFY = 0x0F;
+ private static final int TLS_HS_CLIENT_KEY_EXCHG = 0x10;
+ private static final int TLS_HS_FINISHED = 0x14;
+
+ // We're not going to define all the alert types in TLS, just
+ // the ones we think we'll need to reference by name.
+ private static final int TLS_ALERT_LVL_WARNING = 0x01;
+ private static final int TLS_ALERT_LVL_FATAL = 0x02;
+
+ private static final int TLS_ALERT_UNEXPECTED_MSG = 0x0A;
+ private static final int TLS_ALERT_HANDSHAKE_FAILURE = 0x28;
+ private static final int TLS_ALERT_INTERNAL_ERROR = 0x50;
+
+ public interface HandshakeTest {
+ void execTest() throws Exception;
+ }
+
+ public final HandshakeTest servSendLongID = new HandshakeTest() {
+ @Override
+ public void execTest() throws Exception {
+ boolean gotException = false;
+ SSLEngineResult clientResult; // results from client's last op
+ SSLEngineResult serverResult; // results from server's last op
+
+ log("\n==== Test: Client receives 64-byte session ID ====");
+
+ // Send Client Hello
+ clientResult = clientEngine.wrap(clientOut, cTOs);
+ log("client wrap: ", clientResult);
+ runDelegatedTasks(clientResult, clientEngine);
+ cTOs.flip();
+ dumpByteBuffer("CLIENT-TO-SERVER", cTOs);
+
+ // Server consumes Client Hello
+ serverResult = serverEngine.unwrap(cTOs, serverIn);
+ log("server unwrap: ", serverResult);
+ runDelegatedTasks(serverResult, serverEngine);
+ cTOs.compact();
+
+ // Server generates ServerHello/Cert/Done record
+ serverResult = serverEngine.wrap(serverOut, sTOc);
+ log("server wrap: ", serverResult);
+ runDelegatedTasks(serverResult, serverEngine);
+ sTOc.flip();
+
+ // Intercept the ServerHello messages and instead send
+ // one that has a 64-byte session ID.
+ if (isTlsMessage(sTOc, TLS_RECTYPE_HANDSHAKE,
+ TLS_HS_SERVER_HELLO)) {
+ ArrayList<ByteBuffer> recList = splitRecord(sTOc);
+
+ // Use the original ServerHello as a template to craft one
+ // with a longer-than-allowed session ID.
+ ByteBuffer servHelloBuf =
+ createEvilServerHello(recList.get(0), 64);
+
+ recList.set(0, servHelloBuf);
+
+ // Now send each ByteBuffer (each being a complete
+ // TLS record) into the client-side unwrap.
+ for (ByteBuffer bBuf : recList) {
+ dumpByteBuffer("SERVER-TO-CLIENT", bBuf);
+ try {
+ clientResult = clientEngine.unwrap(bBuf, clientIn);
+ } catch (SSLProtocolException e) {
+ log("Received expected SSLProtocolException: " + e);
+ gotException = true;
+ }
+ log("client unwrap: ", clientResult);
+ runDelegatedTasks(clientResult, clientEngine);
+ }
+ } else {
+ dumpByteBuffer("SERVER-TO-CLIENT", sTOc);
+ log("client unwrap: ", clientResult);
+ runDelegatedTasks(clientResult, clientEngine);
+ }
+ sTOc.compact();
+
+ // The Client should now send a TLS Alert
+ clientResult = clientEngine.wrap(clientOut, cTOs);
+ log("client wrap: ", clientResult);
+ runDelegatedTasks(clientResult, clientEngine);
+ cTOs.flip();
+ dumpByteBuffer("CLIENT-TO-SERVER", cTOs);
+
+ // At this point we can verify that both an exception
+ // was thrown and the proper action (a TLS alert) was
+ // sent back to the server.
+ if (gotException == false ||
+ !isTlsMessage(cTOs, TLS_RECTYPE_ALERT, TLS_ALERT_LVL_FATAL,
+ TLS_ALERT_INTERNAL_ERROR)) {
+ throw new SSLException(
+ "Client failed to throw Alert:fatal:internal_error");
+ }
+ }
+ };
+
+ public final HandshakeTest clientSendLongID = new HandshakeTest() {
+ @Override
+ public void execTest() throws Exception {
+ boolean gotException = false;
+ SSLEngineResult clientResult; // results from client's last op
+ SSLEngineResult serverResult; // results from server's last op
+
+ log("\n==== Test: Server receives 64-byte session ID ====");
+
+ // Send Client Hello
+ ByteBuffer evilClientHello = createEvilClientHello(64);
+ dumpByteBuffer("CLIENT-TO-SERVER", evilClientHello);
+
+ try {
+ // Server consumes Client Hello
+ serverResult = serverEngine.unwrap(evilClientHello, serverIn);
+ log("server unwrap: ", serverResult);
+ runDelegatedTasks(serverResult, serverEngine);
+ evilClientHello.compact();
+
+ // Under normal circumstances this should be a ServerHello
+ // But should throw an exception instead due to the invalid
+ // session ID.
+ serverResult = serverEngine.wrap(serverOut, sTOc);
+ log("server wrap: ", serverResult);
+ runDelegatedTasks(serverResult, serverEngine);
+ sTOc.flip();
+ dumpByteBuffer("SERVER-TO-CLIENT", sTOc);
+ } catch (SSLProtocolException ssle) {
+ log("Received expected SSLProtocolException: " + ssle);
+ gotException = true;
+ }
+
+ // We expect to see the server generate an alert here
+ serverResult = serverEngine.wrap(serverOut, sTOc);
+ log("server wrap: ", serverResult);
+ runDelegatedTasks(serverResult, serverEngine);
+ sTOc.flip();
+ dumpByteBuffer("SERVER-TO-CLIENT", sTOc);
+
+ // At this point we can verify that both an exception
+ // was thrown and the proper action (a TLS alert) was
+ // sent back to the client.
+ if (gotException == false ||
+ !isTlsMessage(sTOc, TLS_RECTYPE_ALERT, TLS_ALERT_LVL_FATAL,
+ TLS_ALERT_INTERNAL_ERROR)) {
+ throw new SSLException(
+ "Server failed to throw Alert:fatal:internal_error");
+ }
+ }
+ };
+
+
+ /*
+ * Main entry point for this test.
+ */
+ public static void main(String args[]) throws Exception {
+ List<LengthCheckTest> ccsTests = new ArrayList<>();
+
+ if (debug) {
+ System.setProperty("javax.net.debug", "ssl");
+ }
+
+ ccsTests.add(new LengthCheckTest("ServSendLongID"));
+ ccsTests.add(new LengthCheckTest("ClientSendLongID"));
+
+ for (LengthCheckTest test : ccsTests) {
+ test.runTest();
+ }
+
+ System.out.println("Test Passed.");
+ }
+
+ /*
+ * Create an initialized SSLContext to use for these tests.
+ */
+ public LengthCheckTest(String testName) throws Exception {
+
+ KeyStore ks = KeyStore.getInstance("JKS");
+ KeyStore ts = KeyStore.getInstance("JKS");
+
+ char[] passphrase = "passphrase".toCharArray();
+
+ ks.load(new FileInputStream(keyFilename), passphrase);
+ ts.load(new FileInputStream(trustFilename), passphrase);
+
+ KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+ kmf.init(ks, passphrase);
+
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+ tmf.init(ts);
+
+ SSLContext sslCtx = SSLContext.getInstance("TLS");
+
+ sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+
+ sslc = sslCtx;
+
+ switch (testName) {
+ case "ServSendLongID":
+ handshakeTest = servSendLongID;
+ break;
+ case "ClientSendLongID":
+ handshakeTest = clientSendLongID;
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown test name: " +
+ testName);
+ }
+ }
+
+ /*
+ * Run the test.
+ *
+ * Sit in a tight loop, both engines calling wrap/unwrap regardless
+ * of whether data is available or not. We do this until both engines
+ * report back they are closed.
+ *
+ * The main loop handles all of the I/O phases of the SSLEngine's
+ * lifetime:
+ *
+ * initial handshaking
+ * application data transfer
+ * engine closing
+ *
+ * One could easily separate these phases into separate
+ * sections of code.
+ */
+ private void runTest() throws Exception {
+ boolean dataDone = false;
+
+ createSSLEngines();
+ createBuffers();
+
+ handshakeTest.execTest();
+ }
+
+ /*
+ * Using the SSLContext created during object creation,
+ * create/configure the SSLEngines we'll use for this test.
+ */
+ private void createSSLEngines() throws Exception {
+ /*
+ * Configure the serverEngine to act as a server in the SSL/TLS
+ * handshake. Also, require SSL client authentication.
+ */
+ serverEngine = sslc.createSSLEngine();
+ serverEngine.setUseClientMode(false);
+ serverEngine.setNeedClientAuth(false);
+
+ /*
+ * Similar to above, but using client mode instead.
+ */
+ clientEngine = sslc.createSSLEngine("client", 80);
+ clientEngine.setUseClientMode(true);
+
+ // In order to make a test that will be backwards compatible
+ // going back to JDK 5, force the handshake to be TLS 1.0 and
+ // use one of the older cipher suites.
+ clientEngine.setEnabledProtocols(new String[]{"TLSv1"});
+ clientEngine.setEnabledCipherSuites(
+ new String[]{"TLS_RSA_WITH_AES_128_CBC_SHA"});
+ }
+
+ /*
+ * Create and size the buffers appropriately.
+ */
+ private void createBuffers() {
+
+ /*
+ * We'll assume the buffer sizes are the same
+ * between client and server.
+ */
+ SSLSession session = clientEngine.getSession();
+ int appBufferMax = session.getApplicationBufferSize();
+ int netBufferMax = session.getPacketBufferSize();
+
+ /*
+ * We'll make the input buffers a bit bigger than the max needed
+ * size, so that unwrap()s following a successful data transfer
+ * won't generate BUFFER_OVERFLOWS.
+ *
+ * We'll use a mix of direct and indirect ByteBuffers for
+ * tutorial purposes only. In reality, only use direct
+ * ByteBuffers when they give a clear performance enhancement.
+ */
+ clientIn = ByteBuffer.allocate(appBufferMax + 50);
+ serverIn = ByteBuffer.allocate(appBufferMax + 50);
+
+ cTOs = ByteBuffer.allocateDirect(netBufferMax);
+ sTOc = ByteBuffer.allocateDirect(netBufferMax);
+
+ clientOut = ByteBuffer.wrap("Hi Server, I'm Client".getBytes());
+ serverOut = ByteBuffer.wrap("Hello Client, I'm Server".getBytes());
+ }
+
+ /*
+ * If the result indicates that we have outstanding tasks to do,
+ * go ahead and run them in this thread.
+ */
+ private static void runDelegatedTasks(SSLEngineResult result,
+ SSLEngine engine) throws Exception {
+
+ if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
+ Runnable runnable;
+ while ((runnable = engine.getDelegatedTask()) != null) {
+ log("\trunning delegated task...");
+ runnable.run();
+ }
+ HandshakeStatus hsStatus = engine.getHandshakeStatus();
+ if (hsStatus == HandshakeStatus.NEED_TASK) {
+ throw new Exception(
+ "handshake shouldn't need additional tasks");
+ }
+ log("\tnew HandshakeStatus: " + hsStatus);
+ }
+ }
+
+ private static boolean isEngineClosed(SSLEngine engine) {
+ return (engine.isOutboundDone() && engine.isInboundDone());
+ }
+
+ /*
+ * Simple check to make sure everything came across as expected.
+ */
+ private static void checkTransfer(ByteBuffer a, ByteBuffer b)
+ throws Exception {
+ a.flip();
+ b.flip();
+
+ if (!a.equals(b)) {
+ throw new Exception("Data didn't transfer cleanly");
+ } else {
+ log("\tData transferred cleanly");
+ }
+
+ a.position(a.limit());
+ b.position(b.limit());
+ a.limit(a.capacity());
+ b.limit(b.capacity());
+ }
+
+ /*
+ * Logging code
+ */
+ private static boolean resultOnce = true;
+
+ private static void log(String str, SSLEngineResult result) {
+ if (!logging) {
+ return;
+ }
+ if (resultOnce) {
+ resultOnce = false;
+ System.out.println("The format of the SSLEngineResult is: \n" +
+ "\t\"getStatus() / getHandshakeStatus()\" +\n" +
+ "\t\"bytesConsumed() / bytesProduced()\"\n");
+ }
+ HandshakeStatus hsStatus = result.getHandshakeStatus();
+ log(str +
+ result.getStatus() + "/" + hsStatus + ", " +
+ result.bytesConsumed() + "/" + result.bytesProduced() +
+ " bytes");
+ if (hsStatus == HandshakeStatus.FINISHED) {
+ log("\t...ready for application data");
+ }
+ }
+
+ private static void log(String str) {
+ if (logging) {
+ System.out.println(str);
+ }
+ }
+
+ /**
+ * Split a record consisting of multiple TLS handshake messages
+ * into individual TLS records, each one in a ByteBuffer of its own.
+ *
+ * @param tlsRecord A ByteBuffer containing the tls record data.
+ * The position of the buffer should be at the first byte
+ * in the TLS record data.
+ *
+ * @return An ArrayList consisting of one or more ByteBuffers. Each
+ * ByteBuffer will contain a single TLS record with one message.
+ * That message will be taken from the input record. The order
+ * of the messages in the ArrayList will be the same as they
+ * were in the input record.
+ */
+ private ArrayList<ByteBuffer> splitRecord(ByteBuffer tlsRecord) {
+ SSLSession session = clientEngine.getSession();
+ int netBufferMax = session.getPacketBufferSize();
+ ArrayList<ByteBuffer> recordList = new ArrayList<>();
+
+ if (tlsRecord.hasRemaining()) {
+ int type = Byte.toUnsignedInt(tlsRecord.get());
+ byte ver_major = tlsRecord.get();
+ byte ver_minor = tlsRecord.get();
+ int recLen = Short.toUnsignedInt(tlsRecord.getShort());
+ byte[] newMsgData = null;
+ while (tlsRecord.hasRemaining()) {
+ ByteBuffer newRecord = ByteBuffer.allocateDirect(netBufferMax);
+ switch (type) {
+ case TLS_RECTYPE_CCS:
+ case TLS_RECTYPE_ALERT:
+ case TLS_RECTYPE_APPDATA:
+ // None of our tests have multiple non-handshake
+ // messages coalesced into a single record.
+ break;
+ case TLS_RECTYPE_HANDSHAKE:
+ newMsgData = getHandshakeMessage(tlsRecord);
+ break;
+ }
+
+ // Put a new TLS record on the destination ByteBuffer
+ newRecord.put((byte)type);
+ newRecord.put(ver_major);
+ newRecord.put(ver_minor);
+ newRecord.putShort((short)newMsgData.length);
+
+ // Now add the message content itself and attach to the
+ // returned ArrayList
+ newRecord.put(newMsgData);
+ newRecord.flip();
+ recordList.add(newRecord);
+ }
+ }
+
+ return recordList;
+ }
+
+ private static ByteBuffer createEvilClientHello(int sessIdLen) {
+ ByteBuffer newRecord = ByteBuffer.allocateDirect(4096);
+
+ // Lengths will initially be place holders until we determine the
+ // finished length of the ByteBuffer. Then we'll go back and scribble
+ // in the correct lengths.
+
+ newRecord.put((byte)TLS_RECTYPE_HANDSHAKE); // Record type
+ newRecord.putShort((short)0x0301); // Protocol (TLS 1.0)
+ newRecord.putShort((short)0); // Length place holder
+
+ newRecord.putInt(TLS_HS_CLIENT_HELLO << 24); // HS type and length
+ newRecord.putShort((short)0x0301);
+ newRecord.putInt((int)(System.currentTimeMillis() / 1000));
+ SecureRandom sr = new SecureRandom();
+ byte[] randBuf = new byte[28];
+ sr.nextBytes(randBuf);
+ newRecord.put(randBuf); // Client Random
+ newRecord.put((byte)sessIdLen); // Session ID length
+ if (sessIdLen > 0) {
+ byte[] sessId = new byte[sessIdLen];
+ sr.nextBytes(sessId);
+ newRecord.put(sessId); // Session ID
+ }
+ newRecord.putShort((short)2); // 2 bytes of ciphers
+ newRecord.putShort((short)0x002F); // TLS_RSA_AES_CBC_SHA
+ newRecord.putShort((short)0x0100); // only null compression
+ newRecord.putShort((short)5); // 5 bytes of extensions
+ newRecord.putShort((short)0xFF01); // Renegotiation info
+ newRecord.putShort((short)1);
+ newRecord.put((byte)0); // No reneg info exts
+
+ // Go back and fill in the correct length values for the record
+ // and handshake message headers.
+ int recordLength = newRecord.position();
+ newRecord.putShort(3, (short)(recordLength - 5));
+ int newTypeAndLen = (newRecord.getInt(5) & 0xFF000000) |
+ ((recordLength - 9) & 0x00FFFFFF);
+ newRecord.putInt(5, newTypeAndLen);
+
+ newRecord.flip();
+ return newRecord;
+ }
+
+ private static ByteBuffer createEvilServerHello(ByteBuffer origHello,
+ int newSessIdLen) {
+ if (newSessIdLen < 0 || newSessIdLen > Byte.MAX_VALUE) {
+ throw new RuntimeException("Length must be 0 <= X <= 127");
+ }
+
+ ByteBuffer newRecord = ByteBuffer.allocateDirect(4096);
+ // Copy the bytes from the old hello to the new up to the session ID
+ // field. We will go back later and fill in a new length field in
+ // the record header. This includes the record header (5 bytes), the
+ // Handshake message header (4 bytes), protocol version (2 bytes),
+ // and the random (32 bytes).
+ ByteBuffer scratchBuffer = origHello.slice();
+ scratchBuffer.limit(43);
+ newRecord.put(scratchBuffer);
+
+ // Advance the position in the originial hello buffer past the
+ // session ID.
+ origHello.position(43);
+ int origIDLen = Byte.toUnsignedInt(origHello.get());
+ if (origIDLen > 0) {
+ // Skip over the session ID
+ origHello.position(origHello.position() + origIDLen);
+ }
+
+ // Now add our own sessionID to the new record
+ SecureRandom sr = new SecureRandom();
+ byte[] sessId = new byte[newSessIdLen];
+ sr.nextBytes(sessId);
+ newRecord.put((byte)newSessIdLen);
+ newRecord.put(sessId);
+
+ // Create another slice in the original buffer, based on the position
+ // past the session ID. Copy the remaining bytes into the new
+ // hello buffer. Then go back and fix up the length
+ newRecord.put(origHello.slice());
+
+ // Go back and fill in the correct length values for the record
+ // and handshake message headers.
+ int recordLength = newRecord.position();
+ newRecord.putShort(3, (short)(recordLength - 5));
+ int newTypeAndLen = (newRecord.getInt(5) & 0xFF000000) |
+ ((recordLength - 9) & 0x00FFFFFF);
+ newRecord.putInt(5, newTypeAndLen);
+
+ newRecord.flip();
+ return newRecord;
+ }
+
+ /**
+ * Look at an incoming TLS record and see if it is the desired
+ * record type, and where appropriate the correct subtype.
+ *
+ * @param srcRecord The input TLS record to be evaluated. This
+ * method will only look at the leading message if multiple
+ * TLS handshake messages are coalesced into a single record.
+ * @param reqRecType The requested TLS record type
+ * @param recParams Zero or more integer sub type fields. For CCS
+ * and ApplicationData, no params are used. For handshake records,
+ * one value corresponding to the HandshakeType is required.
+ * For Alerts, two values corresponding to AlertLevel and
+ * AlertDescription are necessary.
+ *
+ * @return true if the proper handshake message is the first one
+ * in the input record, false otherwise.
+ */
+ private boolean isTlsMessage(ByteBuffer srcRecord, int reqRecType,
+ int... recParams) {
+ boolean foundMsg = false;
+
+ if (srcRecord.hasRemaining()) {
+ srcRecord.mark();
+
+ // Grab the fields from the TLS Record
+ int recordType = Byte.toUnsignedInt(srcRecord.get());
+ byte ver_major = srcRecord.get();
+ byte ver_minor = srcRecord.get();
+ int recLen = Short.toUnsignedInt(srcRecord.getShort());
+
+ if (recordType == reqRecType) {
+ // For any zero-length recParams, making sure the requested
+ // type is sufficient.
+ if (recParams.length == 0) {
+ foundMsg = true;
+ } else {
+ switch (recordType) {
+ case TLS_RECTYPE_CCS:
+ case TLS_RECTYPE_APPDATA:
+ // We really shouldn't find ourselves here, but
+ // if someone asked for these types and had more
+ // recParams we can ignore them.
+ foundMsg = true;
+ break;
+ case TLS_RECTYPE_ALERT:
+ // Needs two params, AlertLevel and AlertDescription
+ if (recParams.length != 2) {
+ throw new RuntimeException(
+ "Test for Alert requires level and desc.");
+ } else {
+ int level = Byte.toUnsignedInt(srcRecord.get());
+ int desc = Byte.toUnsignedInt(srcRecord.get());
+ if (level == recParams[0] &&
+ desc == recParams[1]) {
+ foundMsg = true;
+ }
+ }
+ break;
+ case TLS_RECTYPE_HANDSHAKE:
+ // Needs one parameter, HandshakeType
+ if (recParams.length != 1) {
+ throw new RuntimeException(
+ "Test for Handshake requires only HS type");
+ } else {
+ // Go into the first handhshake message in the
+ // record and grab the handshake message header.
+ // All we need to do is parse out the leading
+ // byte.
+ int msgHdr = srcRecord.getInt();
+ int msgType = (msgHdr >> 24) & 0x000000FF;
+ if (msgType == recParams[0]) {
+ foundMsg = true;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ srcRecord.reset();
+ }
+
+ return foundMsg;
+ }
+
+ private byte[] getHandshakeMessage(ByteBuffer srcRecord) {
+ // At the start of this routine, the position should be lined up
+ // at the first byte of a handshake message. Mark this location
+ // so we can return to it after reading the type and length.
+ srcRecord.mark();
+ int msgHdr = srcRecord.getInt();
+ int type = (msgHdr >> 24) & 0x000000FF;
+ int length = msgHdr & 0x00FFFFFF;
+
+ // Create a byte array that has enough space for the handshake
+ // message header and body.
+ byte[] data = new byte[length + 4];
+ srcRecord.reset();
+ srcRecord.get(data, 0, length + 4);
+
+ return (data);
+ }
+
+ /**
+ * Hex-dumps a ByteBuffer to stdout.
+ */
+ private static void dumpByteBuffer(String header, ByteBuffer bBuf) {
+ if (dumpBufs == false) {
+ return;
+ }
+
+ int bufLen = bBuf.remaining();
+ if (bufLen > 0) {
+ bBuf.mark();
+
+ // We expect the position of the buffer to be at the
+ // beginning of a TLS record. Get the type, version and length.
+ int type = Byte.toUnsignedInt(bBuf.get());
+ int ver_major = Byte.toUnsignedInt(bBuf.get());
+ int ver_minor = Byte.toUnsignedInt(bBuf.get());
+ int recLen = Short.toUnsignedInt(bBuf.getShort());
+ ProtocolVersion pv = ProtocolVersion.valueOf(ver_major, ver_minor);
+
+ log("===== " + header + " (" + tlsRecType(type) + " / " +
+ pv + " / " + bufLen + " bytes) =====");
+ bBuf.reset();
+ for (int i = 0; i < bufLen; i++) {
+ if (i != 0 && i % 16 == 0) {
+ System.out.print("\n");
+ }
+ System.out.format("%02X ", bBuf.get(i));
+ }
+ log("\n===============================================");
+ bBuf.reset();
+ }
+ }
+
+ private static String tlsRecType(int type) {
+ switch (type) {
+ case 20:
+ return "Change Cipher Spec";
+ case 21:
+ return "Alert";
+ case 22:
+ return "Handshake";
+ case 23:
+ return "Application Data";
+ default:
+ return ("Unknown (" + type + ")");
+ }
+ }
+}
--- a/jdk/test/sun/security/ssl/ProtocolVersion/HttpsProtocols.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/ssl/ProtocolVersion/HttpsProtocols.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -32,6 +32,7 @@
import java.io.*;
import java.net.*;
import javax.net.ssl.*;
+import java.security.Security;
public class HttpsProtocols implements HostnameVerifier {
@@ -177,6 +178,10 @@
volatile Exception clientException = null;
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
String keyFilename =
System.getProperty("test.src", "./") + "/" + pathToStores +
"/" + keyStoreFile;
--- a/jdk/test/sun/security/ssl/SSLContextImpl/CustomizedDefaultProtocols.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/ssl/SSLContextImpl/CustomizedDefaultProtocols.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -35,6 +35,7 @@
import javax.net.*;
import javax.net.ssl.*;
import java.util.Arrays;
+import java.security.Security;
public class CustomizedDefaultProtocols {
static enum ContextVersion {
@@ -93,6 +94,10 @@
}
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
boolean failed = false;
for (ContextVersion cv : ContextVersion.values()) {
System.out.println("Checking SSLContext of " + cv.contextVersion);
--- a/jdk/test/sun/security/ssl/SSLContextImpl/DefaultEnabledProtocols.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/ssl/SSLContextImpl/DefaultEnabledProtocols.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -34,6 +34,7 @@
import javax.net.*;
import javax.net.ssl.*;
import java.util.Arrays;
+import java.security.Security;
public class DefaultEnabledProtocols {
static enum ContextVersion {
@@ -92,6 +93,10 @@
}
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
boolean failed = false;
for (ContextVersion cv : ContextVersion.values()) {
System.out.println("Checking SSLContext of " + cv.contextVersion);
--- a/jdk/test/sun/security/ssl/SSLContextImpl/NoOldVersionContext.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/ssl/SSLContextImpl/NoOldVersionContext.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -35,6 +35,7 @@
import javax.net.*;
import javax.net.ssl.*;
import java.util.Arrays;
+import java.security.Security;
public class NoOldVersionContext {
static enum ContextVersion {
@@ -93,6 +94,10 @@
}
public static void main(String[] args) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
+
boolean failed = false;
for (ContextVersion cv : ContextVersion.values()) {
System.out.println("Checking SSLContext of " + cv.contextVersion);
--- a/jdk/test/sun/security/ssl/SSLEngineImpl/DelegatedTaskWrongException.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/ssl/SSLEngineImpl/DelegatedTaskWrongException.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -115,6 +115,9 @@
}
public static void main(String args[]) throws Exception {
+ // reset the security property to make sure that the algorithms
+ // and keys used in this test are not disabled.
+ Security.setProperty("jdk.tls.disabledAlgorithms", "");
DelegatedTaskWrongException test;
--- a/jdk/test/sun/security/tools/policytool/i18n.sh Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/security/tools/policytool/i18n.sh Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -83,8 +83,9 @@
exit 1
fi
+# The keystore type is set to JKS, to match the type expected by i18n.html
${TESTJAVA}${FS}bin${FS}keytool ${TESTTOOLVMOPTS} -genkeypair -alias hello -dname CN=Hello \
- -storepass changeit -keypass changeit -keystore ks
+ -storepass changeit -keypass changeit -keystore ks -storetype jks
echo changeit > good
echo badpass > bad
${TESTJAVA}${FS}bin${FS}policytool ${TESTTOOLVMOPTS}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/security/x509/Extensions/DefaultCriticality.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @summary Change default criticality of policy mappings and policy constraints
+ certificate extensions
+ * @bug 8059916
+ */
+
+import sun.security.x509.PolicyConstraintsExtension;
+import sun.security.x509.PolicyMappingsExtension;
+
+public class DefaultCriticality {
+ public static void main(String [] args) throws Exception {
+ PolicyConstraintsExtension pce = new PolicyConstraintsExtension(-1,-1);
+ if (!pce.isCritical()) {
+ throw new Exception("PolicyConstraintsExtension should be " +
+ "critical by default");
+ }
+
+ PolicyMappingsExtension pme = new PolicyMappingsExtension();
+ if (!pme.isCritical()) {
+ throw new Exception("PolicyMappingsExtension should be " +
+ "critical by default");
+ }
+
+ System.out.println("Test passed.");
+ }
+}
--- a/jdk/test/sun/tools/common/CommonTests.sh Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,314 +0,0 @@
-#!/bin/sh
-
-#
-# 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.
-#
-# This code is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-# version 2 for more details (a copy is included in the LICENSE file that
-# accompanied this code).
-#
-# You should have received a copy of the GNU General Public License version
-# 2 along with this work; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
-#
-# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
-# or visit www.oracle.com if you need additional information or have any
-# questions.
-#
-
-
-# @test
-# @bug 6964018
-# @summary Unit test for common tools infrastructure.
-#
-# @build SimpleApplication SleeperApplication ShutdownSimpleApplication
-# @run shell CommonTests.sh
-
-. ${TESTSRC}/CommonSetup.sh
-. ${TESTSRC}/ApplicationSetup.sh
-
-# hope for the best:
-status=0
-
-
-# Test program path constants from CommonSetup.sh:
-#
-for name in JAVA JHAT JINFO JMAP JPS JSTACK; do
- eval value=$`echo $name`
-
- echo "INFO: $name=$value"
- if [ -x "$value" ]; then
- echo "INFO: '$value' is executable."
- else
- echo "ERROR: '$value' is not executable." >&2
- status=1
- fi
-done
-
-
-# Display flag values from CommonSetup.sh:
-#
-for name in isCygwin isMKS isLinux isSolaris isUnknownOS isWindows; do
- eval value=$`echo $name`
- echo "INFO: flag $name=$value"
-done
-
-
-# Test OS constant from CommonSetup.sh:
-#
-if [ -z "$OS" ]; then
- echo "ERROR: OS constant cannot be empty." >&2
- status=1
-fi
-
-
-# Display the PATTERN_EOL value:
-#
-echo "INFO: PATTERN_EOL="`echo "$PATTERN_EOL" | od -c`
-
-
-# Test PATTERN_EOL with 'grep' for a regular line.
-#
-TESTOUT="${TESTCLASSES}/testout.grep_reg_line_eol"
-set +e
-echo 'regular line' | grep "line${PATTERN_EOL}" > "$TESTOUT"
-set -e
-if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_EOL works for regular line with grep."
-else
- echo "ERROR: PATTERN_EOL does not work for regular line with grep." >&2
- status=1
-fi
-
-
-if $isWindows; then
- # Test PATTERN_EOL with 'grep' for a CR line.
- #
- TESTOUT="${TESTCLASSES}/testout.grep_cr_line_eol"
- set +e
- echo 'CR line
' | grep "line${PATTERN_EOL}" > "$TESTOUT"
- set -e
- if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_EOL works for CR line with grep."
- else
- echo "ERROR: PATTERN_EOL does not work for CR line with grep." >&2
- status=1
- fi
-fi
-
-
-# Test PATTERN_EOL with 'sed' for a regular line.
-#
-TESTOUT="${TESTCLASSES}/testout.sed_reg_line_eol"
-echo 'regular line' | sed -n "/line${PATTERN_EOL}/p" > "$TESTOUT"
-if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_EOL works for regular line with sed."
-else
- echo "ERROR: PATTERN_EOL does not work for regular line with sed." >&2
- status=1
-fi
-
-
-if $isWindows; then
- # Test PATTERN_EOL with 'sed' for a CR line.
- #
- TESTOUT="${TESTCLASSES}/testout.sed_cr_line_eol"
- echo 'CR line
' | sed -n "/line${PATTERN_EOL}/p" > "$TESTOUT"
- if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_EOL works for CR line with sed."
- else
- echo "ERROR: PATTERN_EOL does not work for CR line with sed." >&2
- status=1
- fi
-fi
-
-
-# Display the PATTERN_WS value:
-#
-echo "INFO: PATTERN_WS="`echo "$PATTERN_WS" | od -c`
-
-
-# Test PATTERN_WS with 'grep' for a blank.
-#
-TESTOUT="${TESTCLASSES}/testout.grep_blank"
-set +e
-echo 'blank: ' | grep "$PATTERN_WS" > "$TESTOUT"
-set -e
-if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_WS works for blanks with grep."
-else
- echo "ERROR: PATTERN_WS does not work for blanks with grep." >&2
- status=1
-fi
-
-
-# Test PATTERN_WS with 'grep' for a tab.
-#
-TESTOUT="${TESTCLASSES}/testout.grep_tab"
-set +e
-echo 'tab: ' | grep "$PATTERN_WS" > "$TESTOUT"
-set -e
-if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_WS works for tabs with grep."
-else
- echo "ERROR: PATTERN_WS does not work for tabs with grep." >&2
- status=1
-fi
-
-
-# Test PATTERN_WS with 'sed' for a blank.
-#
-TESTOUT="${TESTCLASSES}/testout.sed_blank"
-echo 'blank: ' | sed -n "/$PATTERN_WS/p" > "$TESTOUT"
-if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_WS works for blanks with sed."
-else
- echo "ERROR: PATTERN_WS does not work for blanks with sed." >&2
- status=1
-fi
-
-
-# Test PATTERN_WS with 'sed' for a tab.
-#
-TESTOUT="${TESTCLASSES}/testout.sed_tab"
-echo 'tab: ' | sed -n "/$PATTERN_WS/p" > "$TESTOUT"
-if [ -s "$TESTOUT" ]; then
- echo "INFO: PATTERN_WS works for tabs with sed."
-else
- echo "ERROR: PATTERN_WS does not work for tabs with sed." >&2
- status=1
-fi
-
-
-# Test startApplication and use PORTFILE for coordination
-# The app sleeps for 30 seconds.
-#
-PORTFILE="${TESTCLASSES}"/shutdown.port
-startApplication SleeperApplication "${PORTFILE}" 30
-
-
-# Test appJavaPid in "ps" cmd output.
-#
-TESTOUT="${TESTCLASSES}/testout.ps_app"
-set +e
-if $isCygwin; then
- # On Cygwin, appJavaPid is the Windows pid for the Java process
- # and appOtherPid is the Cygwin pid for the Java process.
- ps -p "$appOtherPid" \
- | grep "${PATTERN_WS}${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
-else
- # output only pid and comm columns to avoid mismatches
- ps -eo pid,comm \
- | grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
-fi
-set -e
-if [ -s "$TESTOUT" ]; then
- echo "INFO: begin appJavaPid=$appJavaPid in 'ps' cmd output:"
- cat "$TESTOUT"
- echo "INFO: end appJavaPid=$appJavaPid in 'ps' cmd output."
-else
- echo "ERROR: 'ps' cmd should show appJavaPid=$appJavaPid." >&2
- status=1
-fi
-
-if [ -n "$appOtherPid" ]; then
- # Test appOtherPid in "ps" cmd output, if we have one.
- #
- TESTOUT="${TESTCLASSES}/testout.ps_other"
- set +e
- if $isCygwin; then
- ps -p "$appOtherPid" \
- | grep "${PATTERN_WS}${appOtherPid}${PATTERN_WS}" > "$TESTOUT"
- else
- # output only pid and comm columns to avoid mismatches
- ps -eo pid,comm \
- | grep "^${PATTERN_WS}*${appOtherPid}${PATTERN_WS}" > "$TESTOUT"
- fi
- set -e
- if [ -s "$TESTOUT" ]; then
- echo "INFO: begin appOtherPid=$appOtherPid in 'ps' cmd output:"
- cat "$TESTOUT"
- echo "INFO: end appOtherPid=$appOtherPid in 'ps' cmd output."
- else
- echo "ERROR: 'ps' cmd should show appOtherPid=$appOtherPid." >&2
- status=1
- fi
-fi
-
-
-# Test stopApplication and PORTFILE for coordination
-#
-stopApplication "${PORTFILE}"
-
-
-# Test application still running after stopApplication.
-#
-# stopApplication just lets the app know that it can stop, but the
-# app might still be doing work. This test just demonstrates that
-# fact and doesn't fail if the app is already done.
-#
-TESTOUT="${TESTCLASSES}/testout.after_stop"
-set +e
-if $isCygwin; then
- # On Cygwin, appJavaPid is the Windows pid for the Java process
- # and appOtherPid is the Cygwin pid for the Java process.
- ps -p "$appOtherPid" \
- | grep "${PATTERN_WS}${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
-else
- # output only pid and comm columns to avoid mismatches
- ps -eo pid,comm \
- | grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
-fi
-set -e
-if [ -s "$TESTOUT" ]; then
- echo "INFO: it is okay for appJavaPid=$appJavaPid to still be running" \
- "after stopApplication() is called."
- echo "INFO: begin 'after_stop' output:"
- cat "$TESTOUT"
- echo "INFO: end 'after_stop' output."
-fi
-
-
-# Test waitForApplication
-#
-# The app might already be gone so this function shouldn't generate
-# a fatal error in either call.
-#
-waitForApplication
-
-if [ $isWindows = false ]; then
- # Windows can recycle pids quickly so we can't use this test there
- TESTOUT="${TESTCLASSES}/testout.after_kill"
- set +e
- # output only pid and comm columns to avoid mismatches
- ps -eo pid,comm \
- | grep "^${PATTERN_WS}*${appJavaPid}${PATTERN_WS}" > "$TESTOUT"
- set -e
- if [ -s "$TESTOUT" ]; then
- echo "ERROR: 'ps' cmd should not show appJavaPid." >&2
- echo "ERROR: begin 'after_kill' output:" >&2
- cat "$TESTOUT" >&2
- echo "ERROR: end 'after_kill' output." >&2
- status=1
- else
- echo "INFO: 'ps' cmd does not show appJavaPid after" \
- "waitForApplication() is called."
- fi
-fi
-
-
-# Test killApplication
-#
-# The app is already be gone so this function shouldn't generate
-# a fatal error.
-#
-killApplication
-
-exit $status
--- a/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/tools/jcmd/TestJcmdDefaults.java Tue Jan 27 13:58:55 2015 -0500
@@ -25,6 +25,9 @@
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
import jdk.testlibrary.JcmdBase;
@@ -95,11 +98,11 @@
}
private static void verifyOutputAgainstFile(OutputAnalyzer output) throws IOException {
- File file = new File(TEST_SRC, "usage.out");
- List<String> fileOutput = Utils.fileAsList(file);
+ Path path = Paths.get(TEST_SRC, "usage.out");
+ List<String> fileOutput = Files.readAllLines(path);
List<String> outputAsLines = output.asLines();
assertTrue(outputAsLines.containsAll(fileOutput),
- "The ouput should contain all content of " + file.getAbsolutePath());
+ "The ouput should contain all content of " + path.toAbsolutePath());
}
}
--- a/jdk/test/sun/tools/jcmd/TestJcmdSanity.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/tools/jcmd/TestJcmdSanity.java Tue Jan 27 13:58:55 2015 -0500
@@ -25,6 +25,9 @@
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.List;
import jdk.testlibrary.JcmdBase;
@@ -160,11 +163,11 @@
}
private static void verifyOutputAgainstFile(OutputAnalyzer output) throws IOException {
- File file = new File(TEST_SRC, "help_help.out");
- List<String> fileOutput = Utils.fileAsList(file);
+ Path path = Paths.get(TEST_SRC, "help_help.out");
+ List<String> fileOutput = Files.readAllLines(path);
List<String> outputAsLines = output.asLines();
assertTrue(outputAsLines.containsAll(fileOutput),
- "The ouput should contain all content of " + file.getAbsolutePath());
+ "The ouput should contain all content of " + path.toAbsolutePath());
}
}
--- a/jdk/test/sun/tools/jps/JpsHelper.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/sun/tools/jps/JpsHelper.java Tue Jan 27 13:58:55 2015 -0500
@@ -28,6 +28,9 @@
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -189,11 +192,11 @@
*/
public static void verifyOutputAgainstFile(OutputAnalyzer output) throws IOException {
String testSrc = System.getProperty("test.src", "?");
- File file = new File(testSrc, "usage.out");
- List<String> fileOutput = Utils.fileAsList(file);
+ Path path = Paths.get(testSrc, "usage.out");
+ List<String> fileOutput = Files.readAllLines(path);
List<String> outputAsLines = output.asLines();
assertTrue(outputAsLines.containsAll(fileOutput),
- "The ouput should contain all content of " + file.getAbsolutePath());
+ "The ouput should contain all content of " + path.toAbsolutePath());
}
private static File getManifest(String className) throws IOException {
--- a/jdk/test/tools/launcher/Arrrghs.java Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/tools/launcher/Arrrghs.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,12 +30,10 @@
* @run main/othervm Arrrghs
*/
-import java.io.BufferedReader;
+
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -48,9 +46,6 @@
private Arrrghs(){}
/**
* This class provides various tests for arguments processing.
- * A group of tests to ensure that arguments are passed correctly to
- * a child java process upon a re-exec, this typically happens when
- * a version other than the one being executed is requested by the user.
*
* History: these set of tests were part of Arrrghs.sh. The MKS shell
* implementations were notoriously buggy. Implementing these tests purely
@@ -58,12 +53,6 @@
*
*/
- // The version string to force a re-exec
- final static String VersionStr = "-version:1.1+";
-
- // The Cookie or the pattern we match in the debug output.
- final static String Cookie = "ReExec Args: ";
-
/*
* SIGH, On Windows all strings are quoted, we need to unwrap it
*/
@@ -78,122 +67,6 @@
return in;
}
- /*
- * This method detects the cookie in the output stream of the process.
- */
- private boolean detectCookie(InputStream istream,
- String expectedArguments) throws IOException {
- BufferedReader rd = new BufferedReader(new InputStreamReader(istream));
- boolean retval = false;
-
- String in = rd.readLine();
- while (in != null) {
- if (debug) System.out.println(in);
- if (in.startsWith(Cookie)) {
- String detectedArgument = removeExtraQuotes(in.substring(Cookie.length()));
- if (expectedArguments.equals(detectedArgument)) {
- retval = true;
- } else {
- System.out.println("Error: Expected Arguments\t:'" +
- expectedArguments + "'");
- System.out.println(" Detected Arguments\t:'" +
- detectedArgument + "'");
- }
- // Return the value asap if not in debug mode.
- if (!debug) {
- rd.close();
- istream.close();
- return retval;
- }
- }
- in = rd.readLine();
- }
- return retval;
- }
-
- private boolean doReExecTest0(ProcessBuilder pb, String expectedArguments) {
- boolean retval = false;
- try {
- pb.redirectErrorStream(true);
- Process p = pb.start();
- retval = detectCookie(p.getInputStream(), expectedArguments);
- p.waitFor();
- p.destroy();
- } catch (Exception ex) {
- ex.printStackTrace();
- throw new RuntimeException(ex.getMessage());
- }
- return retval;
- }
-
- /**
- * This method returns true if the expected and detected arguments are the same.
- * Quoting could cause dissimilar testArguments and expected arguments.
- */
- int doReExecTest(String testArguments, String expectedPattern) {
- ProcessBuilder pb = new ProcessBuilder(javaCmd,
- VersionStr, testArguments);
-
- Map<String, String> env = pb.environment();
- env.put(JLDEBUG_KEY, "true");
- return doReExecTest0(pb, testArguments) ? 0 : 1;
- }
-
- /**
- * A convenience method for identical test pattern and expected arguments
- */
- int doReExecTest(String testPattern) {
- return doReExecTest(testPattern, testPattern);
- }
-
- @Test
- void testQuoteParsingThroughReExec() {
- /*
- * Tests for 6214916
- * These tests require that a JVM (any JVM) be installed in the system registry.
- * If none is installed, skip this test.
- */
- TestResult tr = doExec(javaCmd, VersionStr, "-version");
- if (!tr.isOK()) {
- System.err.println("Warning:Argument Passing Tests were skipped, " +
- "no java found in system registry.");
- return;
- }
-
- // Basic test
- testExitValue += doReExecTest("-a -b -c -d");
-
- // Basic test with many spaces
- testExitValue += doReExecTest("-a -b -c -d");
-
- // Quoted whitespace does matter ?
- testExitValue += doReExecTest("-a \"\"-b -c\"\" -d");
-
-
- // Escaped quotes outside of quotes as literals
- testExitValue += doReExecTest("-a \\\"-b -c\\\" -d");
-
- // Check for escaped quotes inside of quotes as literal
- testExitValue += doReExecTest("-a \"-b \\\"stuff\\\"\" -c -d");
-
- // A quote preceeded by an odd number of slashes is a literal quote
- testExitValue += doReExecTest("-a -b\\\\\\\" -c -d");
-
- // A quote preceeded by an even number of slashes is a literal quote
- // see 6214916.
- testExitValue += doReExecTest("-a -b\\\\\\\\\" -c -d");
-
- // Make sure that whitespace doesn't interfere with the removal of the
- // appropriate tokens. (space-tab-space preceeds -jre-restict-search).
- testExitValue += doReExecTest("-a -b \t -jre-restrict-search -c -d", "-a -b -c -d");
-
- // Make sure that the mJRE tokens being stripped, aren't stripped if
- // they happen to appear as arguments to the main class.
- testExitValue += doReExecTest("foo -version:1.1+");
-
- System.out.println("Completed arguments quoting tests with "
- + testExitValue + " errors");
- }
// the pattern we hope to see in the output
static final Pattern ArgPattern = Pattern.compile("\\s*argv\\[[0-9]*\\].*=.*");
--- a/jdk/test/tools/launcher/MultipleJRE.sh Mon Jan 26 19:01:50 2015 +0300
+++ b/jdk/test/tools/launcher/MultipleJRE.sh Tue Jan 27 13:58:55 2015 -0500
@@ -90,36 +90,6 @@
}
#
-# Shell routine to ensure help page does not include mjre options
-#
-TestHelp() {
- mess="`$JAVA -help 2>&1`"
- # make sure it worked
- if [ $? -ne 0 ]; then
- echo "java -help failed ????"
- exit 1
- fi
-
- echo $mess | grep '\-version:<value>' > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- echo "help message contains obsolete option version:<value>"
- exit 1
- fi
-
- echo $mess | grep '\-jre-restrict-search' > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- echo "help message contains obsolete option jre-restrict-search"
- exit 1
- fi
-
- echo $mess | grep '\-no-jre-restrict-search' > /dev/null 2>&1
- if [ $? -eq 0 ]; then
- echo "help message contains obsolete option no-jre-restrict-search"
- exit 1
- fi
-}
-
-#
# Just as the name says. We sprinkle these in the appropriate location
# in the test file system and they just say who they are pretending to be.
#
@@ -461,33 +431,4 @@
LaunchVM "" "${RELEASE}"
fi
-#
-# Now test specification of mJRE
-#
-# In some cases this should result in failure of the command,
-# in some cases, a warning messages, with the command succeeding.
-#
-
- # Commandline use of "-version:" should fail
- # with a message containing "no longer supported"
- LaunchVM "-version:1.10+" "Error: Specifying an alternate JDK/JRE"
- LaunchVM "-version:prettymuchanything" "Error: Specifying an alternate JDK/JRE"
-
- # Commandline use of "-jre-restrict-search" should now fail
- LaunchVM "-jre-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid"
- # Commandline use of "-jre-no-restrict-search" should now fail
- LaunchVM "-jre-no-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid"
-
-
- # mJRE directives to use a specific version should be flagged
- # with a warning, but the jar should be executed with the
- # current jre
- CreateFullJar "junk request" ""
- LaunchVM "" "${RELEASE}"
- # Going to silently ignore JRE-Version setting in jar file manifest
- #LaunchVM "" "warning: The jarfile JRE-Version"
-
- # Verify help does not contain obsolete options
- TestHelp
-
exit 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/tools/launcher/MultipleJRERemoved.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8067437
+ * @summary Verify Multiple JRE version support has been removed.
+ * @build TestHelper
+ * @run main MultipleJRERemoved
+ */
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.*;
+import java.util.jar.Attributes;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+
+public class MultipleJRERemoved extends TestHelper {
+
+ public static final String VERSION_JAR = "version.jar";
+ public static final String PRINT_VERSION_CLASS = "PrintVersion";
+ private final File javaFile = new File(PRINT_VERSION_CLASS + ".java");
+ private final File clsFile = new File(PRINT_VERSION_CLASS + ".class");
+
+ private MultipleJRERemoved() {
+ }
+
+ /**
+ * @param args the command line arguments
+ * @throws java.io.FileNotFoundException
+ */
+ public static void main(String[] args) throws Exception {
+ MultipleJRERemoved a = new MultipleJRERemoved();
+ a.run(args);
+ }
+
+ /**
+ * Check all combinations of flags: "-version:", "-jre-restrict-search", "-jre-no-restrict-search". Test expects to see errors.
+ */
+ @Test
+ public void allFlagCombinations() throws IOException {
+ final Pattern newLine = Pattern.compile("\n");
+ createJar(Collections.emptyMap());
+
+ for (Flag flag1 : Flag.values()) {
+ for (Flag flag2 : Flag.values()) {
+ for (Flag flag3 : Flag.values()) {
+ List<Flag> flags = Stream.of(flag1, flag2, flag3)
+ .filter(f -> !Flag.EMPTY.equals(f))
+ .collect(Collectors.toList());
+
+ if (flags.size() == 0) continue;
+
+ List<String> flagValues = flags.stream()
+ .map(Flag::value)
+ .collect(Collectors.toList());
+
+ List<String> errorMessages = flags.stream()
+ .map(Flag::errorMessage)
+ .flatMap(newLine::splitAsStream)
+ .collect(Collectors.toList());
+
+ List<String> jarCmd = new ArrayList<>();
+ jarCmd.add(javaCmd);
+ jarCmd.addAll(flagValues);
+ jarCmd.add("-jar");
+ jarCmd.add("version.jar");
+
+ check(jarCmd, errorMessages);
+
+ List<String> cmd = new ArrayList<>();
+ cmd.add(javaCmd);
+ cmd.addAll(flagValues);
+ cmd.add(PRINT_VERSION_CLASS);
+
+ check(cmd, errorMessages);
+ }
+ }
+ }
+ }
+
+ private void check(List<String> cmd, List<String> errorMessages) {
+ TestResult tr = doExec(cmd.toArray(new String[cmd.size()]));
+ tr.checkNegative();
+ tr.isNotZeroOutput();
+ errorMessages.forEach(tr::contains);
+
+ if (!tr.testStatus) {
+ System.out.println(tr);
+ throw new RuntimeException("test case: failed\n" + cmd);
+ }
+ }
+
+ /**
+ * Verifies that java -help output doesn't contain information about "mJRE" flags.
+ */
+ @Test
+ public void javaHelp() {
+ TestResult tr = doExec(javaCmd, "-help");
+ tr.checkPositive();
+ tr.isNotZeroOutput();
+ tr.notContains("-version:<value>");
+ tr.notContains("-jre-restrict-search");
+ tr.notContains("-jre-no-restrict-search");
+ tr.notContains("-no-jre-restrict-search"); //it's not a typo in flag name.
+ if (!tr.testStatus) {
+ System.out.println(tr);
+ throw new RuntimeException("Failed. java -help output contains obsolete flags.\n");
+ }
+ }
+
+ /**
+ * Verifies that java -jar version.jar output ignores "mJRE" manifest directives.
+ */
+ @Test
+ public void manifestDirectives() throws IOException {
+ Map<String, String> manifest = new TreeMap<>();
+ manifest.put("JRE-Version", "1.8");
+ manifest.put("JRE-Restrict-Search", "1.8");
+ createJar(manifest);
+
+ TestResult tr = doExec(javaCmd, "-jar", VERSION_JAR);
+ tr.checkPositive();
+ tr.contains(System.getProperty("java.version"));
+ if (!tr.testStatus) {
+ System.out.println(tr);
+ throw new RuntimeException("Failed.\n");
+ }
+ }
+
+ private void emitFile() throws IOException {
+ List<String> scr = new ArrayList<>();
+ scr.add("public class PrintVersion {");
+ scr.add(" public static void main(String... args) {");
+ scr.add(" System.out.println(System.getProperty(\"java.version\"));");
+ scr.add(" }");
+ scr.add("}");
+ createFile(javaFile, scr);
+ compile(javaFile.getName());
+ }
+
+ private void createJar(Map<String, String> manifestAttributes) throws IOException {
+ emitFile();
+
+ Manifest manifest = new Manifest();
+ final Attributes mainAttributes = manifest.getMainAttributes();
+ mainAttributes.putValue("Manifest-Version", "1.0");
+ mainAttributes.putValue("Main-Class", PRINT_VERSION_CLASS);
+ manifestAttributes.forEach(mainAttributes::putValue);
+
+ try (JarOutputStream jar = new JarOutputStream(new FileOutputStream(VERSION_JAR), manifest)) {
+ jar.putNextEntry(new ZipEntry(PRINT_VERSION_CLASS + ".class"));
+ jar.write(Files.readAllBytes(clsFile.toPath()));
+ jar.closeEntry();
+ } finally {
+ javaFile.delete();
+ }
+ }
+
+ private enum Flag {
+ EMPTY("", ""),
+ VERSION("-version:1.9", "Error: Specifying an alternate JDK/JRE version is no longer supported.\n" +
+ "The use of the flag '-version:' is no longer valid.\n" +
+ "Please download and execute the appropriate version."),
+ JRE_RESTRICT_SEARCH("-jre-restrict-search", "Error: Specifying an alternate JDK/JRE is no longer supported.\n" +
+ "The related flags -jre-restrict-search | -jre-no-restrict-search are also no longer valid."),
+ JRE_NO_RESTRICT_SEARCH("-jre-no-restrict-search", "Error: Specifying an alternate JDK/JRE is no longer supported.\n" +
+ "The related flags -jre-restrict-search | -jre-no-restrict-search are also no longer valid.");
+ private final String flag;
+ private final String errorMessage;
+
+ Flag(String flag, String errorMessage) {
+ this.flag = flag;
+ this.errorMessage = errorMessage;
+ }
+
+ String value() {
+ return flag;
+ }
+
+ String errorMessage() {
+ return errorMessage;
+ }
+ }
+}
--- a/langtools/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -288,3 +288,5 @@
6a06008aec10d32898ca665685f531c681b28f5f jdk9-b43
de2ce70d907c9f227b802cea29285bece5194cd5 jdk9-b44
73bbdcf236b297a0c1b8875f2eeba65eaf7ade60 jdk9-b45
+e272d9be5f90edb6bb6b40f7816ec85eec0f5dc2 jdk9-b46
+230c139552501e612dd0d4423ac30f94c1201c0d jdk9-b47
--- a/langtools/make/Tools.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/make/Tools.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -40,6 +40,7 @@
ADD_JAVAC_FLAGS := -Xprefer:source, \
SRC := $(LANGTOOLS_TOPDIR)/make/tools, \
INCLUDES := compileproperties propertiesparser, \
+ COPY := .properties, \
BIN := $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes))
all: $(BUILD_TOOLS_LANGTOOLS)
--- a/langtools/make/gensrc/Gensrc-jdk.compiler.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/make/gensrc/Gensrc-jdk.compiler.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -25,19 +25,19 @@
include GensrcCommon.gmk
-$(eval $(call SetupVersionProperties,JAVAC_VERSION,\
+$(eval $(call SetupVersionProperties,JAVAC_VERSION, \
com/sun/tools/javac/resources/version.properties))
-$(eval $(call SetupVersionProperties,JAVAH_VERSION,\
+$(eval $(call SetupVersionProperties,JAVAH_VERSION, \
com/sun/tools/javah/resources/version.properties))
-$(eval $(call SetupVersionProperties,JAVAP_VERSION,\
+$(eval $(call SetupVersionProperties,JAVAP_VERSION, \
com/sun/tools/javap/resources/version.properties))
-$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES,\
+$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
$(JAVAC_VERSION) $(JAVAH_VERSION) $(JAVAP_VERSION)))
-$(eval $(call SetupParseProperties,PARSE_PROPERTIES,\
+$(eval $(call SetupParseProperties,PARSE_PROPERTIES, \
com/sun/tools/javac/resources/compiler.properties))
all: $(COMPILE_PROPERTIES) $(PARSE_PROPERTIES)
--- a/langtools/make/gensrc/GensrcCommon.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/make/gensrc/GensrcCommon.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -63,7 +63,8 @@
# Param 2 - Extra properties files to process
define SetupCompileProperties
# Lookup the properties that need to be compiled into resource bundles.
- PROPSOURCES := $2 $$(shell $(FIND) $(LANGTOOLS_TOPDIR)/src/$(MODULE)/share/classes -name "*.properties")
+ PROPSOURCES := $2 \
+ $$(shell $(FIND) $(LANGTOOLS_TOPDIR)/src/$(MODULE)/share/classes -name "*.properties")
# Convert .../src/<module>/share/classes/com/sun/tools/javac/resources/javac_zh_CN.properties
# to .../langtools/gensrc/<module>/com/sun/tools/javac/resources/javac_zh_CN.java
@@ -74,7 +75,7 @@
$$(patsubst %.properties, %.java, \
$$(subst /share/classes,, $$(PROPSOURCES))))
- # Generate the package dirs for the tobe generated java files. Sort to remove
+ # Generate the package dirs for the to be generated java files. Sort to remove
# duplicates.
PROPDIRS := $$(sort $$(dir $$(PROPJAVAS)))
@@ -88,8 +89,8 @@
# Now setup the rule for the generation of the resource bundles.
$(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/_the_props: $$(PROPSOURCES)
- $(FIND) $$(@D) -name "*.java" $(FIND_DELETE)
$(MKDIR) -p $$(@D) $$(PROPDIRS)
+ $(FIND) $$(@D) -name "*.java" -a ! -name "*Properties.java" $(FIND_DELETE)
$(ECHO) Compiling $$(words $$(PROPSOURCES)) properties into resource bundles for $(MODULE)
$(TOOL_COMPILEPROPS_CMD) $$(PROPCMDLINE)
$(TOUCH) $$@
@@ -102,11 +103,11 @@
# Param 1 - Variable to add targets to
# Param 2 - Extra properties files to process
define SetupParseProperties
- #property file to generate
- PARSEPROPSOURCES := $$(foreach var,$2,$$(addsuffix $$(var),$(LANGTOOLS_TOPDIR)/src/$(MODULE)/share/classes/))
+ # property files to process
+ PARSEPROPSOURCES := $$(addprefix $(LANGTOOLS_TOPDIR)/src/$(MODULE)/share/classes/, $2)
- PARSEPROPALLDIRS := $$(patsubst $(LANGTOOLS_TOPDIR)/src/%, \
- $(SUPPORT_OUTPUTDIR)/gensrc/%, \
+ PARSEPROPALLDIRS := $$(patsubst $(LANGTOOLS_TOPDIR)/src/$(MODULE)/share/classes/%, \
+ $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/%, \
$$(dir $$(PARSEPROPSOURCES)))
PARSEPROPDIRS := $$(sort $$(PARSEPROPALLDIRS))
@@ -114,11 +115,11 @@
PARSEPROPCMDLINE := $$(subst _SPACE_, $$(SPACE), \
$$(join $$(foreach var,$$(PARSEPROPSOURCES),$$(addprefix -compile_SPACE_,$$(var))), \
$$(addprefix _SPACE_, $$(PARSEPROPALLDIRS))))
-
+
# Now setup the rule for the generation of the resource bundles.
$(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/_the_parsed_props: $(PARSEPROPSOURCES)
- $(CP) -r $(LANGTOOLS_TOPDIR)/make/tools/propertiesparser/resources $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes/propertiesparser/resources
$(MKDIR) -p $$(@D) $$(PARSEPROPDIRS)
+ $(FIND) $$(@D) -name "*Properties.java" $(FIND_DELETE)
$(ECHO) Parsing $$(words $$(PARSEPROPSOURCES)) properties into enum-like class for $(MODULE)
$(TOOL_PARSEPROPS_CMD) $$(PARSEPROPCMDLINE)
$(TOUCH) $$@
--- a/langtools/make/tools/propertiesparser/gen/ClassGenerator.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/make/tools/propertiesparser/gen/ClassGenerator.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,3 +1,26 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please 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 propertiesparser.gen;
import propertiesparser.parser.Message;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/resources/doclint.properties Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/doclint/resources/doclint.properties Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
# questions.
#
-dc.anchor.already.defined = anchor already defined: {0}
+dc.anchor.already.defined = anchor already defined: "{0}"
dc.anchor.value.missing = no value given for anchor
dc.attr.lacks.value = attribute lacks value
dc.attr.not.number = attribute value is not a number
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -98,6 +98,7 @@
import com.sun.tools.javac.util.DefinedBy;
import com.sun.tools.javac.util.DefinedBy.Api;
import com.sun.tools.javac.util.JCDiagnostic;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
import com.sun.tools.javac.util.List;
import com.sun.tools.javac.util.ListBuffer;
import com.sun.tools.javac.util.Log;
@@ -924,12 +925,7 @@
try {
switch (kind) {
case ERROR:
- boolean prev = log.multipleErrors;
- try {
- log.error(pos, "proc.messager", msg.toString());
- } finally {
- log.multipleErrors = prev;
- }
+ log.error(DiagnosticFlag.MULTIPLE, pos, "proc.messager", msg.toString());
break;
case WARNING:
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Kinds.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Kinds.java Tue Jan 27 13:58:55 2015 -0500
@@ -74,8 +74,7 @@
WRONG_MTHS(Category.OVERLOAD, KindName.METHOD),
WRONG_MTH(Category.OVERLOAD, KindName.METHOD),
ABSENT_MTH(Category.OVERLOAD, KindName.METHOD),
- ABSENT_TYP(Category.OVERLOAD, KindName.CLASS),
- WRONG_STATICNESS(Category.OVERLOAD, KindName.METHOD);
+ ABSENT_TYP(Category.OVERLOAD, KindName.CLASS);
// There are essentially two "levels" to the Kind datatype.
// The first is a totally-ordered set of categories of
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java Tue Jan 27 13:58:55 2015 -0500
@@ -1175,6 +1175,16 @@
return v.visitClassSymbol(this, p);
}
+ public void markAbstractIfNeeded(Types types) {
+ if (types.enter.getEnv(this) != null &&
+ (flags() & ENUM) != 0 && types.supertype(type).tsym == types.syms.enumSym &&
+ (flags() & (FINAL | ABSTRACT)) == 0) {
+ if (types.firstUnimplementedAbstract(this) != null)
+ // add the ABSTRACT flag to an enum
+ flags_field |= ABSTRACT;
+ }
+ }
+
/**Resets the Symbol into the state good for next round of annotation processing.*/
public void reset() {
kind = TYP;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Tue Jan 27 13:58:55 2015 -0500
@@ -48,6 +48,7 @@
import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Kinds.Kind.*;
import static com.sun.tools.javac.code.Scope.*;
+import static com.sun.tools.javac.code.Scope.LookupKind.NON_RECURSIVE;
import static com.sun.tools.javac.code.Symbol.*;
import static com.sun.tools.javac.code.Type.*;
import static com.sun.tools.javac.code.TypeTag.*;
@@ -82,6 +83,7 @@
final JavacMessages messages;
final Names names;
final boolean allowObjectToPrimitiveCast;
+ final boolean allowDefaultMethods;
final Check chk;
final Enter enter;
JCDiagnostic.Factory diags;
@@ -105,6 +107,7 @@
names = Names.instance(context);
Source source = Source.instance(context);
allowObjectToPrimitiveCast = source.allowObjectToPrimitiveCast();
+ allowDefaultMethods = source.allowDefaultMethods();
chk = Check.instance(context);
enter = Enter.instance(context);
capturedName = names.fromString("<captured wildcard>");
@@ -805,13 +808,13 @@
return true;
}
- // Generally, if 's' is a type variable, recur on lower bound; but
+ // Generally, if 's' is a lower-bounded type variable, recur on lower bound; but
// for inference variables and intersections, we need to keep 's'
// (see JLS 4.10.2 for intersections and 18.2.3 for inference vars)
if (!t.hasTag(UNDETVAR) && !t.isCompound()) {
// TODO: JDK-8039198, bounds checking sometimes passes in a wildcard as s
Type lower = cvarLowerBound(wildLowerBound(s));
- if (s != lower)
+ if (s != lower && !lower.hasTag(BOT))
return isSubtype(capture ? capture(t) : t, lower, false);
}
@@ -2775,6 +2778,58 @@
// </editor-fold>
+ /** Return first abstract member of class `sym'.
+ */
+ public MethodSymbol firstUnimplementedAbstract(ClassSymbol sym) {
+ try {
+ return firstUnimplementedAbstractImpl(sym, sym);
+ } catch (CompletionFailure ex) {
+ chk.completionError(enter.getEnv(sym).tree.pos(), ex);
+ return null;
+ }
+ }
+ //where:
+ private MethodSymbol firstUnimplementedAbstractImpl(ClassSymbol impl, ClassSymbol c) {
+ MethodSymbol undef = null;
+ // Do not bother to search in classes that are not abstract,
+ // since they cannot have abstract members.
+ if (c == impl || (c.flags() & (ABSTRACT | INTERFACE)) != 0) {
+ Scope s = c.members();
+ for (Symbol sym : s.getSymbols(NON_RECURSIVE)) {
+ if (sym.kind == MTH &&
+ (sym.flags() & (ABSTRACT|IPROXY|DEFAULT)) == ABSTRACT) {
+ MethodSymbol absmeth = (MethodSymbol)sym;
+ MethodSymbol implmeth = absmeth.implementation(impl, this, true);
+ if (implmeth == null || implmeth == absmeth) {
+ //look for default implementations
+ if (allowDefaultMethods) {
+ MethodSymbol prov = interfaceCandidates(impl.type, absmeth).head;
+ if (prov != null && prov.overrides(absmeth, impl, this, true)) {
+ implmeth = prov;
+ }
+ }
+ }
+ if (implmeth == null || implmeth == absmeth) {
+ undef = absmeth;
+ break;
+ }
+ }
+ }
+ if (undef == null) {
+ Type st = supertype(c.type);
+ if (st.hasTag(CLASS))
+ undef = firstUnimplementedAbstractImpl(impl, (ClassSymbol)st.tsym);
+ }
+ for (List<Type> l = interfaces(c.type);
+ undef == null && l.nonEmpty();
+ l = l.tail) {
+ undef = firstUnimplementedAbstractImpl(impl, (ClassSymbol)l.head.tsym);
+ }
+ }
+ return undef;
+ }
+
+
//where
public List<MethodSymbol> interfaceCandidates(Type site, MethodSymbol ms) {
Filter<Symbol> filter = new MethodFilter(ms, site);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Tue Jan 27 13:58:55 2015 -0500
@@ -2640,8 +2640,7 @@
try {
refResult = rs.resolveMemberReference(localEnv, that, that.expr.type,
that.name, argtypes, typeargtypes, referenceCheck,
- resultInfo.checkContext.inferenceContext(),
- resultInfo.checkContext.deferredAttrContext().mode);
+ resultInfo.checkContext.inferenceContext(), rs.basicReferenceChooser);
} finally {
resultInfo.checkContext.inferenceContext().rollback(saved_undet);
}
@@ -2659,9 +2658,8 @@
case WRONG_MTHS:
case AMBIGUOUS:
case HIDDEN:
+ case MISSING_ENCL:
case STATICERR:
- case MISSING_ENCL:
- case WRONG_STATICNESS:
targetError = true;
break;
default:
@@ -2722,15 +2720,6 @@
return;
}
- if (that.sym.isStatic() && !TreeInfo.isStaticSelector(that.expr, names) &&
- !that.kind.isUnbound()) {
- //no static bound mrefs
- log.error(that.expr.pos(), "invalid.mref", Kinds.kindName(that.getMode()),
- diags.fragment("static.bound.mref"));
- result = that.type = types.createErrorType(currentTarget);
- return;
- }
-
if (!refSym.isStatic() && that.kind == JCMemberReference.ReferenceKind.SUPER) {
// Check that super-qualified symbols are not abstract (JLS)
rs.checkNonAbstract(that.pos(), that.sym);
@@ -2794,7 +2783,8 @@
@SuppressWarnings("fallthrough")
void checkReferenceCompatible(JCMemberReference tree, Type descriptor, Type refType, CheckContext checkContext, boolean speculativeAttr) {
- Type returnType = checkContext.inferenceContext().asUndetVar(descriptor.getReturnType());
+ InferenceContext inferenceContext = checkContext.inferenceContext();
+ Type returnType = inferenceContext.asUndetVar(descriptor.getReturnType());
Type resType;
switch (tree.getMode()) {
@@ -2823,10 +2813,20 @@
if (incompatibleReturnType != null) {
checkContext.report(tree, diags.fragment("incompatible.ret.type.in.mref",
diags.fragment("inconvertible.types", resType, descriptor.getReturnType())));
+ } else {
+ if (inferenceContext.free(refType)) {
+ // we need to wait for inference to finish and then replace inference vars in the referent type
+ inferenceContext.addFreeTypeListener(List.of(refType),
+ instantiatedContext -> {
+ tree.referentType = instantiatedContext.asInstType(refType);
+ });
+ } else {
+ tree.referentType = refType;
+ }
}
if (!speculativeAttr) {
- List<Type> thrownTypes = checkContext.inferenceContext().asUndetVars(descriptor.getThrownTypes());
+ List<Type> thrownTypes = inferenceContext.asUndetVars(descriptor.getThrownTypes());
if (chk.unhandled(refType.getThrownTypes(), thrownTypes).nonEmpty()) {
log.error(tree, "incompatible.thrown.types.in.mref", refType.getThrownTypes());
}
@@ -4199,6 +4199,8 @@
chk.validate(tree.implementing, env);
}
+ c.markAbstractIfNeeded(types);
+
// If this is a non-abstract class, check that it has no abstract
// methods or unimplemented methods of an implemented interface.
if ((c.flags() & (ABSTRACT | INTERFACE)) == 0) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -898,7 +898,7 @@
Type argtype = owntype.getParameterTypes().last();
if (!types.isReifiable(argtype) &&
(!allowSimplifiedVarargs ||
- sym.attribute(syms.trustMeType.tsym) == null ||
+ sym.baseSymbol().attribute(syms.trustMeType.tsym) == null ||
!isTrustMeAllowedOnMethod(sym))) {
warnUnchecked(env.tree.pos(),
"unchecked.generic.array.creation",
@@ -2019,69 +2019,15 @@
* @param c The class.
*/
void checkAllDefined(DiagnosticPosition pos, ClassSymbol c) {
- try {
- MethodSymbol undef = firstUndef(c, c);
- if (undef != null) {
- if ((c.flags() & ENUM) != 0 &&
- types.supertype(c.type).tsym == syms.enumSym &&
- (c.flags() & FINAL) == 0) {
- // add the ABSTRACT flag to an enum
- c.flags_field |= ABSTRACT;
- } else {
- MethodSymbol undef1 =
- new MethodSymbol(undef.flags(), undef.name,
- types.memberType(c.type, undef), undef.owner);
- log.error(pos, "does.not.override.abstract",
- c, undef1, undef1.location());
- }
- }
- } catch (CompletionFailure ex) {
- completionError(pos, ex);
+ MethodSymbol undef = types.firstUnimplementedAbstract(c);
+ if (undef != null) {
+ MethodSymbol undef1 =
+ new MethodSymbol(undef.flags(), undef.name,
+ types.memberType(c.type, undef), undef.owner);
+ log.error(pos, "does.not.override.abstract",
+ c, undef1, undef1.location());
}
}
-//where
- /** Return first abstract member of class `c' that is not defined
- * in `impl', null if there is none.
- */
- private MethodSymbol firstUndef(ClassSymbol impl, ClassSymbol c) {
- MethodSymbol undef = null;
- // Do not bother to search in classes that are not abstract,
- // since they cannot have abstract members.
- if (c == impl || (c.flags() & (ABSTRACT | INTERFACE)) != 0) {
- Scope s = c.members();
- for (Symbol sym : s.getSymbols(NON_RECURSIVE)) {
- if (sym.kind == MTH &&
- (sym.flags() & (ABSTRACT|IPROXY|DEFAULT)) == ABSTRACT) {
- MethodSymbol absmeth = (MethodSymbol)sym;
- MethodSymbol implmeth = absmeth.implementation(impl, types, true);
- if (implmeth == null || implmeth == absmeth) {
- //look for default implementations
- if (allowDefaultMethods) {
- MethodSymbol prov = types.interfaceCandidates(impl.type, absmeth).head;
- if (prov != null && prov.overrides(absmeth, impl, types, true)) {
- implmeth = prov;
- }
- }
- }
- if (implmeth == null || implmeth == absmeth) {
- undef = absmeth;
- break;
- }
- }
- }
- if (undef == null) {
- Type st = types.supertype(c.type);
- if (st.hasTag(CLASS))
- undef = firstUndef(impl, (ClassSymbol)st.tsym);
- }
- for (List<Type> l = types.interfaces(c.type);
- undef == null && l.nonEmpty();
- l = l.tail) {
- undef = firstUndef(impl, (ClassSymbol)l.head.tsym);
- }
- }
- return undef;
- }
void checkNonCyclicDecl(JCClassDecl tree) {
CycleChecker cc = new CycleChecker();
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Tue Jan 27 13:58:55 2015 -0500
@@ -27,6 +27,9 @@
import com.sun.source.tree.LambdaExpressionTree.BodyKind;
import com.sun.tools.javac.code.*;
+import com.sun.tools.javac.comp.Resolve.ResolveError;
+import com.sun.tools.javac.resources.CompilerProperties;
+import com.sun.tools.javac.resources.CompilerProperties.Fragments;
import com.sun.tools.javac.tree.*;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.DefinedBy.Api;
@@ -37,6 +40,7 @@
import com.sun.tools.javac.comp.Infer.InferenceContext;
import com.sun.tools.javac.comp.Resolve.MethodResolutionPhase;
import com.sun.tools.javac.tree.JCTree.*;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
import com.sun.tools.javac.util.Log.DeferredDiagnosticHandler;
import java.util.ArrayList;
@@ -786,16 +790,22 @@
JCMemberReference mref2 = new TreeCopier<Void>(make).copy(tree);
mref2.expr = exprTree;
Symbol lookupSym =
- rs.resolveMemberReferenceByArity(localEnv, mref2, exprTree.type,
- tree.name, argtypes.toList(), inferenceContext);
+ rs.resolveMemberReference(localEnv, mref2, exprTree.type,
+ tree.name, argtypes.toList(), List.nil(), rs.arityMethodCheck,
+ inferenceContext, rs.structuralReferenceChooser).fst;
switch (lookupSym.kind) {
- //note: as argtypes are erroneous types, type-errors must
- //have been caused by arity mismatch
- case ABSENT_MTH:
case WRONG_MTH:
case WRONG_MTHS:
- case WRONG_STATICNESS:
- checkContext.report(tree, diags.fragment("incompatible.arg.types.in.mref"));
+ //note: as argtypes are erroneous types, type-errors must
+ //have been caused by arity mismatch
+ checkContext.report(tree, diags.fragment(Fragments.IncompatibleArgTypesInMref));
+ break;
+ case ABSENT_MTH:
+ case STATICERR:
+ //if no method found, or method found with wrong staticness, report better message
+ checkContext.report(tree, ((ResolveError)lookupSym).getDiagnostic(DiagnosticType.FRAGMENT,
+ tree, exprTree.type.tsym, exprTree.type, tree.name, argtypes.toList(), List.nil()));
+ break;
}
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Enter.java Tue Jan 27 13:58:55 2015 -0500
@@ -385,7 +385,7 @@
typeEnvs.put(c, localEnv);
// Fill out class fields.
- c.completer = typeEnter;
+ c.completer = null; // do not allow the initial completer linger on.
c.flags_field = chk.checkFlags(tree.pos(), tree.mods.flags, c, tree);
c.sourcefile = env.toplevel.sourcefile;
c.members_field = WriteableScope.create(c);
@@ -409,6 +409,9 @@
// Enter type parameters.
ct.typarams_field = classEnter(tree.typarams, localEnv);
+ // install further completer for this type.
+ c.completer = typeEnter;
+
// Add non-local class to uncompleted, to make sure it will be
// completed later.
if (!c.isLocal() && uncompleted != null) uncompleted.append(c);
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java Tue Jan 27 13:58:55 2015 -0500
@@ -263,7 +263,7 @@
@Override
public void visitLambda(JCLambda tree) {
LambdaTranslationContext localContext = (LambdaTranslationContext)context;
- MethodSymbol sym = (MethodSymbol)localContext.translatedSym;
+ MethodSymbol sym = localContext.translatedSym;
MethodType lambdaType = (MethodType) sym.type;
{
@@ -875,11 +875,9 @@
*/
private JCExpression expressionInvoke(VarSymbol rcvr) {
JCExpression qualifier =
- tree.sym.isStatic() ?
- make.Type(tree.sym.owner.type) :
- (rcvr != null) ?
- makeReceiver(rcvr) :
- tree.getQualifierExpression();
+ (rcvr != null) ?
+ makeReceiver(rcvr) :
+ tree.getQualifierExpression();
//create the qualifier expression
JCFieldAccess select = make.Select(qualifier, tree.sym.name);
@@ -891,7 +889,9 @@
convertArgs(tree.sym, args.toList(), tree.varargsElement)).
setType(tree.sym.erasure(types).getReturnType());
- apply = transTypes.coerce(apply, localContext.generatedRefSig().getReturnType());
+ apply = transTypes.coerce(attrEnv, apply,
+ types.erasure(localContext.tree.referentType.getReturnType()));
+
setVarargsIfNeeded(apply, tree.varargsElement);
return apply;
}
@@ -1755,7 +1755,7 @@
Map<LambdaSymbolKind, Map<Symbol, Symbol>> translatedSymbols;
/** the synthetic symbol for the method hoisting the translated lambda */
- Symbol translatedSym;
+ MethodSymbol translatedSym;
List<JCVariableDecl> syntheticParams;
@@ -1997,6 +1997,7 @@
//compute synthetic params
ListBuffer<JCVariableDecl> params = new ListBuffer<>();
+ ListBuffer<VarSymbol> parameterSymbols = new ListBuffer<>();
// The signature of the method is augmented with the following
// synthetic parameters:
@@ -2005,19 +2006,16 @@
// 2) enclosing locals captured by the lambda expression
for (Symbol thisSym : getSymbolMap(CAPTURED_VAR).values()) {
params.append(make.VarDef((VarSymbol) thisSym, null));
- }
- if (methodReferenceReceiver != null) {
- params.append(make.VarDef(
- make.Modifiers(PARAMETER|FINAL),
- names.fromString("$rcvr$"),
- make.Type(methodReferenceReceiver.type),
- null));
+ parameterSymbols.append((VarSymbol) thisSym);
}
for (Symbol thisSym : getSymbolMap(PARAM).values()) {
params.append(make.VarDef((VarSymbol) thisSym, null));
+ parameterSymbols.append((VarSymbol) thisSym);
}
syntheticParams = params.toList();
+ translatedSym.params = parameterSymbols.toList();
+
// Compute and set the lambda name
translatedSym.name = isSerializable()
? serializedLambdaName()
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/MemberEnter.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/MemberEnter.java Tue Jan 27 13:58:55 2015 -0500
@@ -227,7 +227,7 @@
annotate.annotateTypeLater(tree, localEnv, m, tree.pos());
if (tree.defaultValue != null)
- annotateDefaultValueLater(tree.defaultValue, localEnv, m);
+ annotateDefaultValueLater(tree.defaultValue, localEnv, m, tree.pos());
}
/** Create a fresh environment for method bodies.
@@ -438,7 +438,8 @@
/** Queue processing of an attribute default value. */
void annotateDefaultValueLater(final JCExpression defaultValue,
final Env<AttrContext> localEnv,
- final MethodSymbol m) {
+ final MethodSymbol m,
+ final DiagnosticPosition deferPos) {
annotate.normal(new Annotate.Worker() {
@Override
public String toString() {
@@ -449,9 +450,11 @@
@Override
public void run() {
JavaFileObject prev = log.useSource(localEnv.toplevel.sourcefile);
+ DiagnosticPosition prevLintPos = deferredLintHandler.setPos(deferPos);
try {
enterDefaultValue(defaultValue, localEnv, m);
} finally {
+ deferredLintHandler.setPos(prevLintPos);
log.useSource(prev);
}
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Tue Jan 27 13:58:55 2015 -0500
@@ -25,7 +25,6 @@
package com.sun.tools.javac.comp;
-import com.sun.source.tree.MemberReferenceTree.ReferenceMode;
import com.sun.tools.javac.api.Formattable.LocalizedString;
import com.sun.tools.javac.code.*;
import com.sun.tools.javac.code.Scope.WriteableScope;
@@ -40,6 +39,7 @@
import com.sun.tools.javac.comp.Infer.FreeTypeListener;
import com.sun.tools.javac.comp.Resolve.MethodResolutionContext.Candidate;
import com.sun.tools.javac.comp.Resolve.MethodResolutionDiagHelper.Template;
+import com.sun.tools.javac.comp.Resolve.ReferenceLookupResult.StaticKind;
import com.sun.tools.javac.jvm.*;
import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.tree.*;
@@ -65,6 +65,7 @@
import static com.sun.tools.javac.code.Flags.*;
import static com.sun.tools.javac.code.Flags.BLOCK;
+import static com.sun.tools.javac.code.Flags.STATIC;
import static com.sun.tools.javac.code.Kinds.*;
import static com.sun.tools.javac.code.Kinds.Kind.*;
import static com.sun.tools.javac.code.TypeTag.*;
@@ -105,15 +106,10 @@
context.put(resolveKey, this);
syms = Symtab.instance(context);
- varNotFound = new
- SymbolNotFoundError(ABSENT_VAR);
- methodNotFound = new
- SymbolNotFoundError(ABSENT_MTH);
- methodWithCorrectStaticnessNotFound = new
- SymbolNotFoundError(WRONG_STATICNESS,
- "method found has incorrect staticness");
- typeNotFound = new
- SymbolNotFoundError(ABSENT_TYP);
+ varNotFound = new SymbolNotFoundError(ABSENT_VAR);
+ methodNotFound = new SymbolNotFoundError(ABSENT_MTH);
+ typeNotFound = new SymbolNotFoundError(ABSENT_TYP);
+ referenceNotFound = new ReferenceLookupResult(methodNotFound, null);
names = Names.instance(context);
log = Log.instance(context);
@@ -145,9 +141,11 @@
*/
private final SymbolNotFoundError varNotFound;
private final SymbolNotFoundError methodNotFound;
- private final SymbolNotFoundError methodWithCorrectStaticnessNotFound;
private final SymbolNotFoundError typeNotFound;
+ /** empty reference lookup result */
+ private final ReferenceLookupResult referenceNotFound;
+
public static Resolve instance(Context context) {
Resolve instance = context.get(resolveKey);
if (instance == null)
@@ -2680,69 +2678,16 @@
List<Type> argtypes,
List<Type> typeargtypes,
MethodResolutionPhase maxPhase) {
- ReferenceLookupHelper result;
if (!name.equals(names.init)) {
//method reference
- result =
- new MethodReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase);
+ return new MethodReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase);
+ } else if (site.hasTag(ARRAY)) {
+ //array constructor reference
+ return new ArrayConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, maxPhase);
} else {
- if (site.hasTag(ARRAY)) {
- //array constructor reference
- result =
- new ArrayConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, maxPhase);
- } else {
- //class constructor reference
- result =
- new ConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, maxPhase);
- }
+ //class constructor reference
+ return new ConstructorReferenceLookupHelper(referenceTree, site, argtypes, typeargtypes, maxPhase);
}
- return result;
- }
-
- Symbol resolveMemberReferenceByArity(Env<AttrContext> env,
- JCMemberReference referenceTree,
- Type site,
- Name name,
- List<Type> argtypes,
- InferenceContext inferenceContext) {
-
- boolean isStaticSelector = TreeInfo.isStaticSelector(referenceTree.expr, names);
- site = types.capture(site);
-
- ReferenceLookupHelper boundLookupHelper = makeReferenceLookupHelper(
- referenceTree, site, name, argtypes, null, VARARITY);
- //step 1 - bound lookup
- Env<AttrContext> boundEnv = env.dup(env.tree, env.info.dup());
- Symbol boundSym = lookupMethod(boundEnv, env.tree.pos(), site.tsym,
- arityMethodCheck, boundLookupHelper);
- if (isStaticSelector &&
- !name.equals(names.init) &&
- !boundSym.isStatic() &&
- !boundSym.kind.isOverloadError()) {
- boundSym = methodNotFound;
- }
-
- //step 2 - unbound lookup
- Symbol unboundSym = methodNotFound;
- ReferenceLookupHelper unboundLookupHelper = null;
- Env<AttrContext> unboundEnv = env.dup(env.tree, env.info.dup());
- if (isStaticSelector) {
- unboundLookupHelper = boundLookupHelper.unboundLookup(inferenceContext);
- unboundSym = lookupMethod(unboundEnv, env.tree.pos(), site.tsym,
- arityMethodCheck, unboundLookupHelper);
- if (unboundSym.isStatic() &&
- !unboundSym.kind.isOverloadError()) {
- unboundSym = methodNotFound;
- }
- }
-
- //merge results
- Symbol bestSym = choose(boundSym, unboundSym);
- env.info.pendingResolutionPhase = bestSym == unboundSym ?
- unboundEnv.info.pendingResolutionPhase :
- boundEnv.info.pendingResolutionPhase;
-
- return bestSym;
}
/**
@@ -2763,8 +2708,8 @@
* the receiver argument type is used to infer an instantiation for the raw
* qualifier type.
*
- * When a multi-step resolution process is exploited, it is an error
- * if two candidates are found (ambiguity).
+ * When a multi-step resolution process is exploited, the process of picking
+ * the resulting symbol is delegated to an helper class {@link com.sun.tools.javac.comp.Resolve.ReferenceChooser}.
*
* This routine returns a pair (T,S), where S is the member reference symbol,
* and T is the type of the class in which S is defined. This is necessary as
@@ -2779,7 +2724,7 @@
List<Type> typeargtypes,
MethodCheck methodCheck,
InferenceContext inferenceContext,
- AttrMode mode) {
+ ReferenceChooser referenceChooser) {
site = types.capture(site);
ReferenceLookupHelper boundLookupHelper = makeReferenceLookupHelper(
@@ -2787,102 +2732,29 @@
//step 1 - bound lookup
Env<AttrContext> boundEnv = env.dup(env.tree, env.info.dup());
- Symbol origBoundSym;
- boolean staticErrorForBound = false;
MethodResolutionContext boundSearchResolveContext = new MethodResolutionContext();
boundSearchResolveContext.methodCheck = methodCheck;
- Symbol boundSym = origBoundSym = lookupMethod(boundEnv, env.tree.pos(),
+ Symbol boundSym = lookupMethod(boundEnv, env.tree.pos(),
site.tsym, boundSearchResolveContext, boundLookupHelper);
- SearchResultKind boundSearchResultKind = SearchResultKind.NOT_APPLICABLE_MATCH;
- boolean isStaticSelector = TreeInfo.isStaticSelector(referenceTree.expr, names);
- boolean shouldCheckForStaticness = isStaticSelector &&
- referenceTree.getMode() == ReferenceMode.INVOKE;
- if (boundSym.kind != WRONG_MTHS && boundSym.kind != WRONG_MTH) {
- if (shouldCheckForStaticness) {
- if (!boundSym.isStatic()) {
- staticErrorForBound = true;
- if (hasAnotherApplicableMethod(
- boundSearchResolveContext, boundSym, true)) {
- boundSearchResultKind = SearchResultKind.BAD_MATCH_MORE_SPECIFIC;
- } else {
- boundSearchResultKind = SearchResultKind.BAD_MATCH;
- if (!boundSym.kind.isOverloadError()) {
- boundSym = methodWithCorrectStaticnessNotFound;
- }
- }
- } else if (!boundSym.kind.isOverloadError()) {
- boundSearchResultKind = SearchResultKind.GOOD_MATCH;
- }
- }
- }
+ ReferenceLookupResult boundRes = new ReferenceLookupResult(boundSym, boundSearchResolveContext);
//step 2 - unbound lookup
- Symbol origUnboundSym = null;
Symbol unboundSym = methodNotFound;
- ReferenceLookupHelper unboundLookupHelper = null;
Env<AttrContext> unboundEnv = env.dup(env.tree, env.info.dup());
- SearchResultKind unboundSearchResultKind = SearchResultKind.NOT_APPLICABLE_MATCH;
- boolean staticErrorForUnbound = false;
- if (isStaticSelector) {
- unboundLookupHelper = boundLookupHelper.unboundLookup(inferenceContext);
+ ReferenceLookupHelper unboundLookupHelper = boundLookupHelper.unboundLookup(inferenceContext);
+ ReferenceLookupResult unboundRes = referenceNotFound;
+ if (unboundLookupHelper != null) {
MethodResolutionContext unboundSearchResolveContext =
new MethodResolutionContext();
unboundSearchResolveContext.methodCheck = methodCheck;
- unboundSym = origUnboundSym = lookupMethod(unboundEnv, env.tree.pos(),
+ unboundSym = lookupMethod(unboundEnv, env.tree.pos(),
site.tsym, unboundSearchResolveContext, unboundLookupHelper);
-
- if (unboundSym.kind != WRONG_MTH && unboundSym.kind != WRONG_MTHS) {
- if (shouldCheckForStaticness) {
- if (unboundSym.isStatic()) {
- staticErrorForUnbound = true;
- if (hasAnotherApplicableMethod(
- unboundSearchResolveContext, unboundSym, false)) {
- unboundSearchResultKind = SearchResultKind.BAD_MATCH_MORE_SPECIFIC;
- } else {
- unboundSearchResultKind = SearchResultKind.BAD_MATCH;
- if (!unboundSym.kind.isOverloadError()) {
- unboundSym = methodWithCorrectStaticnessNotFound;
- }
- }
- } else if (!unboundSym.kind.isOverloadError()) {
- unboundSearchResultKind = SearchResultKind.GOOD_MATCH;
- }
- }
- }
+ unboundRes = new ReferenceLookupResult(unboundSym, unboundSearchResolveContext);
}
//merge results
Pair<Symbol, ReferenceLookupHelper> res;
- Symbol bestSym = choose(boundSym, unboundSym);
- if (!bestSym.kind.isOverloadError() &&
- (staticErrorForBound || staticErrorForUnbound)) {
- if (staticErrorForBound) {
- boundSym = methodWithCorrectStaticnessNotFound;
- }
- if (staticErrorForUnbound) {
- unboundSym = methodWithCorrectStaticnessNotFound;
- }
- bestSym = choose(boundSym, unboundSym);
- }
- if (bestSym == methodWithCorrectStaticnessNotFound && mode == AttrMode.CHECK) {
- Symbol symToPrint = origBoundSym;
- String errorFragmentToPrint = "non-static.cant.be.ref";
- if (staticErrorForBound && staticErrorForUnbound) {
- if (unboundSearchResultKind == SearchResultKind.BAD_MATCH_MORE_SPECIFIC) {
- symToPrint = origUnboundSym;
- errorFragmentToPrint = "static.method.in.unbound.lookup";
- }
- } else {
- if (!staticErrorForBound) {
- symToPrint = origUnboundSym;
- errorFragmentToPrint = "static.method.in.unbound.lookup";
- }
- }
- log.error(referenceTree.expr.pos(), "invalid.mref",
- Kinds.kindName(referenceTree.getMode()),
- diags.fragment(errorFragmentToPrint,
- Kinds.kindName(symToPrint), symToPrint));
- }
+ Symbol bestSym = referenceChooser.result(boundRes, unboundRes);
res = new Pair<>(bestSym,
bestSym == unboundSym ? unboundLookupHelper : boundLookupHelper);
env.info.pendingResolutionPhase = bestSym == unboundSym ?
@@ -2892,67 +2764,213 @@
return res;
}
- enum SearchResultKind {
- GOOD_MATCH, //type I
- BAD_MATCH_MORE_SPECIFIC, //type II
- BAD_MATCH, //type III
- NOT_APPLICABLE_MATCH //type IV
- }
-
- boolean hasAnotherApplicableMethod(MethodResolutionContext resolutionContext,
- Symbol bestSoFar, boolean staticMth) {
- for (Candidate c : resolutionContext.candidates) {
- if (resolutionContext.step != c.step ||
- !c.isApplicable() ||
- c.sym == bestSoFar) {
- continue;
- } else {
- if (c.sym.isStatic() == staticMth) {
- return true;
+ /**
+ * This class is used to represent a method reference lookup result. It keeps track of two
+ * things: (i) the symbol found during a method reference lookup and (ii) the static kind
+ * of the lookup (see {@link com.sun.tools.javac.comp.Resolve.ReferenceLookupResult.StaticKind}).
+ */
+ static class ReferenceLookupResult {
+
+ /**
+ * Static kind associated with a method reference lookup. Erroneous lookups end up with
+ * the UNDEFINED kind; successful lookups will end up with either STATIC, NON_STATIC,
+ * depending on whether all applicable candidates are static or non-static methods,
+ * respectively. If a successful lookup has both static and non-static applicable methods,
+ * its kind is set to BOTH.
+ */
+ enum StaticKind {
+ STATIC,
+ NON_STATIC,
+ BOTH,
+ UNDEFINED;
+
+ /**
+ * Retrieve the static kind associated with a given (method) symbol.
+ */
+ static StaticKind from(Symbol s) {
+ return s.isStatic() ?
+ STATIC : NON_STATIC;
+ }
+
+ /**
+ * Merge two static kinds together.
+ */
+ static StaticKind reduce(StaticKind sk1, StaticKind sk2) {
+ if (sk1 == UNDEFINED) {
+ return sk2;
+ } else if (sk2 == UNDEFINED) {
+ return sk1;
+ } else {
+ return sk1 == sk2 ? sk1 : BOTH;
}
}
}
- return false;
- }
-
- //where
- private Symbol choose(Symbol boundSym, Symbol unboundSym) {
- if (lookupSuccess(boundSym) && lookupSuccess(unboundSym)) {
- return ambiguityError(boundSym, unboundSym);
- } else if (lookupSuccess(boundSym) ||
- (canIgnore(unboundSym) && !canIgnore(boundSym))) {
- return boundSym;
- } else if (lookupSuccess(unboundSym) ||
- (canIgnore(boundSym) && !canIgnore(unboundSym))) {
- return unboundSym;
- } else {
- return boundSym;
+
+ /** The static kind. */
+ StaticKind staticKind;
+
+ /** The lookup result. */
+ Symbol sym;
+
+ ReferenceLookupResult(Symbol sym, MethodResolutionContext resolutionContext) {
+ this.staticKind = staticKind(sym, resolutionContext);
+ this.sym = sym;
+ }
+
+ private StaticKind staticKind(Symbol sym, MethodResolutionContext resolutionContext) {
+ switch (sym.kind) {
+ case MTH:
+ case AMBIGUOUS:
+ return resolutionContext.candidates.stream()
+ .filter(c -> c.isApplicable() && c.step == resolutionContext.step)
+ .map(c -> StaticKind.from(c.sym))
+ .reduce(StaticKind::reduce)
+ .orElse(StaticKind.UNDEFINED);
+ case HIDDEN:
+ return StaticKind.from(((AccessError)sym).sym);
+ default:
+ return StaticKind.UNDEFINED;
}
}
- private boolean lookupSuccess(Symbol s) {
- return s.kind == MTH || s.kind == AMBIGUOUS;
+ /**
+ * Does this result corresponds to a successful lookup (i.e. one where a method has been found?)
+ */
+ boolean isSuccess() {
+ return staticKind != StaticKind.UNDEFINED;
}
- private boolean canIgnore(Symbol s) {
- switch (s.kind) {
+ /**
+ * Does this result have given static kind?
+ */
+ boolean hasKind(StaticKind sk) {
+ return this.staticKind == sk;
+ }
+
+ /**
+ * Error recovery helper: can this lookup result be ignored (for the purpose of returning
+ * some 'better' result) ?
+ */
+ boolean canIgnore() {
+ switch (sym.kind) {
case ABSENT_MTH:
return true;
case WRONG_MTH:
InapplicableSymbolError errSym =
- (InapplicableSymbolError)s.baseSymbol();
+ (InapplicableSymbolError)sym.baseSymbol();
return new Template(MethodCheckDiag.ARITY_MISMATCH.regex())
.matches(errSym.errCandidate().snd);
case WRONG_MTHS:
InapplicableSymbolsError errSyms =
- (InapplicableSymbolsError)s.baseSymbol();
+ (InapplicableSymbolsError)sym.baseSymbol();
return errSyms.filterCandidates(errSyms.mapCandidates()).isEmpty();
- case WRONG_STATICNESS:
- return false;
default:
return false;
}
}
+ }
+
+ /**
+ * This abstract class embodies the logic that converts one (bound lookup) or two (unbound lookup)
+ * {@code ReferenceLookupResult} objects into a (@code Symbol), which is then regarded as the
+ * result of method reference resolution.
+ */
+ abstract class ReferenceChooser {
+ /**
+ * Generate a result from a pair of lookup result objects. This method delegates to the
+ * appropriate result generation routine.
+ */
+ Symbol result(ReferenceLookupResult boundRes, ReferenceLookupResult unboundRes) {
+ return unboundRes != referenceNotFound ?
+ unboundResult(boundRes, unboundRes) :
+ boundResult(boundRes);
+ }
+
+ /**
+ * Generate a symbol from a given bound lookup result.
+ */
+ abstract Symbol boundResult(ReferenceLookupResult boundRes);
+
+ /**
+ * Generate a symbol from a pair of bound/unbound lookup results.
+ */
+ abstract Symbol unboundResult(ReferenceLookupResult boundRes, ReferenceLookupResult unboundRes);
+ }
+
+ /**
+ * This chooser implements the selection strategy used during a full lookup; this logic
+ * is described in JLS SE 8 (15.3.2).
+ */
+ ReferenceChooser basicReferenceChooser = new ReferenceChooser() {
+
+ @Override
+ Symbol boundResult(ReferenceLookupResult boundRes) {
+ return !boundRes.isSuccess() || boundRes.hasKind(StaticKind.NON_STATIC) ?
+ boundRes.sym : //the search produces a non-static method
+ new BadMethodReferenceError(boundRes.sym, false);
+ }
+
+ @Override
+ Symbol unboundResult(ReferenceLookupResult boundRes, ReferenceLookupResult unboundRes) {
+ if (boundRes.hasKind(StaticKind.STATIC) &&
+ (!unboundRes.isSuccess() || unboundRes.hasKind(StaticKind.STATIC))) {
+ //the first search produces a static method and no non-static method is applicable
+ //during the second search
+ return boundRes.sym;
+ } else if (unboundRes.hasKind(StaticKind.NON_STATIC) &&
+ (!boundRes.isSuccess() || boundRes.hasKind(StaticKind.NON_STATIC))) {
+ //the second search produces a non-static method and no static method is applicable
+ //during the first search
+ return unboundRes.sym;
+ } else if (boundRes.isSuccess() && unboundRes.isSuccess()) {
+ //both searches produce some result; ambiguity (error recovery)
+ return ambiguityError(boundRes.sym, unboundRes.sym);
+ } else if (boundRes.isSuccess() || unboundRes.isSuccess()) {
+ //Both searches failed to produce a result with correct staticness (i.e. first search
+ //produces an non-static method). Alternatively, a given search produced a result
+ //with the right staticness, but the other search has applicable methods with wrong
+ //staticness (error recovery)
+ return new BadMethodReferenceError(boundRes.isSuccess() ? boundRes.sym : unboundRes.sym, true);
+ } else {
+ //both searches fail to produce a result - pick 'better' error using heuristics (error recovery)
+ return (boundRes.canIgnore() && !unboundRes.canIgnore()) ?
+ unboundRes.sym : boundRes.sym;
+ }
+ }
+ };
+
+ /**
+ * This chooser implements the selection strategy used during an arity-based lookup; this logic
+ * is described in JLS SE 8 (15.12.2.1).
+ */
+ ReferenceChooser structuralReferenceChooser = new ReferenceChooser() {
+
+ @Override
+ Symbol boundResult(ReferenceLookupResult boundRes) {
+ return (!boundRes.isSuccess() || !boundRes.hasKind(StaticKind.STATIC)) ?
+ boundRes.sym : //the search has at least one applicable non-static method
+ new BadMethodReferenceError(boundRes.sym, false);
+ }
+
+ @Override
+ Symbol unboundResult(ReferenceLookupResult boundRes, ReferenceLookupResult unboundRes) {
+ if (boundRes.isSuccess() && !boundRes.hasKind(StaticKind.NON_STATIC)) {
+ //the first serach has at least one applicable static method
+ return boundRes.sym;
+ } else if (unboundRes.isSuccess() && !unboundRes.hasKind(StaticKind.STATIC)) {
+ //the second search has at least one applicable non-static method
+ return unboundRes.sym;
+ } else if (boundRes.isSuccess() || unboundRes.isSuccess()) {
+ //either the first search produces a non-static method, or second search produces
+ //a non-static method (error recovery)
+ return new BadMethodReferenceError(boundRes.isSuccess() ? boundRes.sym : unboundRes.sym, true);
+ } else {
+ //both searches fail to produce a result - pick 'better' error using heuristics (error recovery)
+ return (boundRes.canIgnore() && !unboundRes.canIgnore()) ?
+ unboundRes.sym : boundRes.sym;
+ }
+ }
+ };
/**
* Helper for defining custom method-like lookup logic; a lookup helper
@@ -3070,22 +3088,7 @@
* method returns an dummy lookup helper.
*/
ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {
- //dummy loopkup helper that always return 'methodNotFound'
- return new ReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase) {
- @Override
- ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {
- return this;
- }
- @Override
- Symbol lookup(Env<AttrContext> env, MethodResolutionPhase phase) {
- return methodNotFound;
- }
- @Override
- ReferenceKind referenceKind(Symbol sym) {
- Assert.error();
- return null;
- }
- };
+ return null;
}
/**
@@ -3124,12 +3127,31 @@
@Override
ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {
- if (TreeInfo.isStaticSelector(referenceTree.expr, names) &&
- argtypes.nonEmpty() &&
- (argtypes.head.hasTag(NONE) ||
- types.isSubtypeUnchecked(inferenceContext.asUndetVar(argtypes.head), site))) {
- return new UnboundMethodReferenceLookupHelper(referenceTree, name,
- site, argtypes, typeargtypes, maxPhase);
+ if (TreeInfo.isStaticSelector(referenceTree.expr, names)) {
+ if (argtypes.nonEmpty() &&
+ (argtypes.head.hasTag(NONE) ||
+ types.isSubtypeUnchecked(inferenceContext.asUndetVar(argtypes.head), site))) {
+ return new UnboundMethodReferenceLookupHelper(referenceTree, name,
+ site, argtypes, typeargtypes, maxPhase);
+ } else {
+ return new ReferenceLookupHelper(referenceTree, name, site, argtypes, typeargtypes, maxPhase) {
+ @Override
+ ReferenceLookupHelper unboundLookup(InferenceContext inferenceContext) {
+ return this;
+ }
+
+ @Override
+ Symbol lookup(Env<AttrContext> env, MethodResolutionPhase phase) {
+ return methodNotFound;
+ }
+
+ @Override
+ ReferenceKind referenceKind(Symbol sym) {
+ Assert.error();
+ return null;
+ }
+ };
+ }
} else {
return super.unboundLookup(inferenceContext);
}
@@ -3231,16 +3253,10 @@
findDiamond(env, site, argtypes, typeargtypes, phase.isBoxingRequired(), phase.isVarargsRequired()) :
findMethod(env, site, name, argtypes, typeargtypes,
phase.isBoxingRequired(), phase.isVarargsRequired(), syms.operatorNames.contains(name));
- return sym.kind != MTH ||
- site.getEnclosingType().hasTag(NONE) ||
- hasEnclosingInstance(env, site) ?
- sym : new InvalidSymbolError(MISSING_ENCL, sym, null) {
- @Override
- JCDiagnostic getDiagnostic(DiagnosticType dkind, DiagnosticPosition pos, Symbol location, Type site, Name name, List<Type> argtypes, List<Type> typeargtypes) {
- return diags.create(dkind, log.currentSource(), pos,
- "cant.access.inner.cls.constr", site.tsym.name, argtypes, site.getEnclosingType());
- }
- };
+ return (sym.kind != MTH ||
+ site.getEnclosingType().hasTag(NONE) ||
+ hasEnclosingInstance(env, site)) ?
+ sym : new BadConstructorReferenceError(sym);
}
@Override
@@ -3613,8 +3629,7 @@
hasLocation = !location.name.equals(names._this) &&
!location.name.equals(names._super);
}
- boolean isConstructor = (kind == ABSENT_MTH || kind == WRONG_STATICNESS) &&
- name == names.init;
+ boolean isConstructor = name == names.init;
KindName kindname = isConstructor ? KindName.CONSTRUCTOR : kind.absentKind();
Name idname = isConstructor ? site.tsym.name : name;
String errKey = getErrorKey(kindname, typeargtypes.nonEmpty(), hasLocation);
@@ -4019,13 +4034,13 @@
Name sname = s1.name;
if (sname == names.init) sname = s1.owner.name;
return diags.create(dkind, log.currentSource(),
- pos, "ref.ambiguous", sname,
- kindName(s1),
- s1,
- s1.location(site, types),
- kindName(s2),
- s2,
- s2.location(site, types));
+ pos, "ref.ambiguous", sname,
+ kindName(s1),
+ s1,
+ s1.location(site, types),
+ kindName(s2),
+ s2,
+ s2.location(site, types));
}
/**
@@ -4108,6 +4123,52 @@
}
/**
+ * BadMethodReferenceError error class indicating that a method reference symbol has been found,
+ * but with the wrong staticness.
+ */
+ class BadMethodReferenceError extends StaticError {
+
+ boolean unboundLookup;
+
+ public BadMethodReferenceError(Symbol sym, boolean unboundLookup) {
+ super(sym);
+ this.unboundLookup = unboundLookup;
+ }
+
+ @Override
+ JCDiagnostic getDiagnostic(DiagnosticType dkind, DiagnosticPosition pos, Symbol location, Type site, Name name, List<Type> argtypes, List<Type> typeargtypes) {
+ final String key;
+ if (!unboundLookup) {
+ key = "bad.static.method.in.bound.lookup";
+ } else if (sym.isStatic()) {
+ key = "bad.static.method.in.unbound.lookup";
+ } else {
+ key = "bad.instance.method.in.unbound.lookup";
+ }
+ return sym.kind.isOverloadError() ?
+ ((ResolveError)sym).getDiagnostic(dkind, pos, location, site, name, argtypes, typeargtypes) :
+ diags.create(dkind, log.currentSource(), pos, key, Kinds.kindName(sym), sym);
+ }
+ }
+
+ /**
+ * BadConstructorReferenceError error class indicating that a constructor reference symbol has been found,
+ * but pointing to a class for which an enclosing instance is not available.
+ */
+ class BadConstructorReferenceError extends InvalidSymbolError {
+
+ public BadConstructorReferenceError(Symbol sym) {
+ super(MISSING_ENCL, sym, "BadConstructorReferenceError");
+ }
+
+ @Override
+ JCDiagnostic getDiagnostic(DiagnosticType dkind, DiagnosticPosition pos, Symbol location, Type site, Name name, List<Type> argtypes, List<Type> typeargtypes) {
+ return diags.create(dkind, log.currentSource(), pos,
+ "cant.access.inner.cls.constr", site.tsym.name, argtypes, site.getEnclosingType());
+ }
+ }
+
+ /**
* Helper class for method resolution diagnostic simplification.
* Certain resolution diagnostic are rewritten as simpler diagnostic
* where the enclosing resolution diagnostic (i.e. 'inapplicable method')
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Tue Jan 27 13:58:55 2015 -0500
@@ -1000,6 +1000,7 @@
l.nonEmpty();
l = l.tail) {
ClassSymbol inner = l.head;
+ inner.markAbstractIfNeeded(types);
char flags = (char) adjustFlags(inner.flags_field);
if ((flags & INTERFACE) != 0) flags |= ABSTRACT; // Interfaces are always ABSTRACT
if (inner.name.isEmpty()) flags &= ~FINAL; // Anonymous class: unset FINAL flag
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/parser/JavacParser.java Tue Jan 27 13:58:55 2015 -0500
@@ -85,7 +85,7 @@
private Names names;
/** End position mappings container */
- private final AbstractEndPosTable endPosTable;
+ protected final AbstractEndPosTable endPosTable;
// Because of javac's limited lookahead, some contexts are ambiguous in
// the presence of type annotations even though they are not ambiguous
@@ -1209,15 +1209,7 @@
if (annos.nonEmpty()) {
t = toP(F.at(pos).AnnotatedType(annos, t));
}
- // .class is only allowed if there were no annotations
- JCExpression nt = bracketsSuffix(t);
- if (nt != t && (annos.nonEmpty() || TreeInfo.containsTypeAnnotation(t))) {
- // t and nt are different if bracketsSuffix parsed a .class.
- // The check for nonEmpty covers the case when the whole array is annotated.
- // Helper method isAnnotated looks for annos deeply within t.
- syntaxError("no.annotations.on.dot.class");
- }
- t = nt;
+ t = bracketsSuffix(t);
} else {
if ((mode & EXPR) != 0) {
mode = EXPR;
@@ -1956,6 +1948,12 @@
}
t = F.at(pos).Erroneous(List.<JCTree>of(toP(F.at(pos).Select(t, name))));
} else {
+ Tag tag = t.getTag();
+ // Type annotations are illegal on class literals. Annotated non array class literals
+ // are complained about directly in term3(), Here check for type annotations on dimensions
+ // taking care to handle some interior dimension(s) being annotated.
+ if ((tag == TYPEARRAY && TreeInfo.containsTypeAnnotation(t)) || tag == ANNOTATED_TYPE)
+ syntaxError("no.annotations.on.dot.class");
t = toP(F.at(pos).Select(t, names._class));
}
} else if ((mode & TYPE) != 0) {
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacMessager.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/processing/JavacMessager.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -28,6 +28,7 @@
import com.sun.tools.javac.model.JavacElements;
import com.sun.tools.javac.util.*;
import com.sun.tools.javac.util.DefinedBy.Api;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.JCTree.*;
import javax.lang.model.element.*;
@@ -113,13 +114,7 @@
switch (kind) {
case ERROR:
errorCount++;
- boolean prev = log.multipleErrors;
- log.multipleErrors = true;
- try {
- log.error(pos, "proc.messager", msg.toString());
- } finally {
- log.multipleErrors = prev;
- }
+ log.error(DiagnosticFlag.MULTIPLE, pos, "proc.messager", msg.toString());
break;
case WARNING:
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties Tue Jan 27 13:58:55 2015 -0500
@@ -262,9 +262,6 @@
compiler.misc.static.mref.with.targs=\
parameterized qualifier on static method reference
-compiler.misc.static.bound.mref=\
- static bound method reference
-
# 0: symbol
compiler.err.cant.assign.val.to.final.var=\
cannot assign a value to final variable {0}
@@ -2050,12 +2047,16 @@
non-static {0} {1} cannot be referenced from a static context
# 0: symbol kind, 1: symbol
-compiler.misc.non-static.cant.be.ref=\
- non-static {0} {1} cannot be referenced from a static context
+compiler.misc.bad.static.method.in.unbound.lookup=\
+ unexpected static {0} {1} found in unbound lookup
# 0: symbol kind, 1: symbol
-compiler.misc.static.method.in.unbound.lookup=\
- static {0} {1} found in unbound lookup
+compiler.misc.bad.instance.method.in.unbound.lookup=\
+ unexpected instance {0} {1} found in unbound lookup
+
+# 0: symbol kind, 1: symbol
+compiler.misc.bad.static.method.in.bound.lookup=\
+ unexpected static {0} {1} found in bound lookup
## Both arguments ({0}, {1}) are "kindname"s. {0} is a comma-separated list
## of kindnames (the list should be identical to that provided in source.
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/tree/JCTree.java Tue Jan 27 13:58:55 2015 -0500
@@ -2101,6 +2101,7 @@
public PolyKind refPolyKind;
public boolean ownerAccessible;
public OverloadKind overloadKind;
+ public Type referentType;
public enum OverloadKind {
OVERLOADED,
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -112,7 +112,7 @@
*/
public JCDiagnostic error(
DiagnosticFlag flag, DiagnosticSource source, DiagnosticPosition pos, Error errorKey) {
- JCDiagnostic diag = create(null, defaultErrorFlags, source, pos, errorKey);
+ JCDiagnostic diag = create(null, EnumSet.copyOf(defaultErrorFlags), source, pos, errorKey);
if (flag != null) {
diag.setFlag(flag);
}
@@ -432,7 +432,10 @@
SYNTAX,
RECOVERABLE,
NON_DEFERRABLE,
- COMPRESSED
+ COMPRESSED,
+ /** Print multiple errors for same source locations.
+ */
+ MULTIPLE;
}
private final DiagnosticSource source;
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/List.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/List.java Tue Jan 27 13:58:55 2015 -0500
@@ -33,6 +33,7 @@
import java.util.AbstractCollection;
import java.util.ListIterator;
import java.util.NoSuchElementException;
+import java.util.stream.Collector;
/** A class for generic linked lists. Links are supposed to be
* immutable, the only exception being the incremental construction of
@@ -537,4 +538,14 @@
return Collections.unmodifiableList(a);
}
+
+ /**
+ * Collect elements into a new list (using a @code{ListBuffer})
+ */
+ public static <Z> Collector<Z, ListBuffer<Z>, List<Z>> collector() {
+ return Collector.of(ListBuffer::new,
+ (buf, el)->buf.add(el),
+ (buf1, buf2)-> { buf1.addAll(buf2); return buf1; },
+ buf->buf.toList());
+ }
}
--- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/util/Log.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -38,6 +38,7 @@
import com.sun.tools.javac.main.Main;
import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.tree.EndPosTable;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticType;
@@ -191,10 +192,6 @@
*/
public boolean dumpOnError;
- /** Print multiple errors for same source locations.
- */
- public boolean multipleErrors;
-
/**
* Diagnostic listener, if provided through programmatic
* interface to javac (JSR 199).
@@ -417,7 +414,7 @@
* source name and pos.
*/
protected boolean shouldReport(JavaFileObject file, int pos) {
- if (multipleErrors || file == null)
+ if (file == null)
return true;
Pair<JavaFileObject,Integer> coords = new Pair<>(file, pos);
@@ -580,8 +577,9 @@
break;
case ERROR:
- if (nerrors < MaxErrors
- && shouldReport(diagnostic.getSource(), diagnostic.getIntPosition())) {
+ if (nerrors < MaxErrors &&
+ (diagnostic.isFlagSet(DiagnosticFlag.MULTIPLE) ||
+ shouldReport(diagnostic.getSource(), diagnostic.getIntPosition()))) {
writeDiagnostic(diagnostic);
nerrors++;
}
--- a/langtools/test/tools/doclint/AnchorTest.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/AnchorTest.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,4 +1,4 @@
-AnchorTest.java:19: error: anchor already defined: foo
+AnchorTest.java:19: error: anchor already defined: "foo"
* <a name=foo></a>
^
AnchorTest.java:24: error: invalid name for anchor: ""
@@ -10,28 +10,40 @@
AnchorTest.java:34: error: no value given for anchor
* <a name ></a>
^
-AnchorTest.java:46: error: anchor already defined: foo
+AnchorTest.java:46: error: anchor already defined: "foo"
* <a id=foo></a>
^
AnchorTest.java:51: error: invalid name for anchor: ""
* <a id=></a>
^
+AnchorTest.java:51: error: anchor already defined: ""
+ * <a id=></a>
+ ^
AnchorTest.java:56: error: invalid name for anchor: "123"
* <a id=123 ></a>
^
+AnchorTest.java:56: error: anchor already defined: "123"
+ * <a id=123 ></a>
+ ^
AnchorTest.java:61: error: no value given for anchor
* <a id ></a>
^
-AnchorTest.java:73: error: anchor already defined: foo
+AnchorTest.java:73: error: anchor already defined: "foo"
* <p id=foo>text</p>
^
AnchorTest.java:78: error: invalid name for anchor: ""
* <p id=>text</p>
^
+AnchorTest.java:78: error: anchor already defined: ""
+ * <p id=>text</p>
+ ^
AnchorTest.java:83: error: invalid name for anchor: "123"
* <p id=123 >text</p>
^
+AnchorTest.java:83: error: anchor already defined: "123"
+ * <p id=123 >text</p>
+ ^
AnchorTest.java:88: error: no value given for anchor
* <p id >text</p>
^
-12 errors
+16 errors
--- a/langtools/test/tools/doclint/AnchorTest2.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/AnchorTest2.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,4 +1,4 @@
-AnchorTest2.java:15: error: anchor already defined: AnchorTest2
+AnchorTest2.java:15: error: anchor already defined: "AnchorTest2"
/** <a name="AnchorTest2"> </a> */
^
1 error
--- a/langtools/test/tools/doclint/HtmlTagsTest.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/HtmlTagsTest.out Tue Jan 27 13:58:55 2015 -0500
@@ -13,6 +13,9 @@
HtmlTagsTest.java:28: error: element not allowed in documentation comments: <html>
* <html>
^
+HtmlTagsTest.java:28: error: element not closed: html
+ * <html>
+ ^
HtmlTagsTest.java:33: error: block element not allowed within inline element <span>: p
* <span> <p> </span>
^
@@ -40,5 +43,5 @@
HtmlTagsTest.java:64: error: tag not allowed here: <b>
* <ul> <b>text</b> <li> ... </li> </ul>
^
-13 errors
-1 warning
+14 errors
+1 warning
\ No newline at end of file
--- a/langtools/test/tools/doclint/anchorTests/p/Test.javac.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.javac.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,7 +1,7 @@
-Test.java:14:7: compiler.err.proc.messager: anchor already defined: dupTest
-Test.java:24:12: compiler.err.proc.messager: anchor already defined: dupTestField
-Test.java:27:12: compiler.err.proc.messager: anchor already defined: dupTestMethod
-Test.java:32:11: compiler.err.proc.messager: anchor already defined: dupNested
-Test.java:40:15: compiler.err.proc.messager: anchor already defined: dupNestedField
-Test.java:47:15: compiler.err.proc.messager: anchor already defined: dupNestedMethod
+Test.java:14:7: compiler.err.proc.messager: anchor already defined: "dupTest"
+Test.java:24:12: compiler.err.proc.messager: anchor already defined: "dupTestField"
+Test.java:27:12: compiler.err.proc.messager: anchor already defined: "dupTestMethod"
+Test.java:32:11: compiler.err.proc.messager: anchor already defined: "dupNested"
+Test.java:40:15: compiler.err.proc.messager: anchor already defined: "dupNestedField"
+Test.java:47:15: compiler.err.proc.messager: anchor already defined: "dupNestedMethod"
6 errors
--- a/langtools/test/tools/doclint/anchorTests/p/Test.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/anchorTests/p/Test.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,19 +1,19 @@
-Test.java:14: error: anchor already defined: dupTest
+Test.java:14: error: anchor already defined: "dupTest"
* <a name="dupTest">dupTest again</a>
^
-Test.java:24: error: anchor already defined: dupTestField
+Test.java:24: error: anchor already defined: "dupTestField"
/** <a name="dupTestField">dupTestField again</a> */
^
-Test.java:27: error: anchor already defined: dupTestMethod
+Test.java:27: error: anchor already defined: "dupTestMethod"
/** <a name="dupTestMethod">dupTestMethod again</a> */
^
-Test.java:32: error: anchor already defined: dupNested
+Test.java:32: error: anchor already defined: "dupNested"
* <a name="dupNested">dupNested again</a>
^
-Test.java:40: error: anchor already defined: dupNestedField
+Test.java:40: error: anchor already defined: "dupNestedField"
* <a name="dupNestedField">dupNestedField</a>
^
-Test.java:47: error: anchor already defined: dupNestedMethod
+Test.java:47: error: anchor already defined: "dupNestedMethod"
* <a name="dupNestedMethod">dupNestedMethod</a>
^
6 errors
--- a/langtools/test/tools/doclint/anchorTests/p/package-info.javac.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.javac.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,2 +1,2 @@
-package-info.java:12:7: compiler.err.proc.messager: anchor already defined: here
+package-info.java:12:7: compiler.err.proc.messager: anchor already defined: "here"
1 error
--- a/langtools/test/tools/doclint/anchorTests/p/package-info.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/anchorTests/p/package-info.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,4 +1,4 @@
-package-info.java:12: error: anchor already defined: here
+package-info.java:12: error: anchor already defined: "here"
* <a name=here>here again</a>
^
1 error
--- a/langtools/test/tools/doclint/tidy/AnchorAlreadyDefined.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/doclint/tidy/AnchorAlreadyDefined.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,7 +1,7 @@
-AnchorAlreadyDefined.java:14: error: anchor already defined: here
+AnchorAlreadyDefined.java:14: error: anchor already defined: "here"
* <a name="here">duplicate</a>
^
-AnchorAlreadyDefined.java:15: error: anchor already defined: here
+AnchorAlreadyDefined.java:15: error: anchor already defined: "here"
* <h1 id="here">duplicate</h1>
^
2 errors
--- a/langtools/test/tools/javac/6304921/TestLog.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/6304921/TestLog.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,10 +26,11 @@
* @bug 6304912
* @summary unit test for Log
*/
+import java.lang.reflect.Field;
import java.io.InputStream;
-import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
+import java.util.Set;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import com.sun.tools.javac.file.JavacFileManager;
@@ -41,23 +42,34 @@
import com.sun.tools.javac.util.Context;
import com.sun.tools.javac.util.Log;
import com.sun.tools.javac.util.JCDiagnostic;
+import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag;
+import com.sun.tools.javac.util.JCDiagnostic.Factory;
import com.sun.tools.javac.util.Options;
public class TestLog
{
- public static void main(String... args) throws IOException {
+ public static void main(String... args) throws Exception {
test(false);
test(true);
}
- static void test(boolean genEndPos) throws IOException {
+ static void test(boolean genEndPos) throws Exception {
Context context = new Context();
Options options = Options.instance(context);
options.put("diags", "%b:%s/%o/%e:%_%t%m|%p%m");
Log log = Log.instance(context);
- log.multipleErrors = true;
+ Factory diagnosticFactory = JCDiagnostic.Factory.instance(context);
+ Field defaultErrorFlagsField =
+ JCDiagnostic.Factory.class.getDeclaredField("defaultErrorFlags");
+
+ defaultErrorFlagsField.setAccessible(true);
+
+ Set<DiagnosticFlag> defaultErrorFlags =
+ (Set<DiagnosticFlag>) defaultErrorFlagsField.get(diagnosticFactory);
+
+ defaultErrorFlags.add(DiagnosticFlag.MULTIPLE);
JavacFileManager.preRegister(context);
ParserFactory pfac = ParserFactory.instance(context);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/8052070/DuplicateTypeParameter.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,15 @@
+/*
+ * @test /nodynamiccopyright/
+ * @bug 8052070
+ * @summary javac crashes when there are duplicated type parameters
+ * @compile/fail/ref=DuplicateTypeParameter.out -XDrawDiagnostics DuplicateTypeParameter.java
+ */
+
+public class DuplicateTypeParameter<T, T, A> {
+ class Inner <P, P, Q> {}
+ public void foo() {
+ class Local <M, M, N> {};
+ }
+}
+
+class Secondary<D, D, E> {}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/8052070/DuplicateTypeParameter.out Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,5 @@
+DuplicateTypeParameter.java:8:40: compiler.err.already.defined: kindname.type.variable, T, kindname.class, DuplicateTypeParameter
+DuplicateTypeParameter.java:9:21: compiler.err.already.defined: kindname.type.variable, P, kindname.class, DuplicateTypeParameter.Inner
+DuplicateTypeParameter.java:15:20: compiler.err.already.defined: kindname.type.variable, D, kindname.class, Secondary
+DuplicateTypeParameter.java:11:25: compiler.err.already.defined: kindname.type.variable, M, kindname.class, Local
+4 errors
--- a/langtools/test/tools/javac/MethodParameters/ClassFileVisitor.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/MethodParameters/ClassFileVisitor.java Tue Jan 27 13:58:55 2015 -0500
@@ -147,6 +147,7 @@
public int mAttrs;
public int mNumParams;
public boolean mSynthetic;
+ public boolean mIsLambda;
public boolean mIsConstructor;
public boolean mIsClinit;
public boolean mIsBridge;
@@ -165,6 +166,7 @@
mIsClinit = mName.equals("<clinit>");
prefix = cname + "." + mName + "() - ";
mIsBridge = method.access_flags.is(AccessFlags.ACC_BRIDGE);
+ mIsLambda = mSynthetic && mName.startsWith("lambda$");
if (mIsClinit) {
sb = new StringBuilder(); // Discard output
@@ -225,7 +227,7 @@
// IMPL: Whether MethodParameters attributes will be generated
// for some synthetics is unresolved. For now, assume no.
- if (mSynthetic) {
+ if (mSynthetic && !mIsLambda) {
warn(prefix + "synthetic has MethodParameter attribute");
}
@@ -349,10 +351,12 @@
} else if (isEnum && mNumParams == 1 && index == 0 && mName.equals("valueOf")) {
expect = "name";
allowMandated = true;
- } else if (mIsBridge) {
+ } else if (mIsBridge || mIsLambda) {
allowSynthetic = true;
/* you can't expect an special name for bridges' parameters.
- * The name of the original parameters are now copied.
+ * The name of the original parameters are now copied. Likewise
+ * for a method encoding the lambda expression, names are derived
+ * from source lambda's parameters and captured enclosing locals.
*/
expect = null;
}
--- a/langtools/test/tools/javac/MethodParameters/LambdaTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/MethodParameters/LambdaTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 8006582
+ * @bug 8006582 8037546
* @summary javac should generate method parameters correctly.
* @build Tester
* @compile -parameters LambdaTest.java
@@ -31,8 +31,8 @@
*/
/**
- * Parameter names are not recorded for lambdas. This test verifies
- * that there are no MethodParameters attribute for lambdas.
+ * Post https://bugs.openjdk.java.net/browse/JDK-8037546, this test verifies
+ * that MethodParameters attribute for lambdas are emitted properly.
*/
class LambdaTest {
--- a/langtools/test/tools/javac/MethodParameters/LambdaTest.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/MethodParameters/LambdaTest.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,7 +1,7 @@
class LambdaTest --
LambdaTest.<init>()
LambdaTest.foo(i)
-LambdaTest.lambda$static$1(arg0)/*synthetic*/
-LambdaTest.lambda$null$0(arg0, arg1)/*synthetic*/
+LambdaTest.lambda$static$1(x1/*synthetic*/)/*synthetic*/
+LambdaTest.lambda$null$0(final cap$0/*synthetic*/, x2/*synthetic*/)/*synthetic*/
static interface LambdaTest$I -- inner
LambdaTest$I.m(x)
--- a/langtools/test/tools/javac/MethodParameters/ReflectionVisitor.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/MethodParameters/ReflectionVisitor.java Tue Jan 27 13:58:55 2015 -0500
@@ -277,7 +277,7 @@
param = "final " + param;
}
sb.append(sep).append(param);
- if (!m.isBridge() && !expect.equals(param)) {
+ if (!m.isBridge() && !m.getName().startsWith("lambda$") && !expect.equals(param)) {
error(prefix + "param[" + i + "]='"
+ param + "' expected '" + expect + "'");
break;
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/AnnotatedClassExpr.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/AnnotatedClassExpr.java Tue Jan 27 13:58:55 2015 -0500
@@ -1,6 +1,6 @@
/*
* @test /nodynamiccopyright/
- * @bug 8027262
+ * @bug 8027262 8027888
* @summary A class expression cannot be annotated.
* @compile/fail/ref=AnnotatedClassExpr.out -XDrawDiagnostics AnnotatedClassExpr.java
*/
@@ -10,6 +10,12 @@
class AnnotatedClassExpr {
static void main() {
Object o1 = @A int.class;
+ o1 = @A int [] . class;
+ o1 = int @A [] . class;
+ o1 = int [] @A [] . class;
+ o1 = AnnotatedClassExpr @A [] .class;
+ o1 = @A AnnotatedClassExpr @A [] .class;
+ o1 = @A AnnotatedClassExpr.class;
}
}
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/AnnotatedClassExpr.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/AnnotatedClassExpr.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,2 +1,8 @@
AnnotatedClassExpr.java:12:29: compiler.err.no.annotations.on.dot.class
-1 error
+AnnotatedClassExpr.java:13:27: compiler.err.no.annotations.on.dot.class
+AnnotatedClassExpr.java:14:27: compiler.err.no.annotations.on.dot.class
+AnnotatedClassExpr.java:15:30: compiler.err.no.annotations.on.dot.class
+AnnotatedClassExpr.java:16:41: compiler.err.no.annotations.on.dot.class
+AnnotatedClassExpr.java:17:44: compiler.err.no.annotations.on.dot.class
+AnnotatedClassExpr.java:18:37: compiler.err.no.annotations.on.dot.class
+7 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/classfiles/InnerClasses/T8068517.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/** @test
+ * @bug 8034854
+ * @summary Verify that nested enums have correct abstract flag in the InnerClasses attribute.
+ * @library /tools/lib
+ * @build ToolBox T8068517
+ * @run main T8068517
+ */
+
+import com.sun.tools.javac.util.Assert;
+import java.util.Arrays;
+import javax.tools.JavaFileManager;
+import javax.tools.StandardLocation;
+import javax.tools.ToolProvider;
+
+public class T8068517 {
+
+ public static void main(String[] args) throws Exception {
+ new T8068517().run();
+ }
+
+ void run() throws Exception {
+ runTest("class A {\n" +
+ " enum AInner implements Runnable {\n" +
+ " A {\n" +
+ " public void run() {}\n" +
+ " };\n" +
+ " }\n" +
+ "}\n",
+ "class B {\n" +
+ " A.AInner a;\n" +
+ "}");
+ runTest("class A {\n" +
+ " enum AInner implements Runnable {\n" +
+ " A {\n" +
+ " public void run() {}\n" +
+ " };\n" +
+ " }\n" +
+ " AInner aInner;\n" +
+ "}\n",
+ "class B {\n" +
+ " void test(A a) {;\n" +
+ " switch (a.aInner) {\n" +
+ " case A: break;\n" +
+ " }\n" +
+ " };\n" +
+ "}");
+ runTest("class A {\n" +
+ " enum AInner implements Runnable {\n" +
+ " A {\n" +
+ " public void run() {}\n" +
+ " };\n" +
+ " }\n" +
+ " AInner aInner;\n" +
+ "}\n",
+ "class B {\n" +
+ " void test(A a) {;\n" +
+ " System.err.println(a.aInner.toString());\n" +
+ " };\n" +
+ "}");
+ runTest("class A {\n" +
+ " enum AInner implements Runnable {\n" +
+ " A {\n" +
+ " public void run() {}\n" +
+ " };\n" +
+ " }\n" +
+ " AInner aInner() {\n" +
+ " return null;\n" +
+ " }\n" +
+ "}\n",
+ "class B {\n" +
+ " void test(A a) {;\n" +
+ " System.err.println(a.aInner().toString());\n" +
+ " };\n" +
+ "}");
+ }
+
+ void runTest(String aJava, String bJava) throws Exception {
+ try (JavaFileManager fm = ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null)) {
+ ToolBox tb = new ToolBox();
+ ToolBox.MemoryFileManager memoryFM1 = new ToolBox.MemoryFileManager(fm);
+ tb.new JavacTask().fileManager(memoryFM1)
+ .sources(aJava, bJava)
+ .run();
+ ToolBox.MemoryFileManager memoryFM2 = new ToolBox.MemoryFileManager(fm);
+ tb.new JavacTask().fileManager(memoryFM2)
+ .sources(bJava, aJava)
+ .run();
+
+ Assert.check(Arrays.equals(memoryFM1.getFileBytes(StandardLocation.CLASS_OUTPUT, "B"),
+ memoryFM2.getFileBytes(StandardLocation.CLASS_OUTPUT, "B")));
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/BadInstanceMethodInUnboundLookup.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// key: compiler.misc.bad.instance.method.in.unbound.lookup
+// key: compiler.misc.invalid.mref
+// key: compiler.err.prob.found.req
+
+class BadInstanceMethodInUnboundLookup {
+
+ interface SAM {
+ void m(Integer u);
+ }
+
+ void f(Integer i) { }
+
+ static void test() {
+ SAM s = BadInstanceMethodInUnboundLookup::f;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/BadStaticMethodInBoundLookup.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// key: compiler.misc.invalid.mref
+// key: compiler.misc.bad.static.method.in.bound.lookup
+// key: compiler.err.prob.found.req
+
+class BadStaticMethodInBoundLookup {
+
+ Runnable r = new BadStaticMethodInBoundLookup()::m;
+
+ static void m() { }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/diags/examples/BadStaticMethodInUnboundLookup.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+// key: compiler.misc.invalid.mref
+// key: compiler.misc.bad.static.method.in.unbound.lookup
+// key: compiler.err.prob.found.req
+
+class BadStaticMethodInUnboundLookup {
+
+ interface SAM {
+ void m(BadStaticMethodInUnboundLookup m);
+ }
+
+ SAM s = BadStaticMethodInUnboundLookup::m;
+
+ static void m() { }
+}
--- a/langtools/test/tools/javac/diags/examples/NonStaticCantBeRefFragment.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-// key: compiler.misc.non-static.cant.be.ref
-// key: compiler.err.invalid.mref
-
-class NonStaticCantBeRefFragment {
-
- interface SAM {
- void m(Integer u);
- }
-
- void f(Integer i) { }
-
- static void test() {
- SAM s = NonStaticCantBeRefFragment::f;
- }
-}
--- a/langtools/test/tools/javac/diags/examples/StaticBoundMref.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-// key: compiler.err.invalid.mref
-// key: compiler.misc.static.bound.mref
-
-class StaticBoundMref {
-
- Runnable r = new StaticBoundMref()::m;
-
- static void m() { }
-}
--- a/langtools/test/tools/javac/diags/examples/StaticMethodInUnboundLookup.java Mon Jan 26 19:01:50 2015 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-// key: compiler.err.invalid.mref
-// key: compiler.misc.static.method.in.unbound.lookup
-
-class StaticBoundMref {
-
- interface SAM {
- void m(StaticBoundMref m);
- }
-
- SAM s = StaticBoundMref::m;
-
- static void m() { }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/generics/LowerBoundBottomTypeTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8062358
+ * @summary ClassCastException in TransTypes.visitApply
+ * @compile LowerBoundBottomTypeTest.java
+*/
+
+public class LowerBoundBottomTypeTest {
+ void g() {
+ f().getInIntf3().getInIntf2().getInIntf1().getA();
+ }
+ interface IntfA {
+ int getA();
+ }
+
+ interface Intf1<A extends IntfA> {
+ A getInIntf1();
+ }
+
+ interface Intf2<B> {
+ Intf1<? extends B> getInIntf2();
+ }
+
+ interface Intf3<C> {
+ Intf2<? extends C> getInIntf3();
+ }
+
+ Intf3<?> f() {
+ return null;
+ }
+}
--- a/langtools/test/tools/javac/lambda/LambdaLambdaSerialized.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/LambdaLambdaSerialized.java Tue Jan 27 13:58:55 2015 -0500
@@ -67,13 +67,13 @@
out.writeObject(lamb);
}
- static void readAssert(ObjectInputStream in, String expected) throws IOException, ClassNotFoundException {
- LSI<LSI<Map>> ls = (LSI<LSI<Map>>) in.readObject();
+ static void readAssert(ObjectInputStream in, String expected) throws IOException, ClassNotFoundException {
+ LSI<LSI<Map>> ls = (LSI<LSI<Map>>)in.readObject();
Map result = ls.get().get();
System.out.printf("Result: %s\n", result);
}
+
+ interface LSI<T> extends Serializable {
+ T get();
+ }
}
-
-interface LSI<T> extends Serializable {
- T get();
-}
--- a/langtools/test/tools/javac/lambda/MethodReference22.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/MethodReference22.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,9 +1,9 @@
-MethodReference22.java:40:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m1(java.lang.String))
-MethodReference22.java:41:9: compiler.err.cant.apply.symbol: kindname.method, call1, MethodReference22.SAM1, @999, kindname.class, MethodReference22, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.arg.types.in.mref))
-MethodReference22.java:46:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m4(java.lang.String))
-MethodReference22.java:47:9: compiler.err.cant.apply.symbol: kindname.method, call1, MethodReference22.SAM1, @1270, kindname.class, MethodReference22, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.arg.types.in.mref))
-MethodReference22.java:55:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m3(MethodReference22,java.lang.String))
-MethodReference22.java:56:9: compiler.err.cant.apply.symbol: kindname.method, call2, MethodReference22.SAM2, @1574, kindname.class, MethodReference22, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.incompatible.arg.types.in.mref))
+MethodReference22.java:40:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m1(java.lang.String)))
+MethodReference22.java:41:9: compiler.err.cant.apply.symbol: kindname.method, call1, MethodReference22.SAM1, @999, kindname.class, MethodReference22, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m1(java.lang.String)))
+MethodReference22.java:46:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m4(java.lang.String)))
+MethodReference22.java:47:9: compiler.err.cant.apply.symbol: kindname.method, call1, MethodReference22.SAM1, @1270, kindname.class, MethodReference22, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m4(java.lang.String)))
+MethodReference22.java:55:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m3, kindname.method, m3(MethodReference22,java.lang.String), MethodReference22, kindname.method, m3(java.lang.String), MethodReference22))
+MethodReference22.java:56:9: compiler.err.cant.apply.symbol: kindname.method, call2, MethodReference22.SAM2, @1574, kindname.class, MethodReference22, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m3(MethodReference22,java.lang.String)))
MethodReference22.java:57:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m4, kindname.method, m4(MethodReference22,java.lang.String), MethodReference22, kindname.method, m4(java.lang.String), MethodReference22))
MethodReference22.java:58:14: compiler.err.cant.apply.symbol: kindname.method, call2, MethodReference22.SAM2, @1667, kindname.class, MethodReference22, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m4, kindname.method, m4(MethodReference22,java.lang.String), MethodReference22, kindname.method, m4(java.lang.String), MethodReference22)))
MethodReference22.java:63:9: compiler.err.ref.ambiguous: call3, kindname.method, call3(MethodReference22.SAM1), MethodReference22, kindname.method, call3(MethodReference22.SAM2), MethodReference22
--- a/langtools/test/tools/javac/lambda/MethodReference28.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/MethodReference28.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,7 +1,7 @@
MethodReference28.java:31:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, static_m2, java.lang.Integer,java.lang.Integer, int, kindname.class, MethodReference28, (compiler.misc.arg.length.mismatch)))
MethodReference28.java:32:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, static_m3, java.lang.String, int, kindname.class, MethodReference28, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: int, java.lang.String))))
MethodReference28.java:33:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, static_m4, java.lang.String[], int, kindname.class, MethodReference28, (compiler.misc.varargs.argument.mismatch: (compiler.misc.inconvertible.types: int, java.lang.String))))
-MethodReference28.java:37:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m1(java.lang.Integer))
+MethodReference28.java:37:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m1(java.lang.Integer)))
MethodReference28.java:38:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, m2, java.lang.Integer,java.lang.Integer, int, kindname.class, MethodReference28, (compiler.misc.arg.length.mismatch)))
MethodReference28.java:39:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, m3, java.lang.String, int, kindname.class, MethodReference28, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: int, java.lang.String))))
MethodReference28.java:40:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, m4, java.lang.String[], int, kindname.class, MethodReference28, (compiler.misc.varargs.argument.mismatch: (compiler.misc.inconvertible.types: int, java.lang.String))))
--- a/langtools/test/tools/javac/lambda/MethodReference51.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/MethodReference51.out Tue Jan 27 13:58:55 2015 -0500
@@ -2,6 +2,6 @@
MethodReference51.java:40:21: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, f, java.lang.String, int, kindname.class, MethodReference51, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: int, java.lang.String))))
MethodReference51.java:41:21: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbols: kindname.method, g, int,{(compiler.misc.inapplicable.method: kindname.method, MethodReference51, g(java.lang.Integer,java.lang.Number), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.method, MethodReference51, g(java.lang.Number,java.lang.Integer), (compiler.misc.arg.length.mismatch))}))
MethodReference51.java:42:32: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: g, kindname.method, g(java.lang.Integer,java.lang.Number), MethodReference51, kindname.method, g(java.lang.Number,java.lang.Integer), MethodReference51))
-MethodReference51.java:43:21: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, h(int))
+MethodReference51.java:43:21: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, h(int)))
MethodReference51.java:44:21: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.not.def.access.class.intf.cant.access: j(int), MethodReference51.Foo))
6 errors
--- a/langtools/test/tools/javac/lambda/MethodReference55.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/MethodReference55.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,3 +1,3 @@
-MethodReference55.java:36:11: compiler.err.invalid.mref: kindname.method, (compiler.misc.static.bound.mref)
-MethodReference55.java:39:11: compiler.err.invalid.mref: kindname.method, (compiler.misc.static.bound.mref)
+MethodReference55.java:36:11: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.static.method.in.bound.lookup: kindname.method, m(java.lang.Object)))
+MethodReference55.java:39:9: compiler.err.cant.apply.symbol: kindname.method, g, MethodReference55.V, @1384, kindname.class, MethodReference55<X>, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.static.method.in.bound.lookup: kindname.method, m(java.lang.Object))))
2 errors
--- a/langtools/test/tools/javac/lambda/MethodReference68.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/MethodReference68.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,3 +1,2 @@
MethodReference68.java:21:10: compiler.err.cant.apply.symbol: kindname.method, g, MethodReference68.F<Z>,Z[], @493,int, kindname.class, MethodReference68, (compiler.misc.inferred.do.not.conform.to.upper.bounds: java.lang.Integer, MethodReference68.Foo,java.lang.Object)
-MethodReference68.java:21:12: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, getName())
-2 errors
+1 error
--- a/langtools/test/tools/javac/lambda/MethodReference73.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/MethodReference73.out Tue Jan 27 13:58:55 2015 -0500
@@ -2,12 +2,12 @@
MethodReference73.java:90:18: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m2, kindname.method, m2(MethodReference73,java.lang.String), MethodReference73, kindname.method, m2(java.lang.String), MethodReference73))
MethodReference73.java:91:18: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m3, kindname.method, m3(MethodReference73,java.lang.String), MethodReference73, kindname.method, m3(java.lang.String), MethodReference73))
MethodReference73.java:92:18: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m4, kindname.method, m4(MethodReference73,java.lang.String), MethodReference73, kindname.method, m4(java.lang.String), MethodReference73))
-MethodReference73.java:100:18: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m9(MethodReference73,java.lang.String))
-MethodReference73.java:101:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m10(MethodReference73,java.lang.String))
-MethodReference73.java:102:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.static.method.in.unbound.lookup: kindname.method, m11(java.lang.String))
-MethodReference73.java:103:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.static.method.in.unbound.lookup: kindname.method, m12(java.lang.String))
-MethodReference73.java:104:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m13(MethodReference73,java.lang.String))
-MethodReference73.java:105:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.static.method.in.unbound.lookup: kindname.method, m14(java.lang.String))
-MethodReference73.java:106:19: compiler.err.invalid.mref: kindname.method, (compiler.misc.non-static.cant.be.ref: kindname.method, m15(MethodReference73,java.lang.String))
+MethodReference73.java:100:18: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m9, kindname.method, m9(MethodReference73,java.lang.String), MethodReference73, kindname.method, m9(java.lang.String), MethodReference73))
+MethodReference73.java:101:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m10(MethodReference73,java.lang.String)))
+MethodReference73.java:102:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m11, kindname.method, m11(MethodReference73,java.lang.String), MethodReference73, kindname.method, m11(java.lang.String), MethodReference73))
+MethodReference73.java:103:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.static.method.in.unbound.lookup: kindname.method, m12(java.lang.String)))
+MethodReference73.java:104:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, m13(MethodReference73,java.lang.String)))
+MethodReference73.java:105:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.static.method.in.unbound.lookup: kindname.method, m14(java.lang.String)))
+MethodReference73.java:106:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.ref.ambiguous: m15, kindname.method, m15(MethodReference73,java.lang.String), MethodReference73, kindname.method, m15(java.lang.String), MethodReference73))
MethodReference73.java:108:19: compiler.err.prob.found.req: (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbols: kindname.method, m16, MethodReference73,java.lang.String,{(compiler.misc.inapplicable.method: kindname.method, MethodReference73, m16(MethodReference73,java.lang.String,int), (compiler.misc.arg.length.mismatch)),(compiler.misc.inapplicable.method: kindname.method, MethodReference73, m16(java.lang.String,int), (compiler.misc.no.conforming.assignment.exists: (compiler.misc.inconvertible.types: MethodReference73, java.lang.String)))}))
12 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/MethodReferenceGenericTarget.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8046977 8065303
+ * @summary ClassCastException: typing information needed for method reference bridging not preserved
+ * @author Srikanth
+ * @run main MethodReferenceGenericTarget
+ */
+
+public class MethodReferenceGenericTarget {
+ static String result = "";
+
+ interface ISi { int m(Short a); }
+
+ public static void main(String[] args) {
+ (new MethodReferenceGenericTarget()).testUnboxObjectToNumberWiden();
+ if (!result.equals("7775"))
+ throw new AssertionError("Incorrect result");
+ MethodReferenceTestPrivateTypeConversion.main(null);
+ new InferenceHookTest().test();
+ }
+
+ void foo(ISi q) {
+ result += q.m((short)75);
+ }
+
+ public void testUnboxObjectToNumberWiden() {
+ ISi q = (new E<Short>())::xI;
+ result += q.m((short)77);
+ // Verify poly invocation context to confirm we handle
+ // deferred/speculative attribution paths adequately.
+ foo((new E<Short>())::xI);
+ }
+
+ class E<T> {
+ private T xI(T t) { return t; }
+ }
+}
+
+// snippet from https://bugs.openjdk.java.net/browse/JDK-8065303
+class MethodReferenceTestPrivateTypeConversion {
+
+ class MethodReferenceTestTypeConversion_E<T> {
+ private T xI(T t) { return t; }
+ }
+
+ interface ISi { int m(Short a); }
+
+ interface ICc { char m(Character a); }
+
+ public void testUnboxObjectToNumberWiden() {
+ ISi q = (new MethodReferenceTestTypeConversion_E<Short>())::xI;
+ if ((q.m((short)77) != (short)77))
+ throw new AssertionError("Incorrect result");
+ }
+
+ public void testUnboxObjectToChar() {
+ ICc q = (new MethodReferenceTestTypeConversion_E<Character>())::xI;
+ if (q.m('@') != '@')
+ throw new AssertionError("Incorrect result");
+ }
+
+ public static void main(String[] args) {
+ new MethodReferenceTestPrivateTypeConversion().testUnboxObjectToNumberWiden();
+ new MethodReferenceTestPrivateTypeConversion().testUnboxObjectToChar();
+ }
+}
+
+class InferenceHookTestBase {
+ <X> X m(Integer i) { return null; }
+}
+
+class InferenceHookTest extends InferenceHookTestBase {
+ interface SAM1<R> {
+ R m(Integer i);
+ }
+
+ <Z> Z g(SAM1<Z> o) { return null; }
+
+ void test() {
+ String s = g(super::m);
+ if (s != null)
+ throw new AssertionError("Incorrect result");
+ }
+}
--- a/langtools/test/tools/javac/lambda/SerializedLambdaInInit.java Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/SerializedLambdaInInit.java Tue Jan 27 13:58:55 2015 -0500
@@ -111,8 +111,8 @@
}
}
}
+
+ interface LSI extends Serializable {
+ String convert(String x);
+ }
}
-
-interface LSI extends Serializable {
- String convert(String x);
-}
--- a/langtools/test/tools/javac/lambda/TargetType60.out Mon Jan 26 19:01:50 2015 +0300
+++ b/langtools/test/tools/javac/lambda/TargetType60.out Tue Jan 27 13:58:55 2015 -0500
@@ -1,6 +1,6 @@
TargetType60.java:54:21: compiler.err.ref.ambiguous: g, kindname.method, g(TargetType60.Sam0), TargetType60, kindname.method, <U>g(TargetType60.Sam1<U>), TargetType60
TargetType60.java:55:21: compiler.err.ref.ambiguous: g, kindname.method, <U>g(TargetType60.Sam1<U>), TargetType60, kindname.method, <U>g(TargetType60.Sam2<U,java.lang.String>), TargetType60
-TargetType60.java:61:27: compiler.err.cant.apply.symbols: kindname.method, u, @1639,{(compiler.misc.inapplicable.method: kindname.method, TargetType60, <U>u(TargetType60.Sam1<U>), (compiler.misc.infer.no.conforming.assignment.exists: U, (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, n2, TargetType60,java.lang.String, U, kindname.class, TargetType60, (compiler.misc.arg.length.mismatch))))),(compiler.misc.inapplicable.method: kindname.method, TargetType60, <U>u(TargetType60.Sam2<U,java.lang.String>), (compiler.misc.infer.no.conforming.assignment.exists: U, (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.resolve.location.args: kindname.method, n2, , U,java.lang.String, (compiler.misc.location: kindname.class, TargetType60, null)))))}
+TargetType60.java:61:27: compiler.err.cant.apply.symbols: kindname.method, u, @1639,{(compiler.misc.inapplicable.method: kindname.method, TargetType60, <U>u(TargetType60.Sam1<U>), (compiler.misc.infer.no.conforming.assignment.exists: U, (compiler.misc.invalid.mref: kindname.method, (compiler.misc.cant.apply.symbol: kindname.method, n2, TargetType60,java.lang.String, U, kindname.class, TargetType60, (compiler.misc.arg.length.mismatch))))),(compiler.misc.inapplicable.method: kindname.method, TargetType60, <U>u(TargetType60.Sam2<U,java.lang.String>), (compiler.misc.infer.no.conforming.assignment.exists: U, (compiler.misc.invalid.mref: kindname.method, (compiler.misc.bad.instance.method.in.unbound.lookup: kindname.method, n2(TargetType60,java.lang.String)))))}
TargetType60.java:62:27: compiler.err.ref.ambiguous: u, kindname.method, <U>u(TargetType60.Sam1<U>), TargetType60, kindname.method, <U>u(TargetType60.Sam2<U,java.lang.String>), TargetType60
TargetType60.java:63:27: compiler.err.ref.ambiguous: u, kindname.method, <U>u(TargetType60.Sam1<U>), TargetType60, kindname.method, <U>u(TargetType60.Sam2<U,java.lang.String>), TargetType60
5 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/methodReferenceExecution/MethodReferencePackagePrivateQualifier.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8068254
+ * @summary Method reference uses wrong qualifying type
+ * @author srikanth
+ * @run main MethodReferencePackagePrivateQualifier
+ */
+import pkg.B;
+public class MethodReferencePackagePrivateQualifier {
+ public static void main(String... args) {
+ pkg.B.m();
+ Runnable r = pkg.B::m;
+ r.run();
+ r = B::m;
+ r.run();
+ if (!pkg.B.result.equals("A.m()A.m()A.m()"))
+ throw new AssertionError("Incorrect result");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/lambda/methodReferenceExecution/pkg/B.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. 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 pkg;
+class A {
+ public static void m() {
+ B.result += "A.m()";
+ }
+}
+
+public class B extends A {
+ public static String result = "";
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/parser/extend/JavacExtensionTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.source.tree.CompilationUnitTree;
+import com.sun.source.tree.Tree;
+import com.sun.source.util.SourcePositions;
+import com.sun.source.util.TreePath;
+import com.sun.source.util.Trees;
+import com.sun.tools.javac.api.JavacTaskImpl;
+import com.sun.tools.javac.api.JavacTool;
+import com.sun.tools.javac.util.Context;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import javax.lang.model.element.Element;
+import javax.tools.Diagnostic;
+import javax.tools.DiagnosticCollector;
+import javax.tools.JavaCompiler;
+import javax.tools.JavaFileManager;
+import javax.tools.JavaFileObject;
+import javax.tools.ToolProvider;
+import javax.tools.StandardJavaFileManager;
+import com.sun.source.tree.ImportTree;
+import java.util.Collections;
+import java.io.PrintWriter;
+import com.sun.source.tree.VariableTree;
+import static javax.tools.StandardLocation.CLASS_OUTPUT;
+
+/*
+ * @test
+ * @bug 8067384 8068488
+ * @summary Verify that JavacParser can be extended
+ */
+public class JavacExtensionTest {
+
+ public static void main(String[] args) throws Exception {
+ PrintWriter pw = new PrintWriter("trialSource.java", "UTF-8");
+ pw.println("int x = 9;");
+ pw.close();
+ List<? extends Tree> defs = parse("trialSource.java");
+ if (defs.size() != 1) {
+ throw new AssertionError("Expected only one def, got: " + defs.size());
+ }
+ Tree tree = defs.get(0);
+ if (tree instanceof VariableTree) {
+ System.out.println("Passes! --- " + tree);
+ } else {
+ throw new AssertionError("Expected VariableTree, got: " + tree);
+ }
+ }
+
+ static List<? extends Tree> parse(String srcfile) throws Exception {
+ JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
+ StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
+ Iterable<? extends JavaFileObject> fileObjects = fileManager.getJavaFileObjects(srcfile);
+ String classPath = System.getProperty("java.class.path");
+ List<String> options = Arrays.asList("-classpath", classPath);
+ DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
+ Context context = new Context();
+ JavacTaskImpl task = (JavacTaskImpl) ((JavacTool) compiler).getTask(null, null,
+ diagnostics, options, null, fileObjects, context);
+ TrialParserFactory.instance(context);
+ Iterable<? extends CompilationUnitTree> asts = task.parse();
+ Iterator<? extends CompilationUnitTree> it = asts.iterator();
+ if (it.hasNext()) {
+ CompilationUnitTree cut = it.next();
+ return cut.getTypeDecls();
+ } else {
+ throw new AssertionError("Expected compilation unit");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/parser/extend/TrialParser.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.tools.javac.code.TypeTag;
+import com.sun.tools.javac.parser.JavacParser;
+import com.sun.tools.javac.parser.ParserFactory;
+import com.sun.tools.javac.parser.Tokens.Comment;
+import com.sun.tools.javac.parser.Tokens.Comment.CommentStyle;
+import com.sun.tools.javac.parser.Tokens.Token;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.CLASS;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.COLON;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.ENUM;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.EOF;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.IMPORT;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.INTERFACE;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.LPAREN;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.MONKEYS_AT;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.PACKAGE;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.SEMI;
+import static com.sun.tools.javac.parser.Tokens.TokenKind.VOID;
+import com.sun.tools.javac.tree.JCTree;
+import com.sun.tools.javac.tree.JCTree.JCAnnotation;
+import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
+import com.sun.tools.javac.tree.JCTree.JCExpression;
+import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
+import com.sun.tools.javac.tree.JCTree.JCModifiers;
+import com.sun.tools.javac.tree.JCTree.JCPackageDecl;
+import com.sun.tools.javac.tree.JCTree.JCStatement;
+import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
+import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
+import com.sun.tools.javac.tree.JCTree.Tag;
+import static com.sun.tools.javac.tree.JCTree.Tag.IDENT;
+import com.sun.tools.javac.util.List;
+import com.sun.tools.javac.util.ListBuffer;
+import com.sun.tools.javac.util.Name;
+import com.sun.tools.javac.util.Position;
+
+/**
+ *
+ * @author Robert Field
+ */
+class TrialParser extends JavacParser {
+
+ public TrialParser(ParserFactory fac,
+ com.sun.tools.javac.parser.Lexer S,
+ boolean keepDocComments,
+ boolean keepLineMap,
+ boolean keepEndPositions) {
+ super(fac, S, keepDocComments, keepLineMap, keepEndPositions);
+ }
+
+ @Override
+ public JCCompilationUnit parseCompilationUnit() {
+ Token firstToken = token;
+ JCModifiers mods = null;
+ boolean seenImport = false;
+ boolean seenPackage = false;
+ ListBuffer<JCTree> defs = new ListBuffer<>();
+ if (token.kind == MONKEYS_AT) {
+ mods = modifiersOpt();
+ }
+
+ if (token.kind == PACKAGE) {
+ int packagePos = token.pos;
+ List<JCAnnotation> annotations = List.nil();
+ seenPackage = true;
+ if (mods != null) {
+ checkNoMods(mods.flags);
+ annotations = mods.annotations;
+ mods = null;
+ }
+ nextToken();
+ JCExpression pid = qualident(false);
+ accept(SEMI);
+ JCPackageDecl pd = F.at(packagePos).PackageDecl(annotations, pid);
+ attach(pd, firstToken.comment(CommentStyle.JAVADOC));
+ storeEnd(pd, token.pos);
+ defs.append(pd);
+ }
+
+ boolean firstTypeDecl = true;
+ while (token.kind != EOF) {
+ if (token.pos > 0 && token.pos <= endPosTable.errorEndPos) {
+ // error recovery
+ skip(true, false, false, false);
+ if (token.kind == EOF) {
+ break;
+ }
+ }
+ if (mods == null && token.kind == IMPORT) {
+ seenImport = true;
+ defs.append(importDeclaration());
+ break;
+ } else {
+ Comment docComment = token.comment(CommentStyle.JAVADOC);
+ if (firstTypeDecl && !seenImport && !seenPackage) {
+ docComment = firstToken.comment(CommentStyle.JAVADOC);
+ }
+ List<? extends JCTree> udefs = aUnit(mods, docComment);
+ for (JCTree def : udefs) {
+ defs.append(def);
+ }
+ mods = null;
+ firstTypeDecl = false;
+ break;
+ }
+ }
+ List<JCTree> rdefs = defs.toList();
+ class TrialUnit extends JCCompilationUnit {
+
+ public TrialUnit(List<JCTree> defs) {
+ super(defs);
+ }
+ }
+ JCCompilationUnit toplevel = new TrialUnit(rdefs);
+ if (rdefs.isEmpty()) {
+ storeEnd(toplevel, S.prevToken().endPos);
+ }
+ toplevel.lineMap = S.getLineMap();
+ this.endPosTable.setParser(null); // remove reference to parser
+ toplevel.endPositions = this.endPosTable;
+ return toplevel;
+ }
+
+ List<? extends JCTree> aUnit(JCModifiers pmods, Comment dc) {
+ switch (token.kind) {
+ case EOF:
+ return List.nil();
+ case RBRACE:
+ case CASE:
+ case DEFAULT:
+ // These are illegal, fall through to handle as illegal statement
+ case LBRACE:
+ case IF:
+ case FOR:
+ case WHILE:
+ case DO:
+ case TRY:
+ case SWITCH:
+ case SYNCHRONIZED:
+ case RETURN:
+ case THROW:
+ case BREAK:
+ case CONTINUE:
+ case SEMI:
+ case ELSE:
+ case FINALLY:
+ case CATCH:
+ case ASSERT:
+ return List.<JCTree>of(parseStatement());
+ default:
+ JCModifiers mods = modifiersOpt(pmods);
+ if (token.kind == CLASS
+ || token.kind == INTERFACE
+ || token.kind == ENUM) {
+ return List.<JCTree>of(classOrInterfaceOrEnumDeclaration(mods, dc));
+ } else {
+ int pos = token.pos;
+ List<JCTypeParameter> typarams = typeParametersOpt();
+ // if there are type parameters but no modifiers, save the start
+ // position of the method in the modifiers.
+ if (typarams.nonEmpty() && mods.pos == Position.NOPOS) {
+ mods.pos = pos;
+ storeEnd(mods, pos);
+ }
+ List<JCAnnotation> annosAfterParams = annotationsOpt(Tag.ANNOTATION);
+
+ if (annosAfterParams.nonEmpty()) {
+ checkAnnotationsAfterTypeParams(annosAfterParams.head.pos);
+ mods.annotations = mods.annotations.appendList(annosAfterParams);
+ if (mods.pos == Position.NOPOS) {
+ mods.pos = mods.annotations.head.pos;
+ }
+ }
+
+ Token prevToken = token;
+ pos = token.pos;
+ JCExpression t;
+ boolean isVoid = token.kind == VOID;
+ if (isVoid) {
+ t = to(F.at(pos).TypeIdent(TypeTag.VOID));
+ nextToken();
+ } else {
+ // return type of method, declared type of variable, or an expression
+ t = term(EXPR | TYPE);
+ }
+ if (token.kind == COLON && t.hasTag(IDENT)) {
+ // labelled statement
+ nextToken();
+ JCStatement stat = parseStatement();
+ return List.<JCTree>of(F.at(pos).Labelled(prevToken.name(), stat));
+ } else if ((isVoid || (lastmode & TYPE) != 0) && LAX_IDENTIFIER.accepts(token.kind)) {
+ // we have "Type Ident", so we can assume it is variable or method declaration
+ pos = token.pos;
+ Name name = ident();
+ if (token.kind == LPAREN) {
+ // method declaration
+ //mods.flags |= Flags.STATIC;
+ return List.of(methodDeclaratorRest(
+ pos, mods, t, name, typarams,
+ false, isVoid, dc));
+ } else if (!isVoid && typarams.isEmpty()) {
+ // variable declaration
+ //mods.flags |= Flags.STATIC;
+ List<JCTree> defs
+ = variableDeclaratorsRest(pos, mods, t, name, false, dc,
+ new ListBuffer<JCTree>()).toList();
+ accept(SEMI);
+ storeEnd(defs.last(), S.prevToken().endPos);
+ return defs;
+ } else {
+ // malformed declaration, return error
+ pos = token.pos;
+ List<JCTree> err = isVoid
+ ? List.<JCTree>of(toP(F.at(pos).MethodDef(mods, name, t, typarams,
+ List.<JCVariableDecl>nil(), List.<JCExpression>nil(), null, null)))
+ : null;
+ return List.<JCTree>of(syntaxError(token.pos, err, "expected", LPAREN));
+ }
+ } else if (!typarams.isEmpty()) {
+ // type parameters on non-variable non-method -- error
+ return List.<JCTree>of(syntaxError(token.pos, "illegal.start.of.type"));
+ } else {
+ // expression-statement or expression to evaluate
+ accept(SEMI);
+ JCExpressionStatement expr = toP(F.at(pos).Exec(t));
+ return List.<JCTree>of(expr);
+ }
+
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/parser/extend/TrialParserFactory.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.tools.javac.parser.JavacParser;
+import com.sun.tools.javac.parser.ParserFactory;
+import com.sun.tools.javac.parser.ScannerFactory;
+import com.sun.tools.javac.util.Context;
+
+/**
+ *
+ * @author Robert Field
+ */
+class TrialParserFactory extends ParserFactory {
+
+ public static ParserFactory instance(Context context) {
+ ParserFactory instance = context.get(parserFactoryKey);
+ if (instance == null) {
+ instance = new TrialParserFactory(context);
+ }
+ return instance;
+ }
+
+ private final ScannerFactory scannerFactory;
+
+ protected TrialParserFactory(Context context) {
+ super(context);
+ this.scannerFactory = ScannerFactory.instance(context);
+ }
+
+ @Override
+ public JavacParser newParser(CharSequence input, boolean keepDocComments, boolean keepEndPos, boolean keepLineMap) {
+ com.sun.tools.javac.parser.Lexer lexer = scannerFactory.newScanner(input, keepDocComments);
+ return new TrialParser(this, lexer, keepDocComments, keepLineMap, keepEndPos);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/TestMultipleErrors.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+
+/*
+ * @test
+ * @bug 8066843
+ * @summary Annotation processors should be able to print multiple errors at the same location.
+ * @library /tools/javac/lib
+ * @build JavacTestingAbstractProcessor TestMultipleErrors
+ * @compile/fail/ref=TestMultipleErrors.out -XDrawDiagnostics -processor TestMultipleErrors TestMultipleErrors.java
+ */
+
+import java.util.*;
+import javax.annotation.processing.*;
+import javax.lang.model.element.*;
+import javax.tools.Diagnostic.Kind;
+import com.sun.source.util.TreePath;
+import com.sun.source.util.Trees;
+
+public class TestMultipleErrors extends JavacTestingAbstractProcessor {
+ @Override
+ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+ for (Element root : roundEnv.getRootElements()) {
+ processingEnv.getMessager().printMessage(Kind.ERROR, "error1", root);
+ processingEnv.getMessager().printMessage(Kind.ERROR, "error2", root);
+
+ Trees trees = Trees.instance(processingEnv);
+ TreePath path = trees.getPath(root);
+
+ trees.printMessage(Kind.ERROR, "error3", path.getLeaf(), path.getCompilationUnit());
+ trees.printMessage(Kind.ERROR, "error4", path.getLeaf(), path.getCompilationUnit());
+ }
+ return true;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/processing/TestMultipleErrors.out Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,5 @@
+TestMultipleErrors.java:41:8: compiler.err.proc.messager: error1
+TestMultipleErrors.java:41:8: compiler.err.proc.messager: error2
+TestMultipleErrors.java:41:8: compiler.err.proc.messager: error3
+TestMultipleErrors.java:41:8: compiler.err.proc.messager: error4
+4 errors
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/varargs/warning/Warn6.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @bug 8069254
+ * @summary Ensure the generic array creation warning is not incorrectly produced for diamonds
+ * @compile -Xlint:unchecked -Werror Warn6.java
+ */
+
+public class Warn6<T> {
+ @SafeVarargs
+ public Warn6(T... args) {
+ }
+
+ public static void main(String[] args) {
+ Iterable<String> i = null;
+
+ Warn6<Iterable<String>> foo2 = new Warn6<>(i, i);
+ Warn6<Iterable<String>> foo3 = new Warn6<Iterable<String>>(i, i);
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/warnings/suppress/T8069094.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,17 @@
+/**
+ * @test /nodynamiccopyright/
+ * @bug 8069094
+ * @summary Verify that \\@SuppressWarnings("unchecked") works correctly for annotation default values
+ * @build VerifySuppressWarnings
+ * @compile/ref=T8069094.out -XDrawDiagnostics -Xlint:unchecked,deprecation,cast T8069094.java
+ * @run main VerifySuppressWarnings T8069094.java
+ */
+
+@interface T8069094 {
+ T8069094A foo() default T8069094A.Bar;
+}
+
+@Deprecated
+enum T8069094A {
+ Bar
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/warnings/suppress/T8069094.out Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,3 @@
+T8069094.java:11:5: compiler.warn.has.been.deprecated: T8069094A, compiler.misc.unnamed.package
+T8069094.java:11:29: compiler.warn.has.been.deprecated: T8069094A, compiler.misc.unnamed.package
+2 warnings
--- a/make/Images.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/make/Images.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -29,7 +29,7 @@
include MakeBase.gmk
TOOL_TARGETS :=
-JDK_TARGETS :=
+JDK_TARGETS :=
JRE_TARGETS :=
# Hook to include the corresponding custom file, if present.
@@ -69,7 +69,7 @@
jdk.naming.rmi jdk.sctp jdk.security.auth
# Replacing double-comma with a single comma is to workaround the issue
-# with some version of make on windows that doesn't substitute spaces
+# with some version of make on windows that doesn't substitute spaces
# with one comma properly as with make 4.0
define SubstComma
$(subst $(COMMA)$(COMMA),$(COMMA),$(subst $(SPACE),$(COMMA),$(strip $1)))
--- a/make/MakeHelpers.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/make/MakeHelpers.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -353,7 +353,7 @@
# Helper macro for DeclareRecipesForPhase
# Declare a recipe for calling the module and phase specific makefile.
# If there are multiple makefiles to call, create a rule for each topdir
-# that contains a makefile with the target $module-$suffix-$repodir,
+# that contains a makefile with the target $module-$suffix-$repodir,
# (i.e: java.base-gensrc-jdk)
# Normally there is only one makefile, and the target will just be
# $module-$suffix
--- a/make/ModuleWrapper.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/make/ModuleWrapper.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -26,7 +26,7 @@
################################################################################
# This makefile is called from Main.gmk, through a macro in MakeHelpers.gmk
# and wraps calls to makefiles for specific modules and build phases. Having
-# this wrapper reduces the need for boilerplate code. It also provides
+# this wrapper reduces the need for boilerplate code. It also provides
# opportunity for automatic copying of files to an interim exploded runnable
# image.
--- a/make/common/JavaCompilation.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/make/common/JavaCompilation.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -538,7 +538,7 @@
$1_REMOTE:=--server:portfile=$$($1_SJAVAC_PORTFILE),id=$1,sjavac=$$(subst $$(SPACE),%20,$$(subst $$(COMMA),%2C,$$(strip $$($1_SERVER_JVM) $$($1_SJAVAC))))
$$($1_BIN)/_the.$1_batch: $$($1_SRCS) $$($1_DEPENDS)
- $(MKDIR) -p $$(@D)
+ $(MKDIR) -p $$(@D) $$(dir $$($1_SJAVAC_PORTFILE))
# As a workaround for sjavac not tracking api changed from the classpath, force full
# recompile if an external dependency, which is something other than a source
# change, triggered this compilation.
--- a/make/common/NativeCompilation.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/make/common/NativeCompilation.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -439,8 +439,10 @@
# Now call add_native_source for each source file we are going to compile.
$$(foreach p,$$($1_SRCS), \
$$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \
- $(SYSROOT_CFLAGS) $$($1_CFLAGS) $$($1_EXTRA_CFLAGS),$$($1_CC), \
- $(SYSROOT_CFLAGS) $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS),$$($1_CXX),$$($1_OBJC),$$($1_ASFLAGS))))
+ $$($1_CFLAGS) $$($1_EXTRA_CFLAGS) $(SYSROOT_CFLAGS), \
+ $$($1_CC), \
+ $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS) $(SYSROOT_CFLAGS), \
+ $$($1_CXX),$$($1_OBJC),$$($1_ASFLAGS))))
# On windows we need to create a resource file
ifeq ($(OPENJDK_TARGET_OS), windows)
@@ -575,10 +577,11 @@
$$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE) \
$$($1_DEBUGINFO_EXTRA_DEPS)
- $$(call LINKING_MSG,$$($1_BASENAME))
- $$($1_LD) $(SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$@ \
- $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
- $$($1_EXTRA_LDFLAGS_SUFFIX)
+ $(ECHO) $(LOG_INFO) "Linking $$($1_BASENAME)"
+ $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(SYSROOT_LDFLAGS) \
+ $(LD_OUT_OPTION)$$@ \
+ $$($1_EXPECTED_OBJS) $$($1_RES) \
+ $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX)
$$($1_CREATE_DEBUGINFO_CMDS)
# Touch target to make sure it has a later time stamp than the debug
# symbol files to avoid unnecessary relinking on rebuild.
@@ -602,10 +605,11 @@
$$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST) \
$$($1_DEBUGINFO_EXTRA_DEPS)
- $$(call LINKING_EXE_MSG,$$($1_BASENAME))
- $$($1_LDEXE) $(SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_TARGET) \
- $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
- $$($1_EXTRA_LDFLAGS_SUFFIX)
+ $(ECHO) $(LOG_INFO) "Linking executable $$($1_BASENAME)"
+ $$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(SYSROOT_LDFLAGS) \
+ $(EXE_OUT_OPTION)$$($1_TARGET) \
+ $$($1_EXPECTED_OBJS) $$($1_RES) \
+ $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX)
ifneq (,$$($1_GEN_MANIFEST))
$(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
endif
--- a/make/common/SetupJavaCompilers.gmk Mon Jan 26 19:01:50 2015 +0300
+++ b/make/common/SetupJavaCompilers.gmk Tue Jan 27 13:58:55 2015 -0500
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
@@ -30,9 +30,9 @@
DISABLE_WARNINGS := -Xlint:all,-deprecation,-unchecked,-rawtypes,-cast,-serial,-dep-ann,-static,-fallthrough,-try,-varargs,-empty,-finally
-# To build with all warnings enabled, do the following:
+# If warnings needs to be non-fatal for testing purposes use a command like:
# make JAVAC_WARNINGS="-Xlint:all -Xmaxwarns 10000"
-JAVAC_WARNINGS := -Xlint:all,-deprecation -Werror
+JAVAC_WARNINGS := -Xlint:all -Werror
# The BOOT_JAVAC setup uses the boot jdk compiler to compile the tools
# and the interim javac, to be run by the boot jdk.
--- a/make/jprt.properties Mon Jan 26 19:01:50 2015 +0300
+++ b/make/jprt.properties Tue Jan 27 13:58:55 2015 -0500
@@ -269,11 +269,6 @@
solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_CMS, \
solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_G1, \
solaris_sparcv9_5.11-{product|fastdebug}-c2-GCBasher_ParOldGC, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-GCOld_SerialGC, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-GCOld_ParallelGC, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-GCOld_CMS, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-GCOld_G1, \
- solaris_sparcv9_5.11-{product|fastdebug}-c2-GCOld_ParOldGC, \
solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_default_nontiered, \
solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_SerialGC, \
solaris_sparcv9_5.11-{product|fastdebug}-c2-jbb_ParallelGC, \
@@ -293,17 +288,9 @@
solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_CMS, \
solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_G1, \
solaris_x64_5.11-{product|fastdebug}-c2-GCBasher_ParOldGC, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_SerialGC, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_ParallelGC, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_CMS, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_G1, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_ParOldGC, \
solaris_x64_5.11-{product|fastdebug}-c2-jbb_default_nontiered, \
solaris_x64_5.11-{product|fastdebug}-c2-jbb_SerialGC, \
- solaris_x64_5.11-{product|fastdebug}-c2-jbb_ParallelGC, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_CMS, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_G1, \
- solaris_x64_5.11-{product|fastdebug}-c2-GCOld_ParOldGC
+ solaris_x64_5.11-{product|fastdebug}-c2-jbb_ParallelGC,
my.test.targets.hotspot.linux.i586= \
linux_i586_2.6-{product|fastdebug}-{c1|c2}-jvm98, \
@@ -319,11 +306,6 @@
linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
linux_i586_2.6-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
- linux_i586_2.6-product-{c1|c2}-GCOld_SerialGC, \
- linux_i586_2.6-product-{c1|c2}-GCOld_ParallelGC, \
- linux_i586_2.6-product-{c1|c2}-GCOld_CMS, \
- linux_i586_2.6-product-{c1|c2}-GCOld_G1, \
- linux_i586_2.6-product-{c1|c2}-GCOld_ParOldGC, \
linux_i586_2.6-{product|fastdebug}-c1-jbb_SerialGC, \
linux_i586_2.6-{product|fastdebug}-c2-jbb_default_nontiered, \
linux_i586_2.6-{product|fastdebug}-c1-jbb_ParallelGC, \
@@ -340,11 +322,6 @@
linux_x64_2.6-{product|fastdebug}-c2-GCBasher_CMS, \
linux_x64_2.6-{product|fastdebug}-c2-GCBasher_G1, \
linux_x64_2.6-{product|fastdebug}-c2-GCBasher_ParOldGC, \
- linux_x64_2.6-{product|fastdebug}-c2-GCOld_SerialGC, \
- linux_x64_2.6-{product|fastdebug}-c2-GCOld_ParallelGC, \
- linux_x64_2.6-{product|fastdebug}-c2-GCOld_CMS, \
- linux_x64_2.6-{product|fastdebug}-c2-GCOld_G1, \
- linux_x64_2.6-{product|fastdebug}-c2-GCOld_ParOldGC, \
linux_x64_2.6-{product|fastdebug}-c2-jbb_default_nontiered, \
linux_x64_2.6-{product|fastdebug}-c2-jbb_ParallelGC, \
linux_x64_2.6-{product|fastdebug}-c2-jbb_G1, \
@@ -359,11 +336,6 @@
macosx_x64_10.7-{product|fastdebug}-c2-GCBasher_CMS, \
macosx_x64_10.7-{product|fastdebug}-c2-GCBasher_G1, \
macosx_x64_10.7-{product|fastdebug}-c2-GCBasher_ParOldGC, \
- macosx_x64_10.7-{product|fastdebug}-c2-GCOld_SerialGC, \
- macosx_x64_10.7-{product|fastdebug}-c2-GCOld_ParallelGC, \
- macosx_x64_10.7-{product|fastdebug}-c2-GCOld_CMS, \
- macosx_x64_10.7-{product|fastdebug}-c2-GCOld_G1, \
- macosx_x64_10.7-{product|fastdebug}-c2-GCOld_ParOldGC, \
macosx_x64_10.7-{product|fastdebug}-c2-jbb_default_nontiered, \
macosx_x64_10.7-{product|fastdebug}-c2-jbb_ParallelGC, \
macosx_x64_10.7-{product|fastdebug}-c2-jbb_G1, \
@@ -382,11 +354,6 @@
windows_i586_6.1-{product|fastdebug}-{c1|c2}-GCBasher_CMS, \
windows_i586_6.1-{product|fastdebug}-{c1|c2}-GCBasher_G1, \
windows_i586_6.1-{product|fastdebug}-{c1|c2}-GCBasher_ParOldGC, \
- windows_i586_6.1-product-{c1|c2}-GCOld_SerialGC, \
- windows_i586_6.1-product-{c1|c2}-GCOld_ParallelGC, \
- windows_i586_6.1-product-{c1|c2}-GCOld_CMS, \
- windows_i586_6.1-product-{c1|c2}-GCOld_G1, \
- windows_i586_6.1-product-{c1|c2}-GCOld_ParOldGC, \
windows_i586_6.1-{product|fastdebug}-{c1|c2}-jbb_default, \
windows_i586_6.1-{product|fastdebug}-c2-jbb_default_nontiered, \
windows_i586_6.1-product-{c1|c2}-jbb_ParallelGC, \
@@ -406,11 +373,6 @@
windows_x64_6.1-{product|fastdebug}-c2-GCBasher_CMS, \
windows_x64_6.1-{product|fastdebug}-c2-GCBasher_G1, \
windows_x64_6.1-{product|fastdebug}-c2-GCBasher_ParOldGC, \
- windows_x64_6.1-{product|fastdebug}-c2-GCOld_SerialGC, \
- windows_x64_6.1-{product|fastdebug}-c2-GCOld_ParallelGC, \
- windows_x64_6.1-{product|fastdebug}-c2-GCOld_CMS, \
- windows_x64_6.1-{product|fastdebug}-c2-GCOld_G1, \
- windows_x64_6.1-{product|fastdebug}-c2-GCOld_ParOldGC, \
windows_x64_6.1-{product|fastdebug}-c2-jbb_default, \
windows_x64_6.1-{product|fastdebug}-c2-jbb_default_nontiered, \
windows_x64_6.1-product-c2-jbb_CMS, \
@@ -486,6 +448,8 @@
${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_compiler_3}, \
${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_compiler_closed}, \
${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_gc}, \
+ ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_gc_closed}, \
+ ${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_gc_gcold}, \
${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_runtime}, \
${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_runtime_closed}, \
${my.make.rule.test.targets.hotspot.reg.group:GROUP=hotspot_serviceability}, \
--- a/modules.xml Mon Jan 26 19:01:50 2015 +0300
+++ b/modules.xml Tue Jan 27 13:58:55 2015 -0500
@@ -737,7 +737,7 @@
</export>
<export>
<name>sun.awt</name>
- <to>oracle.accessbridge</to>
+ <to>jdk.accessbridge</to>
</export>
</module>
<module>
--- a/nashorn/.hgtags Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/.hgtags Tue Jan 27 13:58:55 2015 -0500
@@ -279,3 +279,5 @@
8ae8dff2a28f3b8831cce97ae0c7a957c5dc650a jdk9-b43
50ee576062726e536d1bb9a5eadd8fd4470128fc jdk9-b44
3c2bbeda038aef7061455fec604db7d8a342fac5 jdk9-b45
+2ecf0a617f0f9af1ffd278a0c70e76f1946ce773 jdk9-b46
+29046d42a95e5b9f105ab086a628bbd7f81c915d jdk9-b47
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/AbstractJavaLinker.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/AbstractJavaLinker.java Tue Jan 27 13:58:55 2015 -0500
@@ -491,8 +491,9 @@
// We want setters that conform to "Object(O, V)". Note, we aren't doing "R(O, V)" as it might not be
// valid for us to convert return values proactively. Also, since we don't know what setters will be
- // invoked, we'll conservatively presume Object return type.
- final MethodType type = callSiteDescriptor.getMethodType().changeReturnType(Object.class);
+ // invoked, we'll conservatively presume Object return type. The one exception is void return.
+ final MethodType origType = callSiteDescriptor.getMethodType();
+ final MethodType type = origType.returnType() == void.class ? origType : origType.changeReturnType(Object.class);
// What's below is basically:
// foldArguments(guardWithTest(isNotNull, invoke, null|nextComponent.invocation),
@@ -508,7 +509,7 @@
// Bind property setter handle to the expected setter type and linker services. Type is
// MethodHandle(Object, String, Object)
final MethodHandle boundGetter = MethodHandles.insertArguments(getPropertySetterHandle, 0,
- CallSiteDescriptorFactory.dropParameterTypes(callSiteDescriptor, 1, 2), linkerServices);
+ callSiteDescriptor.changeMethodType(setterType), linkerServices);
// Cast getter to MethodHandle(O, N, V)
final MethodHandle typedGetter = linkerServices.asType(boundGetter, type.changeReturnType(
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/OverloadedMethod.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/beans/OverloadedMethod.java Tue Jan 27 13:58:55 2015 -0500
@@ -123,7 +123,6 @@
varArgMethods = new ArrayList<>(methodHandles.size());
final int argNum = callSiteType.parameterCount();
for(MethodHandle mh: methodHandles) {
- mh = mh.asType(mh.type().changeReturnType(commonRetType));
if(mh.isVarargsCollector()) {
final MethodHandle asFixed = mh.asFixedArity();
if(argNum == asFixed.type().parameterCount()) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/TypeUtilities.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/internal/dynalink/support/TypeUtilities.java Tue Jan 27 13:58:55 2015 -0500
@@ -118,17 +118,13 @@
public static Class<?> getCommonLosslessConversionType(final Class<?> c1, final Class<?> c2) {
if(c1 == c2) {
return c1;
+ } else if (c1 == void.class || c2 == void.class) {
+ return Object.class;
} else if(isConvertibleWithoutLoss(c2, c1)) {
return c1;
} else if(isConvertibleWithoutLoss(c1, c2)) {
return c2;
- }
- if(c1 == void.class) {
- return c2;
- } else if(c2 == void.class) {
- return c1;
- }
- if(c1.isPrimitive() && c2.isPrimitive()) {
+ } else if(c1.isPrimitive() && c2.isPrimitive()) {
if((c1 == byte.class && c2 == char.class) || (c1 == char.class && c2 == byte.class)) {
// byte + char = int
return int.class;
@@ -268,20 +264,24 @@
}
/**
- * Determines whether a type can be converted to another without losing any
- * precision.
+ * Determines whether a type can be converted to another without losing any precision. As a special case,
+ * void is considered convertible only to Object and void, while anything can be converted to void. This
+ * is because a target type of void means we don't care about the value, so the conversion is always
+ * permissible.
*
* @param sourceType the source type
* @param targetType the target type
* @return true if lossless conversion is possible
*/
public static boolean isConvertibleWithoutLoss(final Class<?> sourceType, final Class<?> targetType) {
- if(targetType.isAssignableFrom(sourceType)) {
+ if(targetType.isAssignableFrom(sourceType) || targetType == void.class) {
return true;
}
if(sourceType.isPrimitive()) {
if(sourceType == void.class) {
- return false; // Void can't be losslessly represented by any type
+ // Void should be losslessly representable by Object, either as null or as a custom value that
+ // can be set with DynamicLinkerFactory.setAutoConversionStrategy.
+ return targetType == Object.class;
}
if(targetType.isPrimitive()) {
return isProperPrimitiveLosslessSubtype(sourceType, targetType);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptObjectMirror.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/scripting/ScriptObjectMirror.java Tue Jan 27 13:58:55 2015 -0500
@@ -340,9 +340,10 @@
@Override
public boolean containsKey(final Object key) {
+ checkKey(key);
return inGlobal(new Callable<Boolean>() {
@Override public Boolean call() {
- return sobj.containsKey(unwrap(key, global));
+ return sobj.containsKey(key);
}
});
}
@@ -376,6 +377,7 @@
@Override
public Object get(final Object key) {
+ checkKey(key);
return inGlobal(new Callable<Object>() {
@Override public Object call() {
return translateUndefined(wrap(sobj.get(key), global));
@@ -410,6 +412,7 @@
@Override
public Object put(final String key, final Object value) {
+ checkKey(key);
final ScriptObject oldGlobal = Context.getGlobal();
final boolean globalChanged = (oldGlobal != global);
return inGlobal(new Callable<Object>() {
@@ -422,6 +425,9 @@
@Override
public void putAll(final Map<? extends String, ? extends Object> map) {
+ if (map == null) {
+ throw new NullPointerException("map is null");
+ }
final ScriptObject oldGlobal = Context.getGlobal();
final boolean globalChanged = (oldGlobal != global);
inGlobal(new Callable<Object>() {
@@ -429,7 +435,9 @@
for (final Map.Entry<? extends String, ? extends Object> entry : map.entrySet()) {
final Object value = entry.getValue();
final Object modValue = globalChanged? wrap(value, oldGlobal) : value;
- sobj.set(entry.getKey(), unwrap(modValue, global), getCallSiteFlags());
+ final String key = entry.getKey();
+ checkKey(key);
+ sobj.set(key, unwrap(modValue, global), getCallSiteFlags());
}
return null;
}
@@ -438,9 +446,10 @@
@Override
public Object remove(final Object key) {
+ checkKey(key);
return inGlobal(new Callable<Object>() {
@Override public Object call() {
- return wrap(sobj.remove(unwrap(key, global), strict), global);
+ return wrap(sobj.remove(key, strict), global);
}
});
}
@@ -629,7 +638,7 @@
}
/**
- * Utilitity to convert this script object to the given type.
+ * Utility to convert this script object to the given type.
*
* @param <T> destination type to convert to
* @param type destination type to convert to
@@ -786,6 +795,24 @@
}
}
+ /**
+ * Ensures the key is not null, empty string, or a non-String object. The contract of the {@link Bindings}
+ * interface requires that these are not accepted as keys.
+ * @param key the key to check
+ * @throws NullPointerException if key is null
+ * @throws ClassCastException if key is not a String
+ * @throws IllegalArgumentException if key is empty string
+ */
+ private static void checkKey(final Object key) {
+ if (key == null) {
+ throw new NullPointerException("key can not be null");
+ } else if (!(key instanceof String)) {
+ throw new ClassCastException("key should be a String. It is " + key.getClass().getName() + " instead.");
+ } else if (((String)key).length() == 0) {
+ throw new IllegalArgumentException("key can not be empty");
+ }
+ }
+
@Override
public double toNumber() {
return inGlobal(new Callable<Double>() {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Context.java Tue Jan 27 13:58:55 2015 -0500
@@ -703,7 +703,7 @@
final ScriptFunction func = getProgramFunction(clazz, scope);
Object evalThis;
if (directEval) {
- evalThis = callThis instanceof ScriptObject || strictFlag ? callThis : global;
+ evalThis = (callThis != UNDEFINED && callThis != null) || strictFlag ? callThis : global;
} else {
evalThis = global;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ArrayData.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ArrayData.java Tue Jan 27 13:58:55 2015 -0500
@@ -26,6 +26,7 @@
package jdk.nashorn.internal.runtime.arrays;
import static jdk.nashorn.internal.codegen.CompilerConstants.staticCall;
+
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Array;
@@ -761,39 +762,6 @@
}
/**
- * Push an array of items to the end of the array
- *
- * @param strict are we in strict mode
- * @param item the item
- * @return new array data (or same)
- */
- public ArrayData push(final boolean strict, final double item) {
- return push(strict, item);
- }
-
- /**
- * Push an array of items to the end of the array
- *
- * @param strict are we in strict mode
- * @param item the item
- * @return new array data (or same)
- */
- public ArrayData push(final boolean strict, final long item) {
- return push(strict, item);
- }
-
- /**
- * Push an array of items to the end of the array
- *
- * @param strict are we in strict mode
- * @param item the item
- * @return new array data (or same)
- */
- public ArrayData push(final boolean strict, final int item) {
- return push(strict, item);
- }
-
- /**
* Pop an element from the end of the array
*
* @return the popped element
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java Tue Jan 27 13:58:55 2015 -0500
@@ -26,6 +26,7 @@
package jdk.nashorn.internal.runtime.arrays;
import static jdk.nashorn.internal.codegen.CompilerConstants.specialCall;
+
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.util.Arrays;
@@ -343,17 +344,6 @@
}
@Override
- public final ArrayData push(final boolean strict, final int item) {
- final long len = length();
- final ArrayData newData = ensure(len);
- if (newData == this) {
- array[(int)len] = item;
- return this;
- }
- return newData.set((int)len, item, strict);
- }
-
- @Override
public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException {
final long oldLength = length();
final long newLength = oldLength - removed + added;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LongArrayData.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/LongArrayData.java Tue Jan 27 13:58:55 2015 -0500
@@ -27,6 +27,7 @@
import static jdk.nashorn.internal.codegen.CompilerConstants.specialCall;
import static jdk.nashorn.internal.lookup.Lookup.MH;
+
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.util.Arrays;
@@ -303,17 +304,6 @@
}
@Override
- public final ArrayData push(final boolean strict, final long item) {
- final long len = length();
- final ArrayData newData = ensure(len);
- if (newData == this) {
- array[(int)len] = item;
- return this;
- }
- return newData.set((int)len, item, strict);
- }
-
- @Override
public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException {
final long oldLength = length();
final long newLength = oldLength - removed + added;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java Tue Jan 27 13:58:55 2015 -0500
@@ -28,6 +28,7 @@
import static jdk.nashorn.internal.codegen.CompilerConstants.specialCall;
import static jdk.nashorn.internal.lookup.Lookup.MH;
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
+
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.util.Arrays;
@@ -277,17 +278,6 @@
}
@Override
- public final ArrayData push(final boolean strict, final double item) {
- final long len = length();
- final ArrayData newData = ensure(len);
- if (newData == this) {
- array[(int)len] = item;
- return this;
- }
- return newData.set((int)len, item, strict);
- }
-
- @Override
public ArrayData fastSplice(final int start, final int removed, final int added) throws UnsupportedOperationException {
final long oldLength = length();
final long newLength = oldLength - removed + added;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/Bootstrap.java Tue Jan 27 13:58:55 2015 -0500
@@ -68,6 +68,8 @@
private static final MethodHandleFunctionality MH = MethodHandleFactory.getFunctionality();
+ private static final MethodHandle VOID_TO_OBJECT = MH.constant(Object.class, ScriptRuntime.UNDEFINED);
+
/**
* The default dynalink relink threshold for megamorphisism is 8. In the case
* of object fields only, it is fine. However, with dual fields, in order to get
@@ -189,7 +191,7 @@
* @return true if the obj is an instance of @FunctionalInterface interface
*/
public static boolean isFunctionalInterfaceObject(final Object obj) {
- return !JSType.isPrimitive(obj) && (NashornBottomLinker.getFunctionalInterfaceMethod(obj.getClass()) != null);
+ return !JSType.isPrimitive(obj) && (NashornBeansLinker.getFunctionalInterfaceMethod(obj.getClass()) != null);
}
/**
@@ -481,14 +483,16 @@
private static MethodHandle unboxReturnType(final MethodHandle target, final MethodType newType) {
final MethodType targetType = target.type();
final Class<?> oldReturnType = targetType.returnType();
+ final Class<?> newReturnType = newType.returnType();
if (TypeUtilities.isWrapperType(oldReturnType)) {
- final Class<?> newReturnType = newType.returnType();
if (newReturnType.isPrimitive()) {
// The contract of setAutoConversionStrategy is such that the difference between newType and targetType
// can only be JLS method invocation conversions.
assert TypeUtilities.isMethodInvocationConvertible(oldReturnType, newReturnType);
return MethodHandles.explicitCastArguments(target, targetType.changeReturnType(newReturnType));
}
+ } else if (oldReturnType == void.class && newReturnType == Object.class) {
+ return MethodHandles.filterReturnValue(target, VOID_TO_OBJECT);
}
return target;
}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBeansLinker.java Tue Jan 27 13:58:55 2015 -0500
@@ -25,20 +25,29 @@
package jdk.nashorn.internal.runtime.linker;
+import static jdk.nashorn.internal.lookup.Lookup.MH;
+import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
+
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import jdk.internal.dynalink.CallSiteDescriptor;
import jdk.internal.dynalink.beans.BeansLinker;
import jdk.internal.dynalink.linker.ConversionComparator.Comparison;
import jdk.internal.dynalink.linker.GuardedInvocation;
import jdk.internal.dynalink.linker.GuardingDynamicLinker;
import jdk.internal.dynalink.linker.LinkRequest;
import jdk.internal.dynalink.linker.LinkerServices;
+import jdk.internal.dynalink.support.Guards;
import jdk.internal.dynalink.support.Lookup;
import jdk.nashorn.api.scripting.ScriptUtils;
import jdk.nashorn.internal.objects.NativeArray;
import jdk.nashorn.internal.runtime.ConsString;
+import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ScriptObject;
+import jdk.nashorn.internal.runtime.ScriptRuntime;
import jdk.nashorn.internal.runtime.options.Options;
/**
@@ -68,19 +77,49 @@
FILTER_CONSSTRING = lookup.findOwnStatic("consStringFilter", Object.class, Object.class);
}
+ // cache of @FunctionalInterface method of implementor classes
+ private static final ClassValue<Method> FUNCTIONAL_IFACE_METHOD = new ClassValue<Method>() {
+ @Override
+ protected Method computeValue(final Class<?> type) {
+ return findFunctionalInterfaceMethod(type);
+ }
+ };
+
private final BeansLinker beansLinker = new BeansLinker();
@Override
public GuardedInvocation getGuardedInvocation(final LinkRequest linkRequest, final LinkerServices linkerServices) throws Exception {
- if (linkRequest.getReceiver() instanceof ConsString) {
+ final Object self = linkRequest.getReceiver();
+ final CallSiteDescriptor desc = linkRequest.getCallSiteDescriptor();
+ if (self instanceof ConsString) {
// In order to treat ConsString like a java.lang.String we need a link request with a string receiver.
final Object[] arguments = linkRequest.getArguments();
arguments[0] = "";
- final LinkRequest forgedLinkRequest = linkRequest.replaceArguments(linkRequest.getCallSiteDescriptor(), arguments);
+ final LinkRequest forgedLinkRequest = linkRequest.replaceArguments(desc, arguments);
final GuardedInvocation invocation = getGuardedInvocation(beansLinker, forgedLinkRequest, linkerServices);
// If an invocation is found we add a filter that makes it work for both Strings and ConsStrings.
return invocation == null ? null : invocation.filterArguments(0, FILTER_CONSSTRING);
}
+
+ if (self != null && "call".equals(desc.getNameToken(CallSiteDescriptor.OPERATOR))) {
+ // Support dyn:call on any object that supports some @FunctionalInterface
+ // annotated interface. This way Java method, constructor references or
+ // implementations of java.util.function.* interfaces can be called as though
+ // those are script functions.
+ final Method m = getFunctionalInterfaceMethod(self.getClass());
+ if (m != null) {
+ final MethodType callType = desc.getMethodType();
+ // 'callee' and 'thiz' passed from script + actual arguments
+ if (callType.parameterCount() != m.getParameterCount() + 2) {
+ throw typeError("no.method.matches.args", ScriptRuntime.safeToString(self));
+ }
+ return new GuardedInvocation(
+ // drop 'thiz' passed from the script.
+ MH.dropArguments(desc.getLookup().unreflect(m), 1, callType.parameterType(1)),
+ Guards.getInstanceOfGuard(m.getDeclaringClass())).asTypeSafeReturn(
+ new NashornBeansLinkerServices(linkerServices), callType);
+ }
+ }
return getGuardedInvocation(beansLinker, linkRequest, linkerServices);
}
@@ -137,6 +176,38 @@
return arg instanceof ConsString ? arg.toString() : arg;
}
+ private static Method findFunctionalInterfaceMethod(final Class<?> clazz) {
+ if (clazz == null) {
+ return null;
+ }
+
+ for (final Class<?> iface : clazz.getInterfaces()) {
+ // check accessiblity up-front
+ if (! Context.isAccessibleClass(iface)) {
+ continue;
+ }
+
+ // check for @FunctionalInterface
+ if (iface.isAnnotationPresent(FunctionalInterface.class)) {
+ // return the first abstract method
+ for (final Method m : iface.getMethods()) {
+ if (Modifier.isAbstract(m.getModifiers())) {
+ return m;
+ }
+ }
+ }
+ }
+
+ // did not find here, try super class
+ return findFunctionalInterfaceMethod(clazz.getSuperclass());
+ }
+
+ // Returns @FunctionalInterface annotated interface's single abstract
+ // method. If not found, returns null.
+ static Method getFunctionalInterfaceMethod(final Class<?> clazz) {
+ return FUNCTIONAL_IFACE_METHOD.get(clazz);
+ }
+
private static class NashornBeansLinkerServices implements LinkerServices {
private final LinkerServices linkerServices;
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornBottomLinker.java Tue Jan 27 13:58:55 2015 -0500
@@ -30,9 +30,6 @@
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodType;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import jdk.internal.dynalink.CallSiteDescriptor;
@@ -45,7 +42,6 @@
import jdk.internal.dynalink.linker.LinkerServices;
import jdk.internal.dynalink.support.Guards;
import jdk.nashorn.internal.codegen.types.Type;
-import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.JSType;
import jdk.nashorn.internal.runtime.ScriptRuntime;
import jdk.nashorn.internal.runtime.UnwarrantedOptimismException;
@@ -95,22 +91,6 @@
}
throw typeError("not.a.function", ScriptRuntime.safeToString(self));
case "call":
- // Support dyn:call on any object that supports some @FunctionalInterface
- // annotated interface. This way Java method, constructor references or
- // implementations of java.util.function.* interfaces can be called as though
- // those are script functions.
- final Method m = getFunctionalInterfaceMethod(self.getClass());
- if (m != null) {
- final MethodType callType = desc.getMethodType();
- // 'callee' and 'thiz' passed from script + actual arguments
- if (callType.parameterCount() != m.getParameterCount() + 2) {
- throw typeError("no.method.matches.args", ScriptRuntime.safeToString(self));
- }
- return Bootstrap.asTypeSafeReturn(new GuardedInvocation(
- // drop 'thiz' passed from the script.
- MH.dropArguments(desc.getLookup().unreflect(m), 1, callType.parameterType(1)),
- Guards.getInstanceOfGuard(m.getDeclaringClass())), linkerServices, desc);
- }
if(BeansLinker.isDynamicConstructor(self)) {
throw typeError("constructor.requires.new", ScriptRuntime.safeToString(self));
}
@@ -218,44 +198,4 @@
}
return ScriptRuntime.safeToString(linkRequest.getArguments()[1]);
}
-
- // cache of @FunctionalInterface method of implementor classes
- private static final ClassValue<Method> FUNCTIONAL_IFACE_METHOD = new ClassValue<Method>() {
- @Override
- protected Method computeValue(final Class<?> type) {
- return findFunctionalInterfaceMethod(type);
- }
-
- private Method findFunctionalInterfaceMethod(final Class<?> clazz) {
- if (clazz == null) {
- return null;
- }
-
- for (final Class<?> iface : clazz.getInterfaces()) {
- // check accessiblity up-front
- if (! Context.isAccessibleClass(iface)) {
- continue;
- }
-
- // check for @FunctionalInterface
- if (iface.isAnnotationPresent(FunctionalInterface.class)) {
- // return the first abstract method
- for (final Method m : iface.getMethods()) {
- if (Modifier.isAbstract(m.getModifiers())) {
- return m;
- }
- }
- }
- }
-
- // did not find here, try super class
- return findFunctionalInterfaceMethod(clazz.getSuperclass());
- }
- };
-
- // Returns @FunctionalInterface annotated interface's single abstract
- // method. If not found, returns null.
- static Method getFunctionalInterfaceMethod(final Class<?> clazz) {
- return FUNCTIONAL_IFACE_METHOD.get(clazz);
- }
}
--- a/nashorn/test/script/basic/JDK-8020324.js.EXPECTED Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/test/script/basic/JDK-8020324.js.EXPECTED Tue Jan 27 13:58:55 2015 -0500
@@ -17,7 +17,7 @@
bean.readWrite = 18: 18
obj1.readWrite: 18
obj1.getReadWrite(): 18
-obj1.setReadWrite(19): null
+obj1.setReadWrite(19): undefined
obj1.readWrite: 19
bean.readWrite: 19
@@ -52,7 +52,7 @@
PropertyBind.staticReadWrite = 26: 26
obj2.staticReadWrite: 26
obj2.getStaticReadWrite(): 26
-obj2.setStaticReadWrite(27): null
+obj2.setStaticReadWrite(27): undefined
obj2.staticReadWrite: 27
PropertyBind.staticReadWrite: 27
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8068573.js Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8068573: POJO setter using [] syntax throws an exception
+ *
+ * @test
+ * @run
+ */
+
+// Invoke a setter using []. It's important that the setter returns void.
+var pb = new (Java.type("jdk.nashorn.test.models.PropertyBind"))
+var n = "writeOnly";
+pb[n] = 2;
+Assert.assertEquals(pb.peekWriteOnly(), 2);
+
+// Invoke an overloaded setter using []. It's important that one of the
+// overloads returns void.
+var os = new (Java.type("jdk.nashorn.test.models.OverloadedSetter"))
+var n2 = "color";
+os[n2] = 3; // exercise int overload
+Assert.assertEquals(os.peekColor(), "3");
+os[n2] = "blue"; // exercise string overload
+Assert.assertEquals(os.peekColor(), "blue");
+for each(var x in [42, "42"]) {
+ os[n2] = x; // exercise both overloads in the same call site
+ Assert.assertEquals(os.peekColor(), "42");
+}
+
+// Invoke an overloaded method using [], repeatedly in the same call
+// site. It's important that one of the overloads returns void.
+var n3="foo";
+var param=["xyz", 1, "zyx", 2];
+var expected=["boo", void 0, "boo", void 0];
+for(var i in param) {
+ Assert.assertEquals(os[n3](param[i]), expected[i]);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8068985.js Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2015 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8068985: Wrong 'this' bound to eval call within a function when caller's 'this' is a Java object
+ *
+ * @test
+ * @run
+ */
+
+function func(arg) {
+ (function() { print(eval('this')); }).call(arg);
+}
+
+// primitives
+func(undefined);
+func(null);
+func(34.23);
+func("hello");
+func(false);
+
+// script objects
+func(this);
+func({});
+func({ toString: function() { return "foo" } });
+
+// java objects
+func(new java.util.Vector());
+var m = new java.util.HashMap();
+m.put("foo", "bar");
+func(m);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8068985.js.EXPECTED Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,10 @@
+[object global]
+[object global]
+34.23
+hello
+false
+[object global]
+[object Object]
+foo
+[]
+{foo=bar}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/basic/JDK-8069002.js Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2014 Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8069002: NPE on invoking null (8068889 regression)
+ *
+ * @test
+ * @run
+ */
+
+try {
+ null();
+} catch (e) {
+ Assert.assertTrue(e instanceof TypeError);
+}
--- a/nashorn/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Mon Jan 26 19:01:50 2015 +0300
+++ b/nashorn/test/src/jdk/nashorn/api/scripting/ScriptEngineTest.java Tue Jan 27 13:58:55 2015 -0500
@@ -30,12 +30,18 @@
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
+
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
+import java.util.Collections;
import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import javax.script.Bindings;
import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.Invocable;
@@ -680,6 +686,163 @@
assertNull(value);
}
+ // @bug JDK-8068889: ConsString arguments to a functional interface wasn't converted to string.
+ @Test
+ public void functionalInterfaceStringTest() throws Exception {
+ final ScriptEngineManager manager = new ScriptEngineManager();
+ final ScriptEngine e = manager.getEngineByName("nashorn");
+ final AtomicBoolean invoked = new AtomicBoolean(false);
+ e.put("f", new Function<String, String>() {
+ @Override
+ public String apply(String t) {
+ invoked.set(true);
+ return t;
+ }
+ });
+ assertEquals(e.eval("var x = 'a'; x += 'b'; f(x)"), "ab");
+ assertTrue(invoked.get());
+ }
+
+ // @bug JDK-8068889: ScriptObject arguments to a functional interface wasn't converted to a mirror.
+ @Test
+ public void functionalInterfaceObjectTest() throws Exception {
+ final ScriptEngineManager manager = new ScriptEngineManager();
+ final ScriptEngine e = manager.getEngineByName("nashorn");
+ final AtomicBoolean invoked = new AtomicBoolean(false);
+ e.put("c", new Consumer<Object>() {
+ @Override
+ public void accept(Object t) {
+ assertTrue(t instanceof ScriptObjectMirror);
+ assertEquals(((ScriptObjectMirror)t).get("a"), "xyz");
+ invoked.set(true);
+ }
+ });
+ e.eval("var x = 'xy'; x += 'z';c({a:x})");
+ assertTrue(invoked.get());
+ }
+
+ // @bug JDK-8068603: NashornScriptEngine.put/get() impls don't conform to NPE, IAE spec assertions
+ @Test
+ public void illegalBindingsValuesTest() throws Exception {
+ final ScriptEngineManager manager = new ScriptEngineManager();
+ final ScriptEngine e = manager.getEngineByName("nashorn");
+
+ try {
+ e.put(null, "null-value");
+ fail();
+ } catch (NullPointerException x) {
+ // expected
+ }
+
+ try {
+ e.put("", "empty-value");
+ fail();
+ } catch (IllegalArgumentException x) {
+ // expected
+ }
+
+ final Bindings b = e.getBindings(ScriptContext.ENGINE_SCOPE);
+ assertTrue(b instanceof ScriptObjectMirror);
+
+ try {
+ b.put(null, "null-value");
+ fail();
+ } catch (NullPointerException x) {
+ // expected
+ }
+
+ try {
+ b.put("", "empty-value");
+ fail();
+ } catch (IllegalArgumentException x) {
+ // expected
+ }
+
+ try {
+ b.get(null);
+ fail();
+ } catch (NullPointerException x) {
+ // expected
+ }
+
+ try {
+ b.get("");
+ fail();
+ } catch (IllegalArgumentException x) {
+ // expected
+ }
+
+ try {
+ b.get(1);
+ fail();
+ } catch (ClassCastException x) {
+ // expected
+ }
+
+ try {
+ b.remove(null);
+ fail();
+ } catch (NullPointerException x) {
+ // expected
+ }
+
+ try {
+ b.remove("");
+ fail();
+ } catch (IllegalArgumentException x) {
+ // expected
+ }
+
+ try {
+ b.remove(1);
+ fail();
+ } catch (ClassCastException x) {
+ // expected
+ }
+
+ try {
+ b.containsKey(null);
+ fail();
+ } catch (NullPointerException x) {
+ // expected
+ }
+
+ try {
+ b.containsKey("");
+ fail();
+ } catch (IllegalArgumentException x) {
+ // expected
+ }
+
+ try {
+ b.containsKey(1);
+ fail();
+ } catch (ClassCastException x) {
+ // expected
+ }
+
+ try {
+ b.putAll(null);
+ fail();
+ } catch (NullPointerException x) {
+ // expected
+ }
+
+ try {
+ b.putAll(Collections.singletonMap((String)null, "null-value"));
+ fail();
+ } catch (NullPointerException x) {
+ // expected
+ }
+
+ try {
+ b.putAll(Collections.singletonMap("", "empty-value"));
+ fail();
+ } catch (IllegalArgumentException x) {
+ // expected
+ }
+ }
+
private static void checkProperty(final ScriptEngine e, final String name)
throws ScriptException {
final String value = System.getProperty(name);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/src/jdk/nashorn/test/models/OverloadedSetter.java Tue Jan 27 13:58:55 2015 -0500
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. 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 jdk.nashorn.test.models;
+
+public class OverloadedSetter {
+ private String color;
+
+ public void setColor(final int x) {
+ this.color = Integer.toString(x);
+ }
+
+ public void setColor(final String x) {
+ this.color = x;
+ }
+
+ public String peekColor() {
+ return color;
+ }
+
+ public void foo(final int x) {
+ }
+
+ public String foo(final String x) {
+ return "boo";
+ }
+}
--- a/test/lib/sun/hotspot/WhiteBox.java Mon Jan 26 19:01:50 2015 +0300
+++ b/test/lib/sun/hotspot/WhiteBox.java Tue Jan 27 13:58:55 2015 -0500
@@ -84,6 +84,8 @@
return isClassAlive0(name.replace('.', '/'));
}
private native boolean isClassAlive0(String name);
+ public native boolean isMonitorInflated(Object obj);
+ public native void forceSafepoint();
// JVMTI
public native void addToBootstrapClassLoaderSearch(String segment);
--- a/test/lib/sun/hotspot/code/BlobType.java Mon Jan 26 19:01:50 2015 +0300
+++ b/test/lib/sun/hotspot/code/BlobType.java Tue Jan 27 13:58:55 2015 -0500
@@ -32,11 +32,11 @@
public enum BlobType {
// Execution level 1 and 4 (non-profiled) nmethods (including native nmethods)
- MethodNonProfiled(0, "CodeHeap 'non-profiled nmethods'"),
+ MethodNonProfiled(0, "CodeHeap 'non-profiled nmethods'", "NonProfiledCodeHeapSize"),
// Execution level 2 and 3 (profiled) nmethods
- MethodProfiled(1, "CodeHeap 'profiled nmethods'"),
+ MethodProfiled(1, "CodeHeap 'profiled nmethods'", "ProfiledCodeHeapSize"),
// Non-nmethods like Buffers, Adapters and Runtime Stubs
- NonNMethod(2, "CodeHeap 'non-nmethods'") {
+ NonNMethod(2, "CodeHeap 'non-nmethods'", "NonNMethodCodeHeapSize") {
@Override
public boolean allowTypeWhenOverflow(BlobType type) {
return super.allowTypeWhenOverflow(type)
@@ -44,14 +44,16 @@
}
},
// All types (No code cache segmentation)
- All(3, "CodeCache");
+ All(3, "CodeCache", "ReservedCodeCacheSize");
public final int id;
- private final String beanName;
+ public final String sizeOptionName;
+ public final String beanName;
- private BlobType(int id, String beanName) {
+ private BlobType(int id, String beanName, String sizeOptionName) {
this.id = id;
this.beanName = beanName;
+ this.sizeOptionName = sizeOptionName;
}
public MemoryPoolMXBean getMemoryPool() {
@@ -87,4 +89,8 @@
}
return result;
}
+
+ public long getSize() {
+ return WhiteBox.getWhiteBox().getUintxVMFlag(sizeOptionName);
+ }
}