mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-19 04:13:07 +00:00
Merge
This commit is contained in:
commit
fb0b5b0159
2
.hgtags
2
.hgtags
@ -288,3 +288,5 @@ b409bc51bc23cfd51f2bd04ea919ec83535af9d0 jdk9-b37
|
||||
6494b13f88a867026ee316b444d9a4fa589dd6bd jdk9-b43
|
||||
abbfccd659b91a7bb815d5e36fed635dcdd40f31 jdk9-b44
|
||||
bfc24ae2b900187585079bb11e66e459d1e525fe jdk9-b45
|
||||
722378bc599e38d9a1dd484de30f10dfd7b21438 jdk9-b46
|
||||
8327024a99559982b848e9c2191da9c0bf8838fd jdk9-b47
|
||||
|
||||
@ -288,3 +288,5 @@ f7c11da0b0481d49cc7a65a453336c108191e821 jdk9-b42
|
||||
02ee8c65622e8bd97496d584e22fc7dcf0edc4ae jdk9-b43
|
||||
8994f5d87b3bb5e8d317d4e8ccb326da1a73684a jdk9-b44
|
||||
3dd628fde2086218d548841022ee8436b6b88185 jdk9-b45
|
||||
12f1e276447bcc81516e85367d53e4f08897049d jdk9-b46
|
||||
b6cca3e6175a69f39e5799b7349ddb0176630291 jdk9-b47
|
||||
|
||||
7
common/autoconf/configure
vendored
7
common/autoconf/configure
vendored
@ -36,6 +36,13 @@ else
|
||||
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
|
||||
|
||||
@ -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 @@ diff_text() {
|
||||
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 @@ diff_text() {
|
||||
-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 @@ diff_text() {
|
||||
# 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 @@ diff_text() {
|
||||
# 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 @@ compare_dirs() {
|
||||
(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 @@ compare_files() {
|
||||
|
||||
(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 @@ compare_permissions() {
|
||||
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 @@ compare_file_types() {
|
||||
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 @@ compare_general_files() {
|
||||
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 @@ compare_zip_file() {
|
||||
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 @@ compare_zip_file() {
|
||||
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 @@ compare_zip_file() {
|
||||
|
||||
$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 @@ compare_bin_file() {
|
||||
|
||||
$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 @@ compare_bin_file() {
|
||||
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 @@ compare_bin_file() {
|
||||
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 @@ compare_bin_file() {
|
||||
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 @@ compare_bin_file() {
|
||||
SYM_MSG=" $SYM_MSG "
|
||||
fi
|
||||
else
|
||||
SYM_MSG="($SYM_MSG)"
|
||||
SYM_MSG="($SYM_MSG)"
|
||||
DIFF_SYM=
|
||||
fi
|
||||
else
|
||||
@ -754,48 +760,48 @@ compare_bin_file() {
|
||||
|
||||
# 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_bin_file() {
|
||||
|
||||
# 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 @@ compare_all_libs() {
|
||||
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 @@ COMPARE_ROOT=/tmp/cimages.$USER
|
||||
$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 @@ while [ -n "$1" ]; do
|
||||
CMP_JARS=true
|
||||
CMP_LIBS=true
|
||||
CMP_EXECS=true
|
||||
|
||||
|
||||
if [ -z "$FILTER" ]; then
|
||||
FILTER="$GREP"
|
||||
fi
|
||||
@ -1177,8 +1188,8 @@ if [ "$SKIP_DEFAULT" != "true" ]; then
|
||||
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 @@ if [ "$SKIP_DEFAULT" != "true" ]; then
|
||||
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 [ "$SKIP_DEFAULT" != "true" ]; then
|
||||
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 @@ if [ "$CMP_NAMES" = "true" ]; then
|
||||
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 @@ if [ "$CMP_NAMES" = "true" ]; then
|
||||
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 @@ if [ "$CMP_NAMES" = "true" ]; then
|
||||
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 [ "$CMP_PERMS" = "true" ]; then
|
||||
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 [ "$CMP_TYPES" = "true" ]; then
|
||||
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 [ "$CMP_GENERAL" = "true" ]; then
|
||||
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 [ "$CMP_ZIPS" = "true" ]; then
|
||||
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 [ "$CMP_JARS" = "true" ]; then
|
||||
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 [ "$CMP_LIBS" = "true" ]; then
|
||||
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
|
||||
|
||||
@ -288,3 +288,5 @@ e27c725d6c9d155667b35255f442d4ceb8c3c084 jdk9-b40
|
||||
9645e35616b60c5c07b4fdf11a132afc8081dfa8 jdk9-b43
|
||||
1f57bd728c9e6865ccb9d43ccd80a1c11230a32f jdk9-b44
|
||||
9e3f2bed80c0e5a84a256ce41f1d10c5ade48466 jdk9-b45
|
||||
326f2068b4a4c05e2fa27d6acf93eba7b54b090d jdk9-b46
|
||||
ee8447ca632e1d39180b4767c749db101bff7314 jdk9-b47
|
||||
|
||||
@ -448,3 +448,5 @@ c363a8b87e477ee45d6d3cb2a36cb365141bc596 jdk9-b38
|
||||
65a9747147b8090037541040ba67156ec914db6a jdk9-b43
|
||||
43a44b56dca61a4d766a20f0528fdd8b5ceff873 jdk9-b44
|
||||
5dc8184af1e2bb30b0103113d1f1a58a21a80c37 jdk9-b45
|
||||
a184ee1d717297bd35b7c3e35393e137921a3ed2 jdk9-b46
|
||||
3b241fb72b8925b75941d612db762a6d5da66d02 jdk9-b47
|
||||
|
||||
@ -246,8 +246,7 @@ endif
|
||||
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; \
|
||||
|
||||
@ -240,8 +240,7 @@ endif
|
||||
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; \
|
||||
|
||||
@ -179,23 +179,23 @@ $(GENOFFS): $(DTRACE_SRCDIR)/$(GENOFFS)Main.c lib$(GENOFFS).dylib
|
||||
# $@.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
|
||||
|
||||
@ -59,7 +59,7 @@ universalize: $(UNIVERSAL_LIPO_LIST) $(UNIVERSAL_COPY_LIST)
|
||||
|
||||
# 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 @@ $(UNIVERSAL_LIPO_LIST):
|
||||
# - 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 $@); \
|
||||
|
||||
@ -246,8 +246,7 @@ endif
|
||||
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; \
|
||||
|
||||
@ -340,10 +340,8 @@ $(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) $(LD_SCRIPT)
|
||||
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 \
|
||||
|
||||
@ -39,6 +39,7 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/asm/*.java \
|
||||
$(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/bsd/x86/*.java \
|
||||
$(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/sparc/*.java \
|
||||
$(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_sparc/*.java \
|
||||
$(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 \
|
||||
|
||||
@ -190,8 +190,7 @@ endif
|
||||
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; \
|
||||
|
||||
@ -171,11 +171,11 @@ $(GENOFFS): $(DTRACE_SRCDIR)/$(GENOFFS)Main.c lib$(GENOFFS).so
|
||||
./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)
|
||||
|
||||
@ -567,16 +567,21 @@ class MacroAssembler: public Assembler {
|
||||
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);
|
||||
|
||||
@ -311,11 +311,14 @@ inline void MacroAssembler::load_with_trap_null_check(Register d, int si16, Regi
|
||||
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 void MacroAssembler::load_heap_oop(Register d, RegisterOrConstant offs, R
|
||||
}
|
||||
|
||||
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 @@ inline void MacroAssembler::decode_heap_oop(Register d) {
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
@ -172,15 +172,15 @@ void MethodHandles::jump_to_lambda_form(MacroAssembler* _masm,
|
||||
|
||||
// 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 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
|
||||
}
|
||||
|
||||
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 @@ void MethodHandles::generate_method_handle_dispatch(MacroAssembler* _masm,
|
||||
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 @@ void MethodHandles::generate_method_handle_dispatch(MacroAssembler* _masm,
|
||||
}
|
||||
|
||||
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 @@ void trace_method_handle_stub(const char* adaptername,
|
||||
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 @@ void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adapt
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
@ -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 @@ encode %{
|
||||
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 @@ encode %{
|
||||
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 @@ instruct clearMs32b(iRegNdst dst, iRegNsrc src) %{
|
||||
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 @@ instruct cond_set_0_oop(iRegNdst dst, flagsReg crx, iRegPsrc src1) %{
|
||||
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()*/);
|
||||
predicate(Universe::narrow_oop_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);
|
||||
@ -6745,7 +6758,7 @@ instruct encodeP_Ex(iRegNdst dst, flagsReg crx, iRegPsrc src) %{
|
||||
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 @@ instruct encodeP_not_null_Ex(iRegNdst dst, iRegPsrc src) %{
|
||||
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 @@ instruct decodeN_Ex(iRegPdst dst, iRegNsrc src, flagsReg crx) %{
|
||||
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 @@ instruct decodeN_nullBase(iRegPdst dst, iRegNsrc src) %{
|
||||
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 @@ instruct decodeN_notNull_addBase_Ex(iRegPdst dst, iRegNsrc src) %{
|
||||
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 @@ instruct encodePKlass_sub_base(iRegPdst dst, iRegLsrc base, iRegPdst src) %{
|
||||
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 @@ instruct storeLConditional_regP_regL_regL(flagsReg crx, indirect mem_ptr, iRegLs
|
||||
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 @@ instruct cmpN_reg_reg(flagsReg crx, iRegNsrc src1, iRegNsrc src2) %{
|
||||
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_reg(flagsReg crx, iRegNsrc src1, iRegNsrc src2) %{
|
||||
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 @@ instruct zeroCheckP_reg_imm0(cmpOp cmp, iRegP_N2P value, immP_0 zero, label labl
|
||||
_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 branchLoopEndSched(cmpOp cmp, flagsReg crx, label labl) %{
|
||||
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 @@ instruct string_indexOf_imm1_char(iRegIdst result, iRegPsrc haystack, iRegIsrc h
|
||||
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 @@ instruct string_indexOf_imm1(iRegIdst result, iRegPsrc haystack, iRegIsrc haycnt
|
||||
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 @@ instruct string_indexOf_imm(iRegIdst result, iRegPsrc haystack, rscratch1RegI ha
|
||||
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 @@ instruct string_indexOf(iRegIdst result, iRegPsrc haystack, rscratch1RegI haycnt
|
||||
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 @@ instruct string_equals_imm(iRegPsrc str1, iRegPsrc str2, uimmI15 cntImm, iRegIds
|
||||
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 @@ instruct string_equals(iRegPsrc str1, iRegPsrc str2, iRegIsrc cnt, iRegIdst resu
|
||||
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_equals(iRegPsrc str1, iRegPsrc str2, iRegIsrc cnt, iRegIdst resu
|
||||
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.
|
||||
|
||||
@ -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 @@ void G1PreBarrierStub::emit_code(LIR_Assembler* ce) {
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
||||
@ -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 @@ void G1PreBarrierStub::emit_code(LIR_Assembler* ce) {
|
||||
|
||||
}
|
||||
|
||||
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.");
|
||||
|
||||
@ -197,7 +197,38 @@ static pid_t filename_to_pid(const char* filename) {
|
||||
}
|
||||
|
||||
|
||||
// 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 @@ static bool is_directory_secure(const char* path) {
|
||||
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;
|
||||
}
|
||||
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;
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
||||
|
||||
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 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
||||
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 @@ static void remove_file(const char* path) {
|
||||
}
|
||||
|
||||
|
||||
// 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 remove_file(const char* dirname, const char* filename) {
|
||||
//
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
//
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
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 @@ static int create_sharedmem_resources(const char* dirname, const char* filename,
|
||||
return -1;
|
||||
}
|
||||
|
||||
int result;
|
||||
|
||||
RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result);
|
||||
if (result == OS_ERR) {
|
||||
if (PrintMiscellaneous && Verbose) {
|
||||
warning("could not create file %s: %s\n", filename, strerror(errno));
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
// 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) {
|
||||
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 @@ static int open_sharedmem_file(const char* filename, int oflags, TRAPS) {
|
||||
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 @@ static char* mmap_create_shared(size_t size) {
|
||||
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 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
||||
// 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");
|
||||
|
||||
@ -197,7 +197,38 @@ static pid_t filename_to_pid(const char* filename) {
|
||||
}
|
||||
|
||||
|
||||
// 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 @@ static bool is_directory_secure(const char* path) {
|
||||
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;
|
||||
}
|
||||
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;
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
||||
|
||||
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 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
||||
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 @@ static void remove_file(const char* path) {
|
||||
}
|
||||
|
||||
|
||||
// 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 remove_file(const char* dirname, const char* filename) {
|
||||
//
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
//
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
//
|
||||
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 @@ static int create_sharedmem_resources(const char* dirname, const char* filename,
|
||||
return -1;
|
||||
}
|
||||
|
||||
int result;
|
||||
|
||||
RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result);
|
||||
if (result == OS_ERR) {
|
||||
if (PrintMiscellaneous && Verbose) {
|
||||
warning("could not create file %s: %s\n", filename, strerror(errno));
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
// 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) {
|
||||
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 @@ static int open_sharedmem_file(const char* filename, int oflags, TRAPS) {
|
||||
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 @@ static char* mmap_create_shared(size_t size) {
|
||||
|
||||
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 @@ static char* mmap_create_shared(size_t size) {
|
||||
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 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
||||
// 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");
|
||||
|
||||
@ -199,7 +199,38 @@ static pid_t filename_to_pid(const char* filename) {
|
||||
}
|
||||
|
||||
|
||||
// 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 @@ static bool is_directory_secure(const char* path) {
|
||||
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;
|
||||
}
|
||||
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;
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
||||
|
||||
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 @@ static char* get_user_name_slow(int vmid, TRAPS) {
|
||||
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 @@ static void remove_file(const char* path) {
|
||||
}
|
||||
|
||||
|
||||
// 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 remove_file(const char* dirname, const char* filename) {
|
||||
//
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
//
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
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 @@ static void cleanup_sharedmem_resources(const char* dirname) {
|
||||
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 @@ static int create_sharedmem_resources(const char* dirname, const char* filename,
|
||||
return -1;
|
||||
}
|
||||
|
||||
int result;
|
||||
|
||||
RESTARTABLE(::open(filename, O_RDWR|O_CREAT|O_TRUNC, S_IREAD|S_IWRITE), result);
|
||||
if (result == OS_ERR) {
|
||||
if (PrintMiscellaneous && Verbose) {
|
||||
warning("could not create file %s: %s\n", filename, strerror(errno));
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
// 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) {
|
||||
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 @@ static int open_sharedmem_file(const char* filename, int oflags, TRAPS) {
|
||||
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 @@ static char* mmap_create_shared(size_t size) {
|
||||
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 @@ static void mmap_attach_shared(const char* user, int vmid, PerfMemory::PerfMemor
|
||||
// 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");
|
||||
|
||||
@ -428,9 +428,9 @@ static unsigned __stdcall java_start(Thread* thread) {
|
||||
}
|
||||
|
||||
// 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 @@ int os::win32::exit_process_or_thread(Ept what, int exit_code) {
|
||||
|
||||
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 @@ int os::win32::exit_process_or_thread(Ept what, int exit_code) {
|
||||
// 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 @@ int os::win32::exit_process_or_thread(Ept what, int exit_code) {
|
||||
// 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 @@ int os::win32::exit_process_or_thread(Ept what, int exit_code) {
|
||||
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) {
|
||||
|
||||
@ -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 @@ class G1PostBarrierStub: public CodeStub {
|
||||
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) { }
|
||||
|
||||
@ -89,8 +89,8 @@ class BCEscapeAnalyzer::StateInfo {
|
||||
public:
|
||||
ArgumentMap *_vars;
|
||||
ArgumentMap *_stack;
|
||||
short _stack_height;
|
||||
short _max_stack;
|
||||
int _stack_height;
|
||||
int _max_stack;
|
||||
bool _initialized;
|
||||
ArgumentMap empty_map;
|
||||
|
||||
|
||||
@ -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 @@ template <class T, class N> const char* CompactHashtable<T, N>::init(const char*
|
||||
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>;
|
||||
|
||||
|
||||
@ -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 @@ public:
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// iterate over symbols
|
||||
void symbols_do(SymbolClosure *cl);
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -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 @@ void SymbolTable::initialize_symbols(int arena_alloc_size) {
|
||||
|
||||
// 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);
|
||||
|
||||
@ -1905,11 +1905,12 @@ void SystemDictionary::initialize_preloaded_classes(TRAPS) {
|
||||
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);
|
||||
|
||||
@ -128,6 +128,7 @@ class Ticks;
|
||||
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 ) \
|
||||
|
||||
@ -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 @@ void ClassVerifier::verify_method(methodHandle m, TRAPS) {
|
||||
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 @@ bool ClassVerifier::name_in_supers(
|
||||
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 @@ void ClassVerifier::verify_field_instructions(RawBytecodeStream* bcs,
|
||||
// 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 @@ bool ClassVerifier::ends_in_athrow(u4 start_bc_offset) {
|
||||
|
||||
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 @@ void ClassVerifier::verify_invoke_init(
|
||||
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 @@ void ClassVerifier::verify_invoke_init(
|
||||
}
|
||||
}
|
||||
}
|
||||
// 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 @@ bool ClassVerifier::is_same_or_direct_interface(
|
||||
|
||||
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 @@ void ClassVerifier::verify_invoke_instructions(
|
||||
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) {
|
||||
|
||||
@ -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 @@ class ClassVerifier : public StackObj {
|
||||
|
||||
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 @@ class ClassVerifier : public StackObj {
|
||||
|
||||
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,
|
||||
|
||||
@ -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") \
|
||||
|
||||
@ -233,8 +233,8 @@ void CodeCache::initialize_heaps() {
|
||||
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);
|
||||
|
||||
@ -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 @@ void Dependencies::print_dependency(DepType dept, GrowableArray<DepArgument>* ar
|
||||
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 @@ class ClassHierarchyWalker {
|
||||
// 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 @@ class ClassHierarchyWalker {
|
||||
} 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 @@ bool Dependencies::is_concrete_klass(Klass* k) {
|
||||
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 @@ bool Dependencies::is_concrete_klass(ciInstanceKlass* k) {
|
||||
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 @@ Method* Dependencies::find_unique_concrete_method(Klass* ctxk, Method* m) {
|
||||
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 @@ Klass* Dependencies::check_exclusive_concrete_methods(Klass* ctxk,
|
||||
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 @@ Klass* Dependencies::check_has_no_finalizable_subclasses(Klass* ctxk, KlassDepCh
|
||||
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");
|
||||
|
||||
@ -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 @@ class Dependencies: public ResourceObj {
|
||||
// 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 @@ class Dependencies: public ResourceObj {
|
||||
// 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 @@ class Dependencies: public ResourceObj {
|
||||
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();
|
||||
|
||||
@ -645,7 +645,7 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
|
||||
// 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 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
|
||||
_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";
|
||||
}
|
||||
|
||||
@ -737,6 +737,10 @@ class CMSCollector: public CHeapObj<mtGC> {
|
||||
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,
|
||||
|
||||
@ -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 @@ public:
|
||||
// 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,
|
||||
|
||||
@ -162,8 +162,8 @@ void HeapRegion::hr_clear(bool par, bool clear_space, bool locked) {
|
||||
"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);
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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 @@ protected:
|
||||
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; }
|
||||
|
||||
@ -39,7 +39,7 @@ void ObjPtrQueue::flush() {
|
||||
// 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
|
||||
|
||||
@ -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 @@ public:
|
||||
// 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.
|
||||
|
||||
@ -1194,8 +1194,10 @@ oop ParNewGeneration::copy_to_survivor_space(
|
||||
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
|
||||
|
||||
@ -61,9 +61,9 @@ void GenerationSizer::initialize_flags() {
|
||||
|
||||
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?
|
||||
|
||||
@ -41,7 +41,7 @@ ParMarkBitMap::initialize(MemRegion covered_region)
|
||||
|
||||
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));
|
||||
|
||||
|
||||
@ -403,7 +403,7 @@ PSVirtualSpace*
|
||||
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));
|
||||
|
||||
|
||||
@ -63,7 +63,8 @@ public:
|
||||
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() {
|
||||
|
||||
@ -320,7 +320,7 @@ int LinkResolver::vtable_index_of_interface_method(KlassHandle klass,
|
||||
// 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);
|
||||
}
|
||||
|
||||
@ -104,8 +104,8 @@ bool CodeHeap::reserve(ReservedSpace rs, size_t committed_size, size_t segment_s
|
||||
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();
|
||||
|
||||
@ -118,6 +118,7 @@ ReferenceProcessor::ReferenceProcessor(MemRegion span,
|
||||
_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 @@ ReferenceProcessorStats ReferenceProcessor::process_discovered_references(
|
||||
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 @@ void ReferenceProcessor::balance_all_queues() {
|
||||
balance_queues(_discoveredWeakRefs);
|
||||
balance_queues(_discoveredFinalRefs);
|
||||
balance_queues(_discoveredPhantomRefs);
|
||||
balance_queues(_discoveredCleanerRefs);
|
||||
}
|
||||
|
||||
size_t
|
||||
@ -998,6 +1007,9 @@ inline DiscoveredList* ReferenceProcessor::get_discovered_list(ReferenceType rt)
|
||||
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 @@ void ReferenceProcessor::preclean_discovered_references(
|
||||
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 @@ const char* ReferenceProcessor::list_name(uint i) {
|
||||
case 1: return "WeakRef";
|
||||
case 2: return "FinalRef";
|
||||
case 3: return "PhantomRef";
|
||||
case 4: return "CleanerRef";
|
||||
}
|
||||
ShouldNotReachHere();
|
||||
return NULL;
|
||||
|
||||
@ -264,9 +264,10 @@ class ReferenceProcessor : public CHeapObj<mtGC> {
|
||||
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; }
|
||||
|
||||
@ -35,7 +35,8 @@ enum ReferenceType {
|
||||
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
|
||||
|
||||
@ -235,22 +235,19 @@ void ThreadLocalAllocBuffer::startup_initialization() {
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@ -106,7 +106,7 @@ public:
|
||||
// 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; }
|
||||
|
||||
|
||||
@ -1420,32 +1420,41 @@ Method* InstanceKlass::find_method(Symbol* name, Symbol* signature) const {
|
||||
}
|
||||
|
||||
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 @@ Method* InstanceKlass::find_method_impl(
|
||||
// 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 @@ int InstanceKlass::find_method_index(
|
||||
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
|
||||
}
|
||||
|
||||
@ -490,10 +490,16 @@ class InstanceKlass: public Klass {
|
||||
// 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 @@ private:
|
||||
|
||||
// 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();
|
||||
|
||||
@ -68,11 +68,11 @@ class JvmtiConstantPoolReconstituter : public StackObj {
|
||||
|
||||
~JvmtiConstantPoolReconstituter() {
|
||||
if (_symmap != NULL) {
|
||||
os::free(_symmap);
|
||||
delete _symmap;
|
||||
_symmap = NULL;
|
||||
}
|
||||
if (_classmap != NULL) {
|
||||
os::free(_classmap);
|
||||
delete _classmap;
|
||||
_classmap = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1046,10 +1046,16 @@ static jint invoke_string_value_callback(jvmtiStringPrimitiveValueCallback cb,
|
||||
{
|
||||
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) {
|
||||
|
||||
@ -100,6 +100,11 @@ PERF_ENTRY(void, Perf_Detach(JNIEnv *env, jobject unused, jobject buffer))
|
||||
|
||||
PerfWrapper("Perf_Detach");
|
||||
|
||||
if (!UsePerfData) {
|
||||
// With -XX:-UsePerfData, detach is just a NOP
|
||||
return;
|
||||
}
|
||||
|
||||
void* address = 0;
|
||||
jlong capacity = 0;
|
||||
|
||||
|
||||
@ -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_END
|
||||
|
||||
|
||||
|
||||
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 @@ static JNINativeMethod methods_140[] = {
|
||||
{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 @@ static JNINativeMethod methods_141[] = {
|
||||
{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 @@ static JNINativeMethod methods_15[] = {
|
||||
{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 @@ static JNINativeMethod methods_16[] = {
|
||||
{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 @@ static JNINativeMethod methods_18[] = {
|
||||
|
||||
{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)},
|
||||
|
||||
@ -1401,15 +1401,17 @@ bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) {
|
||||
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 @@ size_t os::page_size_for_region(size_t region_size, size_t min_pages) {
|
||||
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 @@ class TestOS : AllStatic {
|
||||
|
||||
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 @@ class TestOS : AllStatic {
|
||||
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();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -148,6 +148,7 @@ class os: AllStatic {
|
||||
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 @@ class os: AllStatic {
|
||||
|
||||
// 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() {
|
||||
|
||||
@ -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 @@ void ObjectSynchronizer::jni_enter(Handle obj, TRAPS) {
|
||||
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);
|
||||
|
||||
@ -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 @@ class ObjectSynchronizer : AllStatic {
|
||||
// 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
|
||||
|
||||
@ -38,7 +38,8 @@ ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0),
|
||||
}
|
||||
|
||||
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 @@ VirtualSpace::VirtualSpace() {
|
||||
|
||||
|
||||
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 @@ class TestVirtualSpace : AllStatic {
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -668,6 +668,7 @@ typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable;
|
||||
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*) \
|
||||
|
||||
@ -41,6 +41,8 @@ class defaultStream : public xmlTextStream {
|
||||
|
||||
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:
|
||||
|
||||
@ -367,7 +367,6 @@ extern Mutex* tty_lock;
|
||||
|
||||
#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 @@ static const char* make_log_name_internal(const char* log_name, const char* forc
|
||||
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 @@ static const char* make_log_name_internal(const char* log_name, const char* forc
|
||||
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 @@ static const char* make_log_name(const char* log_name, const char* force_directo
|
||||
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 @@ gcLogFileStream::gcLogFileStream(const char* file_name) {
|
||||
_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 @@ void gcLogFileStream::write(const char* s, size_t len) {
|
||||
// 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 @@ void gcLogFileStream::rotate_log(bool force, outputStream* out) {
|
||||
// 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",
|
||||
_file_name, _cur_file_num);
|
||||
jio_snprintf(current_file_name, filename_len + EXTRACHARLEN, "%s.%d" CURRENTAPPX,
|
||||
jio_snprintf(renamed_file_name, JVM_MAXPATHLEN, "%s.%d",
|
||||
_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 @@ void gcLogFileStream::rotate_log(bool force, outputStream* out) {
|
||||
|
||||
_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 @@ bool defaultStream::has_log_file() {
|
||||
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);
|
||||
}
|
||||
FREE_C_HEAP_ARRAY(char, try_name);
|
||||
fileStream* file = open_file(log_name);
|
||||
|
||||
if (file->is_open()) {
|
||||
if (file != NULL) {
|
||||
_log_file = file;
|
||||
xmlStream* xs = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file);
|
||||
_outer_xmlStream = xs;
|
||||
_outer_xmlStream = new(ResourceObj::C_HEAP, mtInternal) xmlStream(file);
|
||||
start_log();
|
||||
} else {
|
||||
// and leave xtty as NULL
|
||||
LogVMOutput = false;
|
||||
DisplayVMOutput = true;
|
||||
LogCompilation = false;
|
||||
}
|
||||
}
|
||||
|
||||
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 @@ void defaultStream::init_log() {
|
||||
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
|
||||
|
||||
@ -22,6 +22,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include "precompiled.hpp"
|
||||
#include "code/codeCache.hpp"
|
||||
#include "compiler/compileBroker.hpp"
|
||||
@ -807,7 +808,8 @@ fdStream VMError::log; // error log used by VMError::report_and_die()
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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 @@ public class BusyLock implements CompilableTest, Runnable {
|
||||
// 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 @@ public class BusyLock implements CompilableTest, Runnable {
|
||||
@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 class BusyLock implements CompilableTest, Runnable {
|
||||
|
||||
public void syncAndTest() {
|
||||
try {
|
||||
barrier.await();
|
||||
// wait until monitor is locked by a ::run method
|
||||
barrier.await();
|
||||
} catch (InterruptedException | BrokenBarrierException e) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -116,7 +116,14 @@ public class TestHumongousCodeCacheRoots {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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 class ProblematicFrameTest {
|
||||
|
||||
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\\)");
|
||||
}
|
||||
|
||||
@ -288,3 +288,5 @@ a12d347f84176200593999f4da91ae2bb86865b2 jdk9-b39
|
||||
40b242363040229a05224fbc5dc203a3f46a8f8f jdk9-b43
|
||||
0cb0844b58924d6086d2850c22087d06679d5eef jdk9-b44
|
||||
0dab3e848229127c7aca4c58b98e2d90ba70372f jdk9-b45
|
||||
74eaf7ad986576c792df4dbff05eed63e5727695 jdk9-b46
|
||||
e391de88e69b59d7c618387e3cf91032f6991ce9 jdk9-b47
|
||||
|
||||
@ -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 @@ public class DBFNamespaceTest {
|
||||
* 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));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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 @@ public class DocumentBuilderImpl01 implements EntityResolver {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 @@ public class DocumentBuilderImpl01 implements EntityResolver {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
@ -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 @@ package javax.xml.parsers.ptests;
|
||||
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 @@ import org.testng.annotations.Test;
|
||||
* 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 @@ public class FactoryConfErrorTest {
|
||||
*/
|
||||
@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 @@ public class FactoryConfErrorTest {
|
||||
*/
|
||||
@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 @@ public class FactoryConfErrorTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
|
||||
@ -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 @@ public class SAXParserFactTest {
|
||||
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 @@ public class SAXParserFactTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase to test the functionality of setValidating and isvalidating
|
||||
* Test the functionality of setValidating and isvalidating
|
||||
* methods.
|
||||
*/
|
||||
@Test
|
||||
@ -82,7 +71,7 @@ public class SAXParserFactTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Parser should not be namespaceaware by default.
|
||||
* Parser should not be namespace-aware by default.
|
||||
*/
|
||||
@Test
|
||||
public void testNamespace01() {
|
||||
@ -91,7 +80,7 @@ public class SAXParserFactTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase to test the functionality of setNamespaceAware and
|
||||
* Test the functionality of setNamespaceAware and
|
||||
* isNamespaceAware methods.
|
||||
*/
|
||||
@Test
|
||||
@ -102,167 +91,132 @@ public class SAXParserFactTest {
|
||||
}
|
||||
|
||||
/**
|
||||
* 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));
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase to test the functionality of setFeature and getFeature methods
|
||||
* Test the functionality of setFeature and getFeature methods
|
||||
* for external-general-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 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 getFeature method for
|
||||
* Test the functionality of getFeature method for
|
||||
* external-parameter-entities 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);
|
||||
}
|
||||
public void testFeature09() throws Exception {
|
||||
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||
assertTrue(spf.getFeature(EXTERNAL_P_ENTITIES));
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase to test the functionality of setFeature method for
|
||||
* Test the functionality of setFeature method for
|
||||
* external-parameter-entitie property.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 @@ import org.xml.sax.helpers.DefaultHandler;
|
||||
/**
|
||||
* 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 @@ public class SAXParserTest {
|
||||
* 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 {
|
||||
@Test(expectedExceptions = IllegalArgumentException.class,
|
||||
dataProvider = "parser-provider")
|
||||
public void testParse01(SAXParser saxparser) throws Exception {
|
||||
FileInputStream instream = null;
|
||||
saxparser.parse(instream, new HandlerBase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with by setting URI as null, parsing should fail and throw
|
||||
* IllegalArgumentException.
|
||||
*
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@Test(expectedExceptions = IllegalArgumentException.class,
|
||||
dataProvider = "parser-provider")
|
||||
public void testParse02(SAXParser saxparser) throws Exception {
|
||||
String uri = null;
|
||||
saxparser.parse(uri, new HandlerBase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with non-existence URI, parsing should fail and throw IOException.
|
||||
*
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@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 {
|
||||
FileInputStream instream = null;
|
||||
HandlerBase handler = new HandlerBase();
|
||||
saxparser.parse(instream, handler);
|
||||
} catch (SAXException | IOException e) {
|
||||
failUnexpected(e);
|
||||
saxparser.parse("", new HandlerBase());
|
||||
} finally {
|
||||
setPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with an error in xml file, parsing should fail and throw
|
||||
* Test with File null, parsing should fail and throw
|
||||
* IllegalArgumentException.
|
||||
*
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@Test(expectedExceptions = IllegalArgumentException.class,
|
||||
dataProvider = "parser-provider")
|
||||
public void testParse04(SAXParser saxparser) throws Exception {
|
||||
File file = null;
|
||||
saxparser.parse(file, new HandlerBase());
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 testParse02(SAXParser saxparser) throws SAXException {
|
||||
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, "invalid.xml"));
|
||||
saxparser.parse(instream, handler);
|
||||
} catch (IOException e) {
|
||||
failUnexpected(e);
|
||||
saxparser.parse(new File(""), new HandlerBase());
|
||||
} finally {
|
||||
setPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with a valid in xml file, parser should parse the xml document.
|
||||
*/
|
||||
@Test(dataProvider = "parser-provider")
|
||||
public void testParse03(SAXParser saxparser) {
|
||||
try {
|
||||
HandlerBase handler = new HandlerBase();
|
||||
saxparser.parse(new File(TestUtils.XML_DIR, "parsertest.xml"), handler);
|
||||
} catch (IOException | SAXException e) {
|
||||
failUnexpected(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with valid input stream, parser should parse the xml document
|
||||
* successfully.
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with valid input source, parser should parse the xml document
|
||||
* successfully.
|
||||
*/
|
||||
@Test(dataProvider = "parser-provider")
|
||||
public void testParse05(SAXParser saxparser) {
|
||||
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
|
||||
* 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 testParse07(SAXParser saxparser) throws IllegalArgumentException {
|
||||
try {
|
||||
String uri = null;
|
||||
HandlerBase handler = new HandlerBase();
|
||||
saxparser.parse(uri, handler);
|
||||
} catch (SAXException | IOException e) {
|
||||
failUnexpected(e);
|
||||
}
|
||||
@Test(expectedExceptions = IllegalArgumentException.class,
|
||||
dataProvider = "parser-provider")
|
||||
public void testParse06(SAXParser saxparser) throws Exception {
|
||||
InputSource is = null;
|
||||
saxparser.parse(is, new HandlerBase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with non-existant uri, parsing should fail and throw
|
||||
* IOException.
|
||||
*
|
||||
* @throws SAXException
|
||||
* @throws IOException
|
||||
*/
|
||||
@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);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with proper uri, parser should parse successfully.
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with File null, parsing should fail and throw
|
||||
* Test 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 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 testParse07(SAXParser saxparser) throws Exception {
|
||||
FileInputStream instream = null;
|
||||
saxparser.parse(instream, new DefaultHandler());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with empty string as File, parsing should fail and throw
|
||||
* SAXException.
|
||||
*
|
||||
* @throws SAXException
|
||||
*/
|
||||
@Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
|
||||
public void testParse11(SAXParser saxparser) throws SAXException {
|
||||
try {
|
||||
HandlerBase handler = new HandlerBase();
|
||||
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
|
||||
*/
|
||||
@Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
|
||||
public void testParse12(SAXParser saxparser) throws SAXException {
|
||||
try {
|
||||
HandlerBase handler = new HandlerBase();
|
||||
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 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with input source 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 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 testParse08(SAXParser saxparser) throws Exception {
|
||||
String uri = null;
|
||||
saxparser.parse(uri, new DefaultHandler());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with input source attached an invaild xml, parsing should fail
|
||||
* and throw SAXException.
|
||||
*
|
||||
* @throws SAXException
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with input source attached an vaild xml, parser should
|
||||
* successfully parse the xml document.
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with FileInputStream null, parsing should fail and throw
|
||||
* IllegalArgumentException.
|
||||
*
|
||||
* @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
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with valid input stream, parser should parse the xml document
|
||||
* successfully.
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with valid input source, parser should parse the xml document
|
||||
* successfully.
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with non-existant uri, parsing should fail and throw
|
||||
* Test with non-existence URI, parsing should fail and throw
|
||||
* SAXException or IOException.
|
||||
*
|
||||
* @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 {
|
||||
@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 {
|
||||
saxparser.parse(uri, new DefaultHandler());
|
||||
} finally {
|
||||
setPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with empty string as File, parsing should fail and throw
|
||||
* SAXException.
|
||||
*
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider")
|
||||
public void testParse10(SAXParser saxparser) throws Exception {
|
||||
String workingDir = getSystemProperty("user.dir");
|
||||
setPermissions(new FilePermission(workingDir, "read"));
|
||||
File file = new File("");
|
||||
try {
|
||||
saxparser.parse(file, new DefaultHandler());
|
||||
} finally {
|
||||
setPermissions();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with File null, parsing should fail and throw
|
||||
* IllegalArgumentException.
|
||||
*
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@Test(expectedExceptions = IllegalArgumentException.class,
|
||||
dataProvider = "parser-provider")
|
||||
public void testParse11(SAXParser saxparser) throws Exception {
|
||||
saxparser.parse((File) null, new DefaultHandler());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with input source null, parsing should fail and throw
|
||||
* IllegalArgumentException.
|
||||
*
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with a valid in XML file, parser should parse the XML document.
|
||||
*
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
|
||||
public void testParse14(SAXParser saxparser) throws Exception {
|
||||
saxparser.parse(new File(XML_DIR, "parsertest.xml"),
|
||||
new HandlerBase());
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 testParse15(SAXParser saxparser) throws Exception {
|
||||
try (FileInputStream instream = new FileInputStream(new File(XML_DIR,
|
||||
"correct.xml"))) {
|
||||
saxparser.parse(instream, new HandlerBase());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with valid input source, 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 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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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(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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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(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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 testParse22(SAXParser saxparser) throws Exception {
|
||||
try (FileInputStream instream = new FileInputStream(
|
||||
new File(XML_DIR, "invalid.xml"))) {
|
||||
saxparser.parse(instream, new DefaultHandler());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 testParse23(SAXParser saxparser) throws Exception {
|
||||
DefaultHandler handler = new DefaultHandler();
|
||||
saxparser.parse(uri, handler);
|
||||
|
||||
saxparser.parse(new File(XML_DIR, "parsertest.xml"), 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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 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
|
||||
* Test with valid input source, 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 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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 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.
|
||||
*
|
||||
* @throws SAXException
|
||||
* @param saxparser a SAXParser instance.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
@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());
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with xml file that has errors, parsing should fail and throw
|
||||
* SAXException.
|
||||
* Test with XML file that has no errors, parser should successfully
|
||||
* 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 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);
|
||||
}
|
||||
@Test(groups = {"readLocalFiles"}, dataProvider = "parser-provider")
|
||||
public void testParse28(SAXParser saxparser) throws Exception {
|
||||
saxparser.parse(new File(XML_DIR, "correct.xml"), new DefaultHandler());
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Testcase with input source null, parsing should fail and throw
|
||||
* IllegalArgumentException.
|
||||
* Test with an invalid XML file, parser should throw SAXException.
|
||||
*
|
||||
* @throws IllegalArgumentException
|
||||
* @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 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 @@ import org.xml.sax.SAXException;
|
||||
/**
|
||||
* 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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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 @@ 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 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.Attr;
|
||||
@ -48,7 +43,6 @@ 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;
|
||||
|
||||
@ -56,48 +50,36 @@ 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 {
|
||||
public class DOMResultTest extends JAXPFileBaseTest {
|
||||
/**
|
||||
* Unit test for simple DOM parsing.
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@Test
|
||||
public void testcase01() {
|
||||
String resultFile = CLASS_DIR + "domresult01.out";
|
||||
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";
|
||||
|
||||
try {
|
||||
XMLReader reader = XMLReaderFactory.createXMLReader();
|
||||
SAXTransformerFactory saxTFactory
|
||||
= (SAXTransformerFactory) TransformerFactory.newInstance();
|
||||
SAXSource saxSource = new SAXSource(new InputSource(xsltFile));
|
||||
TransformerHandler handler
|
||||
= saxTFactory.newTransformerHandler(saxSource);
|
||||
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();
|
||||
DOMResult result = new DOMResult();
|
||||
|
||||
handler.setResult(result);
|
||||
reader.setContentHandler(handler);
|
||||
reader.parse(xmlFile);
|
||||
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);
|
||||
}
|
||||
Node node = result.getNode();
|
||||
try (BufferedWriter writer = new BufferedWriter(new FileWriter(resultFile))) {
|
||||
writeNodes(node, writer);
|
||||
}
|
||||
assertTrue(compareWithGold(goldFile, resultFile));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -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 @@ import org.testng.annotations.Test;
|
||||
/**
|
||||
* 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 @@ public class ErrorListenerTest implements ErrorListener {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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,80 +25,73 @@ 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 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;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
|
||||
/**
|
||||
* Unit test for SAXSource sourceToInputSource API.
|
||||
*/
|
||||
public class SAXSourceTest01 {
|
||||
public class SAXSourceTest extends JAXPFileReadOnlyBaseTest {
|
||||
/**
|
||||
* Test file name
|
||||
* 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
|
||||
public void source2inputsource01() {
|
||||
try {
|
||||
StreamSource streamSource = new StreamSource (
|
||||
new FileInputStream (TEST_FILE));
|
||||
@Test(groups = {"readLocalFiles"})
|
||||
public void source2inputsource01() throws IOException {
|
||||
try (FileInputStream fis = new FileInputStream(TEST_FILE)) {
|
||||
StreamSource streamSource = new StreamSource(fis);
|
||||
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
|
||||
* expected. This is a negative test case,
|
||||
*
|
||||
* @throws Exception If any errors occur.
|
||||
*/
|
||||
@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);
|
||||
}
|
||||
|
||||
@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
|
||||
public void source2inputsource03() {
|
||||
@Test(groups = {"readLocalFiles"})
|
||||
public void source2inputsource03() throws IOException {
|
||||
String SYSTEM_ID = "file:///" + XML_DIR;
|
||||
try {
|
||||
try (FileInputStream fis = new FileInputStream(TEST_FILE)) {
|
||||
SAXSource saxSource =
|
||||
new SAXSource(new InputSource(new FileInputStream(TEST_FILE)));
|
||||
new SAXSource(new InputSource(fis));
|
||||
saxSource.setSystemId(SYSTEM_ID);
|
||||
assertEquals(SAXSource.sourceToInputSource(saxSource).getSystemId(),
|
||||
SYSTEM_ID);
|
||||
} catch (FileNotFoundException ex) {
|
||||
failUnexpected(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user