Merge
This commit is contained in:
commit
8914d439d5
@ -394,3 +394,4 @@ a22e2671d88f6b22a4aa82e3966986542ed2a381 jdk-9+146
|
||||
b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149
|
||||
6234069ff9789f7582e1faa32cb6283cbd1a5a2d jdk-9+150
|
||||
71a766d4c18041a7f833ee22823125b02e1a7f1e jdk-9+151
|
||||
ef056360ddf3977d7d2ddbeb456a4d612d19ea05 jdk-9+152
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -1011,6 +1011,8 @@ AC_DEFUN([BASIC_CHECK_TAR],
|
||||
# Test which kind of tar was found
|
||||
if test "x$($TAR --version | $GREP "GNU tar")" != "x"; then
|
||||
TAR_TYPE="gnu"
|
||||
elif test "x$($TAR --version | $GREP "bsdtar")" != "x"; then
|
||||
TAR_TYPE="bsd"
|
||||
elif test "x$($TAR -v | $GREP "bsdtar")" != "x"; then
|
||||
TAR_TYPE="bsd"
|
||||
elif test "x$OPENJDK_BUILD_OS" = "xsolaris"; then
|
||||
@ -1038,12 +1040,36 @@ AC_DEFUN([BASIC_CHECK_TAR],
|
||||
AC_SUBST(TAR_SUPPORTS_TRANSFORM)
|
||||
])
|
||||
|
||||
AC_DEFUN([BASIC_CHECK_GREP],
|
||||
[
|
||||
# Test that grep supports -Fx with a list of pattern which includes null pattern.
|
||||
# This is a problem for the grep resident on AIX.
|
||||
AC_MSG_CHECKING([that grep ($GREP) -Fx handles empty lines in the pattern list correctly])
|
||||
# Multiple subsequent spaces..
|
||||
STACK_SPACES='aaa bbb ccc'
|
||||
# ..converted to subsequent newlines, causes STACK_LIST to be a list with some empty
|
||||
# patterns in it.
|
||||
STACK_LIST=${STACK_SPACES// /$'\n'}
|
||||
NEEDLE_SPACES='ccc bbb aaa'
|
||||
NEEDLE_LIST=${NEEDLE_SPACES// /$'\n'}
|
||||
RESULT="$($GREP -Fvx "$STACK_LIST" <<< "$NEEDLE_LIST")"
|
||||
if test "x$RESULT" == "x"; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
if test "x$OPENJDK_TARGET_OS" = "xaix"; then
|
||||
ADDINFO="Please make sure you use GNU grep, usually found at /opt/freeware/bin."
|
||||
fi
|
||||
AC_MSG_ERROR([grep does not handle -Fx correctly. ${ADDINFO}])
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS],
|
||||
[
|
||||
BASIC_CHECK_GNU_MAKE
|
||||
|
||||
BASIC_CHECK_FIND_DELETE
|
||||
BASIC_CHECK_TAR
|
||||
BASIC_CHECK_GREP
|
||||
|
||||
# These tools might not be installed by default,
|
||||
# need hint on how to install them.
|
||||
|
@ -68,7 +68,6 @@ LDFLAGS_JDKLIB := @OPENJDK_BUILD_LDFLAGS_JDKLIB@
|
||||
CFLAGS_JDKEXE := @OPENJDK_BUILD_CFLAGS_JDKEXE@
|
||||
CXXFLAGS_JDKEXE := @OPENJDK_BUILD_CXXFLAGS_JDKEXE@
|
||||
LDFLAGS_JDKEXE := @OPENJDK_BUILD_LDFLAGS_JDKEXE@
|
||||
OPENJDK_TARGET_CPU_JLI_CFLAGS := @OPENJDK_BUILD_CPU_JLI_CFLAGS@
|
||||
|
||||
JVM_CFLAGS := @OPENJDK_BUILD_JVM_CFLAGS@
|
||||
JVM_LDFLAGS := @OPENJDK_BUILD_JVM_LDFLAGS@
|
||||
|
@ -815,11 +815,6 @@ AC_DEFUN([FLAGS_SETUP_COMPILER_FLAGS_FOR_JDK_HELPER],
|
||||
$2CXXFLAGS_JDK="${$2CXXFLAGS_JDK} -D__solaris__"
|
||||
fi
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
|
||||
$2CFLAGS_JDK="${$2CFLAGS_JDK} -D__solaris__"
|
||||
$2CXXFLAGS_JDK="${$2CXXFLAGS_JDK} -D__solaris__"
|
||||
fi
|
||||
|
||||
$2CFLAGS_JDK="${$2CFLAGS_JDK} ${$2EXTRA_CFLAGS}"
|
||||
$2CXXFLAGS_JDK="${$2CXXFLAGS_JDK} ${$2EXTRA_CXXFLAGS}"
|
||||
$2LDFLAGS_JDK="${$2LDFLAGS_JDK} ${$2EXTRA_LDFLAGS}"
|
||||
|
@ -3564,7 +3564,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
|
||||
|
||||
# Include these first...
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -3731,6 +3731,8 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Check if build directory is on local disk. If not possible to determine,
|
||||
# we prefer to claim it's local.
|
||||
# Argument 1: directory to test
|
||||
@ -4122,7 +4124,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
|
||||
|
||||
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -4237,6 +4239,17 @@ yum_help() {
|
||||
esac
|
||||
}
|
||||
|
||||
brew_help() {
|
||||
case $1 in
|
||||
openjdk)
|
||||
PKGHANDLER_COMMAND="brew cask install java" ;;
|
||||
freetype)
|
||||
PKGHANDLER_COMMAND="brew install freetype" ;;
|
||||
ccache)
|
||||
PKGHANDLER_COMMAND="brew install ccache" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
port_help() {
|
||||
PKGHANDLER_COMMAND=""
|
||||
}
|
||||
@ -4362,7 +4375,7 @@ VALID_JVM_VARIANTS="server client minimal core zero zeroshark custom"
|
||||
|
||||
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -4667,7 +4680,7 @@ VALID_JVM_VARIANTS="server client minimal core zero zeroshark custom"
|
||||
|
||||
|
||||
#
|
||||
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -5167,7 +5180,7 @@ VS_SDK_PLATFORM_NAME_2013=
|
||||
#CUSTOM_AUTOCONF_INCLUDE
|
||||
|
||||
# Do not change or remove the following line, it is needed for consistency checks:
|
||||
DATE_WHEN_GENERATED=1483542685
|
||||
DATE_WHEN_GENERATED=1484571183
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
@ -17544,7 +17557,7 @@ $as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is inval
|
||||
|
||||
# Must be done before we can call HELP_MSG_MISSING_DEPENDENCY.
|
||||
|
||||
for ac_prog in apt-get yum port pkgutil pkgadd
|
||||
for ac_prog in apt-get yum brew port pkgutil pkgadd
|
||||
do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
@ -21209,6 +21222,8 @@ $as_echo "yes" >&6; }
|
||||
# Test which kind of tar was found
|
||||
if test "x$($TAR --version | $GREP "GNU tar")" != "x"; then
|
||||
TAR_TYPE="gnu"
|
||||
elif test "x$($TAR --version | $GREP "bsdtar")" != "x"; then
|
||||
TAR_TYPE="bsd"
|
||||
elif test "x$($TAR -v | $GREP "bsdtar")" != "x"; then
|
||||
TAR_TYPE="bsd"
|
||||
elif test "x$OPENJDK_BUILD_OS" = "xsolaris"; then
|
||||
@ -21238,6 +21253,29 @@ $as_echo "$TAR_TYPE" >&6; }
|
||||
|
||||
|
||||
|
||||
# Test that grep supports -Fx with a list of pattern which includes null pattern.
|
||||
# This is a problem for the grep resident on AIX.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that grep ($GREP) -Fx handles empty lines in the pattern list correctly" >&5
|
||||
$as_echo_n "checking that grep ($GREP) -Fx handles empty lines in the pattern list correctly... " >&6; }
|
||||
# Multiple subsequent spaces..
|
||||
STACK_SPACES='aaa bbb ccc'
|
||||
# ..converted to subsequent newlines, causes STACK_LIST to be a list with some empty
|
||||
# patterns in it.
|
||||
STACK_LIST=${STACK_SPACES// /$'\n'}
|
||||
NEEDLE_SPACES='ccc bbb aaa'
|
||||
NEEDLE_LIST=${NEEDLE_SPACES// /$'\n'}
|
||||
RESULT="$($GREP -Fvx "$STACK_LIST" <<< "$NEEDLE_LIST")"
|
||||
if test "x$RESULT" == "x"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
else
|
||||
if test "x$OPENJDK_TARGET_OS" = "xaix"; then
|
||||
ADDINFO="Please make sure you use GNU grep, usually found at /opt/freeware/bin."
|
||||
fi
|
||||
as_fn_error $? "grep does not handle -Fx correctly. ${ADDINFO}" "$LINENO" 5
|
||||
fi
|
||||
|
||||
|
||||
# These tools might not be installed by default,
|
||||
# need hint on how to install them.
|
||||
|
||||
@ -24359,15 +24397,13 @@ if test "${enable_keep_packaged_modules+set}" = set; then :
|
||||
fi
|
||||
|
||||
|
||||
if test "x$enable_keep_packaged_modules" = "xyes"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if packaged modules are kept" >&5
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if packaged modules are kept" >&5
|
||||
$as_echo_n "checking if packaged modules are kept... " >&6; }
|
||||
if test "x$enable_keep_packaged_modules" = "xyes"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
JLINK_KEEP_PACKAGED_MODULES=true
|
||||
elif test "x$enable_keep_packaged_modules" = "xno"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if packaged modules are kept" >&5
|
||||
$as_echo_n "checking if packaged modules are kept... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
JLINK_KEEP_PACKAGED_MODULES=false
|
||||
@ -24376,6 +24412,8 @@ $as_echo "no" >&6; }
|
||||
$as_echo "yes (default)" >&6; }
|
||||
JLINK_KEEP_PACKAGED_MODULES=true
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: error" >&5
|
||||
$as_echo "error" >&6; }
|
||||
as_fn_error $? "--enable-keep-packaged-modules accepts no argument" "$LINENO" 5
|
||||
fi
|
||||
|
||||
@ -29942,6 +29980,8 @@ $as_echo "$BOOT_JDK_VERSION" >&6; }
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -33235,6 +33275,8 @@ done
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -34534,6 +34576,8 @@ done
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -48601,6 +48645,8 @@ $as_echo "$as_me: Failed to compile stdio.h. This likely implies missing compile
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -48762,6 +48808,8 @@ $as_echo "$as_me: The tested number of bits in the target ($TESTED_TARGET_CPU_BI
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -49897,11 +49945,6 @@ $as_echo "$supports" >&6; }
|
||||
CXXFLAGS_JDK="${CXXFLAGS_JDK} -D__solaris__"
|
||||
fi
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
|
||||
CFLAGS_JDK="${CFLAGS_JDK} -D__solaris__"
|
||||
CXXFLAGS_JDK="${CXXFLAGS_JDK} -D__solaris__"
|
||||
fi
|
||||
|
||||
CFLAGS_JDK="${CFLAGS_JDK} ${EXTRA_CFLAGS}"
|
||||
CXXFLAGS_JDK="${CXXFLAGS_JDK} ${EXTRA_CXXFLAGS}"
|
||||
LDFLAGS_JDK="${LDFLAGS_JDK} ${EXTRA_LDFLAGS}"
|
||||
@ -50720,11 +50763,6 @@ $as_echo "$supports" >&6; }
|
||||
OPENJDK_BUILD_CXXFLAGS_JDK="${OPENJDK_BUILD_CXXFLAGS_JDK} -D__solaris__"
|
||||
fi
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
|
||||
OPENJDK_BUILD_CFLAGS_JDK="${OPENJDK_BUILD_CFLAGS_JDK} -D__solaris__"
|
||||
OPENJDK_BUILD_CXXFLAGS_JDK="${OPENJDK_BUILD_CXXFLAGS_JDK} -D__solaris__"
|
||||
fi
|
||||
|
||||
OPENJDK_BUILD_CFLAGS_JDK="${OPENJDK_BUILD_CFLAGS_JDK} ${OPENJDK_BUILD_EXTRA_CFLAGS}"
|
||||
OPENJDK_BUILD_CXXFLAGS_JDK="${OPENJDK_BUILD_CXXFLAGS_JDK} ${OPENJDK_BUILD_EXTRA_CXXFLAGS}"
|
||||
OPENJDK_BUILD_LDFLAGS_JDK="${OPENJDK_BUILD_LDFLAGS_JDK} ${OPENJDK_BUILD_EXTRA_LDFLAGS}"
|
||||
@ -52844,6 +52882,8 @@ $as_echo "no, missing dependencies" >&6; }
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -56649,6 +56689,8 @@ fi
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -56721,6 +56763,8 @@ done
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -56864,6 +56908,8 @@ done
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -60683,6 +60729,345 @@ $as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&6;}
|
||||
fi
|
||||
|
||||
|
||||
windows_path="$new_path"
|
||||
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
|
||||
unix_path=`$CYGPATH -u "$windows_path"`
|
||||
new_path="$unix_path"
|
||||
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
||||
unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'`
|
||||
new_path="$unix_path"
|
||||
fi
|
||||
|
||||
if test "x$path" != "x$new_path"; then
|
||||
POTENTIAL_FREETYPE_LIB_PATH="$new_path"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&5
|
||||
$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&6;}
|
||||
fi
|
||||
|
||||
# Save the first 10 bytes of this path to the storage, so fixpath can work.
|
||||
all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}")
|
||||
|
||||
else
|
||||
# We're on a unix platform. Hooray! :)
|
||||
path="$POTENTIAL_FREETYPE_LIB_PATH"
|
||||
has_space=`$ECHO "$path" | $GREP " "`
|
||||
if test "x$has_space" != x; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&5
|
||||
$as_echo "$as_me: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&6;}
|
||||
as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5
|
||||
fi
|
||||
|
||||
# Use eval to expand a potential ~
|
||||
eval path="$path"
|
||||
if test ! -f "$path" && test ! -d "$path"; then
|
||||
as_fn_error $? "The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is not found." "$LINENO" 5
|
||||
fi
|
||||
|
||||
if test -d "$path"; then
|
||||
POTENTIAL_FREETYPE_LIB_PATH="`cd "$path"; $THEPWDCMD -L`"
|
||||
else
|
||||
dir="`$DIRNAME "$path"`"
|
||||
base="`$BASENAME "$path"`"
|
||||
POTENTIAL_FREETYPE_LIB_PATH="`cd "$dir"; $THEPWDCMD -L`/$base"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
FREETYPE_INCLUDE_PATH="$POTENTIAL_FREETYPE_INCLUDE_PATH"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype includes" >&5
|
||||
$as_echo_n "checking for freetype includes... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_INCLUDE_PATH" >&5
|
||||
$as_echo "$FREETYPE_INCLUDE_PATH" >&6; }
|
||||
FREETYPE_LIB_PATH="$POTENTIAL_FREETYPE_LIB_PATH"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype libraries" >&5
|
||||
$as_echo_n "checking for freetype libraries... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_LIB_PATH" >&5
|
||||
$as_echo "$FREETYPE_LIB_PATH" >&6; }
|
||||
fi
|
||||
|
||||
fi
|
||||
if test "x$FOUND_FREETYPE" != xyes; then
|
||||
FREETYPE_BASE_DIR="$SYSROOT/usr/local"
|
||||
|
||||
POTENTIAL_FREETYPE_INCLUDE_PATH="$FREETYPE_BASE_DIR/include"
|
||||
POTENTIAL_FREETYPE_LIB_PATH="$FREETYPE_BASE_DIR/lib"
|
||||
METHOD="well-known location"
|
||||
|
||||
# Let's start with an optimistic view of the world :-)
|
||||
FOUND_FREETYPE=yes
|
||||
|
||||
# First look for the canonical freetype main include file ft2build.h.
|
||||
if ! test -s "$POTENTIAL_FREETYPE_INCLUDE_PATH/ft2build.h"; then
|
||||
# Oh no! Let's try in the freetype2 directory. This is needed at least at Mac OS X Yosemite.
|
||||
POTENTIAL_FREETYPE_INCLUDE_PATH="$POTENTIAL_FREETYPE_INCLUDE_PATH/freetype2"
|
||||
if ! test -s "$POTENTIAL_FREETYPE_INCLUDE_PATH/ft2build.h"; then
|
||||
# Fail.
|
||||
FOUND_FREETYPE=no
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$FOUND_FREETYPE" = xyes; then
|
||||
# Include file found, let's continue the sanity check.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Found freetype include files at $POTENTIAL_FREETYPE_INCLUDE_PATH using $METHOD" >&5
|
||||
$as_echo "$as_me: Found freetype include files at $POTENTIAL_FREETYPE_INCLUDE_PATH using $METHOD" >&6;}
|
||||
|
||||
# Reset to default value
|
||||
FREETYPE_BASE_NAME=freetype
|
||||
FREETYPE_LIB_NAME="${LIBRARY_PREFIX}${FREETYPE_BASE_NAME}${SHARED_LIBRARY_SUFFIX}"
|
||||
if ! test -s "$POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME"; then
|
||||
if test "x$OPENJDK_TARGET_OS" = xmacosx \
|
||||
&& test -s "$POTENTIAL_FREETYPE_LIB_PATH/${LIBRARY_PREFIX}freetype.6${SHARED_LIBRARY_SUFFIX}"; then
|
||||
# On Mac OS X Yosemite, the symlink from libfreetype.dylib to libfreetype.6.dylib disappeared. Check
|
||||
# for the .6 version explicitly.
|
||||
FREETYPE_BASE_NAME=freetype.6
|
||||
FREETYPE_LIB_NAME="${LIBRARY_PREFIX}${FREETYPE_BASE_NAME}${SHARED_LIBRARY_SUFFIX}"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Compensating for missing symlink by using version 6 explicitly" >&5
|
||||
$as_echo "$as_me: Compensating for missing symlink by using version 6 explicitly" >&6;}
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME. Ignoring location." >&5
|
||||
$as_echo "$as_me: Could not find $POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME. Ignoring location." >&6;}
|
||||
FOUND_FREETYPE=no
|
||||
fi
|
||||
else
|
||||
if test "x$OPENJDK_TARGET_OS" = xwindows; then
|
||||
# On Windows, we will need both .lib and .dll file.
|
||||
if ! test -s "$POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib. Ignoring location." >&5
|
||||
$as_echo "$as_me: Could not find $POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib. Ignoring location." >&6;}
|
||||
FOUND_FREETYPE=no
|
||||
fi
|
||||
elif test "x$OPENJDK_TARGET_OS" = xsolaris \
|
||||
&& test -s "$POTENTIAL_FREETYPE_LIB_PATH$OPENJDK_TARGET_CPU_ISADIR/$FREETYPE_LIB_NAME"; then
|
||||
# Found lib in isa dir, use that instead.
|
||||
POTENTIAL_FREETYPE_LIB_PATH="$POTENTIAL_FREETYPE_LIB_PATH$OPENJDK_TARGET_CPU_ISADIR"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting to use $POTENTIAL_FREETYPE_LIB_PATH instead" >&5
|
||||
$as_echo "$as_me: Rewriting to use $POTENTIAL_FREETYPE_LIB_PATH instead" >&6;}
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$FOUND_FREETYPE" = xyes; then
|
||||
|
||||
# Only process if variable expands to non-empty
|
||||
|
||||
if test "x$POTENTIAL_FREETYPE_INCLUDE_PATH" != x; then
|
||||
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
|
||||
|
||||
# Input might be given as Windows format, start by converting to
|
||||
# unix format.
|
||||
path="$POTENTIAL_FREETYPE_INCLUDE_PATH"
|
||||
new_path=`$CYGPATH -u "$path"`
|
||||
|
||||
# Cygwin tries to hide some aspects of the Windows file system, such that binaries are
|
||||
# named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered
|
||||
# the same file, most of the time (as in "test -f"). But not when running cygpath -s, then
|
||||
# "foo.exe" is OK but "foo" is an error.
|
||||
#
|
||||
# This test is therefore slightly more accurate than "test -f" to check for file precense.
|
||||
# It is also a way to make sure we got the proper file name for the real test later on.
|
||||
test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null`
|
||||
if test "x$test_shortpath" = x; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&5
|
||||
$as_echo "$as_me: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&6;}
|
||||
as_fn_error $? "Cannot locate the the path of POTENTIAL_FREETYPE_INCLUDE_PATH" "$LINENO" 5
|
||||
fi
|
||||
|
||||
# Call helper function which possibly converts this using DOS-style short mode.
|
||||
# If so, the updated path is stored in $new_path.
|
||||
|
||||
input_path="$new_path"
|
||||
# Check if we need to convert this using DOS-style short mode. If the path
|
||||
# contains just simple characters, use it. Otherwise (spaces, weird characters),
|
||||
# take no chances and rewrite it.
|
||||
# Note: m4 eats our [], so we need to use [ and ] instead.
|
||||
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]`
|
||||
if test "x$has_forbidden_chars" != x; then
|
||||
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
|
||||
shortmode_path=`$CYGPATH -s -m -a "$input_path"`
|
||||
path_after_shortmode=`$CYGPATH -u "$shortmode_path"`
|
||||
if test "x$path_after_shortmode" != "x$input_to_shortpath"; then
|
||||
# Going to short mode and back again did indeed matter. Since short mode is
|
||||
# case insensitive, let's make it lowercase to improve readability.
|
||||
shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
# Now convert it back to Unix-style (cygpath)
|
||||
input_path=`$CYGPATH -u "$shortmode_path"`
|
||||
new_path="$input_path"
|
||||
fi
|
||||
fi
|
||||
|
||||
test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/`
|
||||
if test "x$test_cygdrive_prefix" = x; then
|
||||
# As a simple fix, exclude /usr/bin since it's not a real path.
|
||||
if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then
|
||||
# The path is in a Cygwin special directory (e.g. /home). We need this converted to
|
||||
# a path prefixed by /cygdrive for fixpath to work.
|
||||
new_path="$CYGWIN_ROOT_PATH$input_path"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if test "x$path" != "x$new_path"; then
|
||||
POTENTIAL_FREETYPE_INCLUDE_PATH="$new_path"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&5
|
||||
$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&6;}
|
||||
fi
|
||||
|
||||
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
||||
|
||||
path="$POTENTIAL_FREETYPE_INCLUDE_PATH"
|
||||
has_colon=`$ECHO $path | $GREP ^.:`
|
||||
new_path="$path"
|
||||
if test "x$has_colon" = x; then
|
||||
# Not in mixed or Windows style, start by that.
|
||||
new_path=`cmd //c echo $path`
|
||||
fi
|
||||
|
||||
|
||||
input_path="$new_path"
|
||||
# Check if we need to convert this using DOS-style short mode. If the path
|
||||
# contains just simple characters, use it. Otherwise (spaces, weird characters),
|
||||
# take no chances and rewrite it.
|
||||
# Note: m4 eats our [], so we need to use [ and ] instead.
|
||||
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]`
|
||||
if test "x$has_forbidden_chars" != x; then
|
||||
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
|
||||
new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
fi
|
||||
|
||||
|
||||
windows_path="$new_path"
|
||||
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
|
||||
unix_path=`$CYGPATH -u "$windows_path"`
|
||||
new_path="$unix_path"
|
||||
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
||||
unix_path=`$ECHO "$windows_path" | $SED -e 's,^\\(.\\):,/\\1,g' -e 's,\\\\,/,g'`
|
||||
new_path="$unix_path"
|
||||
fi
|
||||
|
||||
if test "x$path" != "x$new_path"; then
|
||||
POTENTIAL_FREETYPE_INCLUDE_PATH="$new_path"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&5
|
||||
$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_INCLUDE_PATH to \"$new_path\"" >&6;}
|
||||
fi
|
||||
|
||||
# Save the first 10 bytes of this path to the storage, so fixpath can work.
|
||||
all_fixpath_prefixes=("${all_fixpath_prefixes[@]}" "${new_path:0:10}")
|
||||
|
||||
else
|
||||
# We're on a unix platform. Hooray! :)
|
||||
path="$POTENTIAL_FREETYPE_INCLUDE_PATH"
|
||||
has_space=`$ECHO "$path" | $GREP " "`
|
||||
if test "x$has_space" != x; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&5
|
||||
$as_echo "$as_me: The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is invalid." >&6;}
|
||||
as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5
|
||||
fi
|
||||
|
||||
# Use eval to expand a potential ~
|
||||
eval path="$path"
|
||||
if test ! -f "$path" && test ! -d "$path"; then
|
||||
as_fn_error $? "The path of POTENTIAL_FREETYPE_INCLUDE_PATH, which resolves as \"$path\", is not found." "$LINENO" 5
|
||||
fi
|
||||
|
||||
if test -d "$path"; then
|
||||
POTENTIAL_FREETYPE_INCLUDE_PATH="`cd "$path"; $THEPWDCMD -L`"
|
||||
else
|
||||
dir="`$DIRNAME "$path"`"
|
||||
base="`$BASENAME "$path"`"
|
||||
POTENTIAL_FREETYPE_INCLUDE_PATH="`cd "$dir"; $THEPWDCMD -L`/$base"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Only process if variable expands to non-empty
|
||||
|
||||
if test "x$POTENTIAL_FREETYPE_LIB_PATH" != x; then
|
||||
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
|
||||
|
||||
# Input might be given as Windows format, start by converting to
|
||||
# unix format.
|
||||
path="$POTENTIAL_FREETYPE_LIB_PATH"
|
||||
new_path=`$CYGPATH -u "$path"`
|
||||
|
||||
# Cygwin tries to hide some aspects of the Windows file system, such that binaries are
|
||||
# named .exe but called without that suffix. Therefore, "foo" and "foo.exe" are considered
|
||||
# the same file, most of the time (as in "test -f"). But not when running cygpath -s, then
|
||||
# "foo.exe" is OK but "foo" is an error.
|
||||
#
|
||||
# This test is therefore slightly more accurate than "test -f" to check for file precense.
|
||||
# It is also a way to make sure we got the proper file name for the real test later on.
|
||||
test_shortpath=`$CYGPATH -s -m "$new_path" 2> /dev/null`
|
||||
if test "x$test_shortpath" = x; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&5
|
||||
$as_echo "$as_me: The path of POTENTIAL_FREETYPE_LIB_PATH, which resolves as \"$path\", is invalid." >&6;}
|
||||
as_fn_error $? "Cannot locate the the path of POTENTIAL_FREETYPE_LIB_PATH" "$LINENO" 5
|
||||
fi
|
||||
|
||||
# Call helper function which possibly converts this using DOS-style short mode.
|
||||
# If so, the updated path is stored in $new_path.
|
||||
|
||||
input_path="$new_path"
|
||||
# Check if we need to convert this using DOS-style short mode. If the path
|
||||
# contains just simple characters, use it. Otherwise (spaces, weird characters),
|
||||
# take no chances and rewrite it.
|
||||
# Note: m4 eats our [], so we need to use [ and ] instead.
|
||||
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-._/a-zA-Z0-9]`
|
||||
if test "x$has_forbidden_chars" != x; then
|
||||
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
|
||||
shortmode_path=`$CYGPATH -s -m -a "$input_path"`
|
||||
path_after_shortmode=`$CYGPATH -u "$shortmode_path"`
|
||||
if test "x$path_after_shortmode" != "x$input_to_shortpath"; then
|
||||
# Going to short mode and back again did indeed matter. Since short mode is
|
||||
# case insensitive, let's make it lowercase to improve readability.
|
||||
shortmode_path=`$ECHO "$shortmode_path" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
# Now convert it back to Unix-style (cygpath)
|
||||
input_path=`$CYGPATH -u "$shortmode_path"`
|
||||
new_path="$input_path"
|
||||
fi
|
||||
fi
|
||||
|
||||
test_cygdrive_prefix=`$ECHO $input_path | $GREP ^/cygdrive/`
|
||||
if test "x$test_cygdrive_prefix" = x; then
|
||||
# As a simple fix, exclude /usr/bin since it's not a real path.
|
||||
if test "x`$ECHO $new_path | $GREP ^/usr/bin/`" = x; then
|
||||
# The path is in a Cygwin special directory (e.g. /home). We need this converted to
|
||||
# a path prefixed by /cygdrive for fixpath to work.
|
||||
new_path="$CYGWIN_ROOT_PATH$input_path"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
if test "x$path" != "x$new_path"; then
|
||||
POTENTIAL_FREETYPE_LIB_PATH="$new_path"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&5
|
||||
$as_echo "$as_me: Rewriting POTENTIAL_FREETYPE_LIB_PATH to \"$new_path\"" >&6;}
|
||||
fi
|
||||
|
||||
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
|
||||
|
||||
path="$POTENTIAL_FREETYPE_LIB_PATH"
|
||||
has_colon=`$ECHO $path | $GREP ^.:`
|
||||
new_path="$path"
|
||||
if test "x$has_colon" = x; then
|
||||
# Not in mixed or Windows style, start by that.
|
||||
new_path=`cmd //c echo $path`
|
||||
fi
|
||||
|
||||
|
||||
input_path="$new_path"
|
||||
# Check if we need to convert this using DOS-style short mode. If the path
|
||||
# contains just simple characters, use it. Otherwise (spaces, weird characters),
|
||||
# take no chances and rewrite it.
|
||||
# Note: m4 eats our [], so we need to use [ and ] instead.
|
||||
has_forbidden_chars=`$ECHO "$input_path" | $GREP [^-_/:a-zA-Z0-9]`
|
||||
if test "x$has_forbidden_chars" != x; then
|
||||
# Now convert it to mixed DOS-style, short mode (no spaces, and / instead of \)
|
||||
new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
fi
|
||||
|
||||
|
||||
windows_path="$new_path"
|
||||
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
|
||||
unix_path=`$CYGPATH -u "$windows_path"`
|
||||
@ -62122,6 +62507,8 @@ $as_echo "$FREETYPE_LIB_PATH" >&6; }
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -62477,6 +62864,8 @@ $as_echo "$as_me: Using FREETYPE_CFLAGS=$FREETYPE_CFLAGS and FREETYPE_LIBS=$FREE
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -62682,6 +63071,8 @@ done
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -62870,6 +63261,8 @@ done
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -62949,6 +63342,8 @@ $as_echo "$LIBFFI_WORKS" >&6; }
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -64058,6 +64453,8 @@ done
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -64142,6 +64539,8 @@ $as_echo "$LIBELF_WORKS" >&6; }
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# 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,7 +25,7 @@
|
||||
|
||||
AC_DEFUN_ONCE([HELP_SETUP_DEPENDENCY_HELP],
|
||||
[
|
||||
AC_CHECK_PROGS(PKGHANDLER, apt-get yum port pkgutil pkgadd)
|
||||
AC_CHECK_PROGS(PKGHANDLER, apt-get yum brew port pkgutil pkgadd)
|
||||
])
|
||||
|
||||
AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY],
|
||||
@ -46,6 +46,8 @@ AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY],
|
||||
apt_help $MISSING_DEPENDENCY ;;
|
||||
yum)
|
||||
yum_help $MISSING_DEPENDENCY ;;
|
||||
brew)
|
||||
brew_help $MISSING_DEPENDENCY ;;
|
||||
port)
|
||||
port_help $MISSING_DEPENDENCY ;;
|
||||
pkgutil)
|
||||
@ -147,6 +149,17 @@ yum_help() {
|
||||
esac
|
||||
}
|
||||
|
||||
brew_help() {
|
||||
case $1 in
|
||||
openjdk)
|
||||
PKGHANDLER_COMMAND="brew cask install java" ;;
|
||||
freetype)
|
||||
PKGHANDLER_COMMAND="brew install freetype" ;;
|
||||
ccache)
|
||||
PKGHANDLER_COMMAND="brew install ccache" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
port_help() {
|
||||
PKGHANDLER_COMMAND=""
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -382,18 +382,18 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JLINK_OPTIONS],
|
||||
AC_ARG_ENABLE([keep-packaged-modules], [AS_HELP_STRING([--disable-keep-packaged-modules],
|
||||
[Do not keep packaged modules in jdk image @<:@enable@:>@])])
|
||||
|
||||
AC_MSG_CHECKING([if packaged modules are kept])
|
||||
if test "x$enable_keep_packaged_modules" = "xyes"; then
|
||||
AC_MSG_CHECKING([if packaged modules are kept])
|
||||
AC_MSG_RESULT([yes])
|
||||
JLINK_KEEP_PACKAGED_MODULES=true
|
||||
elif test "x$enable_keep_packaged_modules" = "xno"; then
|
||||
AC_MSG_CHECKING([if packaged modules are kept])
|
||||
AC_MSG_RESULT([no])
|
||||
JLINK_KEEP_PACKAGED_MODULES=false
|
||||
elif test "x$enable_keep_packaged_modules" = "x"; then
|
||||
AC_MSG_RESULT([yes (default)])
|
||||
JLINK_KEEP_PACKAGED_MODULES=true
|
||||
else
|
||||
AC_MSG_RESULT([error])
|
||||
AC_MSG_ERROR([--enable-keep-packaged-modules accepts no argument])
|
||||
fi
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -348,6 +348,10 @@ AC_DEFUN_ONCE([LIB_SETUP_FREETYPE],
|
||||
FREETYPE_BASE_DIR="$SYSROOT/usr/X11"
|
||||
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
|
||||
fi
|
||||
if test "x$FOUND_FREETYPE" != xyes; then
|
||||
FREETYPE_BASE_DIR="$SYSROOT/usr/local"
|
||||
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
|
||||
fi
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
||||
if test "x$FOUND_FREETYPE" != xyes; then
|
||||
|
@ -274,8 +274,6 @@ JAVADOC_OUTPUTDIR = $(DOCS_IMAGE_DIR)
|
||||
CONFIGURESUPPORT_OUTPUTDIR:=@CONFIGURESUPPORT_OUTPUTDIR@
|
||||
BUILDJDK_OUTPUTDIR=$(BUILD_OUTPUT)/buildjdk
|
||||
|
||||
BUILD_HOTSPOT=@BUILD_HOTSPOT@
|
||||
|
||||
BUILD_FAILURE_HANDLER := @BUILD_FAILURE_HANDLER@
|
||||
|
||||
ENABLE_GENERATE_CLASSLIST := @ENABLE_GENERATE_CLASSLIST@
|
||||
@ -642,7 +640,6 @@ NAWK:=@NAWK@
|
||||
NICE:=@NICE@
|
||||
PATCH:=@PATCH@
|
||||
PRINTF:=@PRINTF@
|
||||
PWD:=@THEPWDCMD@
|
||||
RM:=@RM@
|
||||
RMDIR:=@RMDIR@
|
||||
SED:=@SED@
|
||||
@ -778,11 +775,18 @@ OS_VERSION_MICRO:=@OS_VERSION_MICRO@
|
||||
# Images directory definitions
|
||||
JDK_IMAGE_SUBDIR:=jdk
|
||||
JRE_IMAGE_SUBDIR:=jre
|
||||
JRE_COMPACT1_IMAGE_SUBDIR := jre-compact1
|
||||
JRE_COMPACT2_IMAGE_SUBDIR := jre-compact2
|
||||
JRE_COMPACT3_IMAGE_SUBDIR := jre-compact3
|
||||
|
||||
# Colon left out to be able to override output dir for bootcycle-images
|
||||
JDK_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JDK_IMAGE_SUBDIR)
|
||||
JRE_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(JRE_IMAGE_SUBDIR)
|
||||
|
||||
JRE_COMPACT1_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/$(JRE_COMPACT1_IMAGE_SUBDIR)
|
||||
JRE_COMPACT2_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/$(JRE_COMPACT2_IMAGE_SUBDIR)
|
||||
JRE_COMPACT3_IMAGE_DIR := $(IMAGES_OUTPUTDIR)/$(JRE_COMPACT3_IMAGE_SUBDIR)
|
||||
|
||||
# Test image, as above
|
||||
TEST_IMAGE_SUBDIR:=test
|
||||
TEST_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/$(TEST_IMAGE_SUBDIR)
|
||||
@ -818,6 +822,12 @@ else ifneq ($(DEBUG_LEVEL), release)
|
||||
endif
|
||||
JDK_BUNDLE_NAME := jdk-$(BASE_NAME)_bin$(DEBUG_PART).tar.gz
|
||||
JRE_BUNDLE_NAME := jre-$(BASE_NAME)_bin$(DEBUG_PART).tar.gz
|
||||
JRE_COMPACT1_BUNDLE_NAME := \
|
||||
jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact1_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz
|
||||
JRE_COMPACT2_BUNDLE_NAME := \
|
||||
jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact2_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz
|
||||
JRE_COMPACT3_BUNDLE_NAME := \
|
||||
jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact3_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz
|
||||
JDK_SYMBOLS_BUNDLE_NAME := jdk-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz
|
||||
JRE_SYMBOLS_BUNDLE_NAME := jre-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
|
@ -501,7 +501,7 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
// extra default target.
|
||||
var openOnlyProfilesExtra = {
|
||||
"linux-x86-open": {
|
||||
default_make_targets: "profiles",
|
||||
default_make_targets: "profiles-bundles",
|
||||
configure_args: "--with-jvm-variants=client,server"
|
||||
}
|
||||
};
|
||||
@ -587,6 +587,7 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
],
|
||||
work_dir: input.get("src.full", "install_path") + "/test",
|
||||
environment: {
|
||||
"JT_JAVA": common.boot_jdk_home,
|
||||
"PRODUCT_HOME": input.get(testedProfile + ".jdk", "home_path"),
|
||||
"TEST_IMAGE_DIR": input.get(testedProfile + ".test", "home_path"),
|
||||
"TEST_OUTPUT_DIR": input.src_top_dir
|
||||
@ -710,10 +711,15 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
local: "bundles/\\(jdk.*bin.tar.gz\\)",
|
||||
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
|
||||
},
|
||||
jre: {
|
||||
local: "bundles/\\(jre.*[0-9]_linux-x86_bin.tar.gz\\)",
|
||||
jdk_symbols: {
|
||||
local: "bundles/\\(jdk.*bin-symbols.tar.gz\\)",
|
||||
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
|
||||
},/* The build does not create these
|
||||
},
|
||||
jre: {
|
||||
// This regexp needs to not match the compact* files below
|
||||
local: "bundles/\\(jre.*[+][0-9]\\{1,\\}_linux-x86_bin.tar.gz\\)",
|
||||
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
|
||||
},
|
||||
jre_compact1: {
|
||||
local: "bundles/\\(jre.*-compact1_linux-x86_bin.tar.gz\\)",
|
||||
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
|
||||
@ -725,7 +731,7 @@ var getJibProfilesProfiles = function (input, common, data) {
|
||||
jre_compact3: {
|
||||
local: "bundles/\\(jre.*-compact3_linux-x86_bin.tar.gz\\)",
|
||||
remote: "bundles/openjdk/GPL/profile/linux-x86/\\1",
|
||||
},*/
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
@ -864,7 +870,7 @@ var getJibProfilesDependencies = function (input, common) {
|
||||
jtreg: {
|
||||
server: "javare",
|
||||
revision: "4.2",
|
||||
build_number: "b04",
|
||||
build_number: "b05",
|
||||
checksum_file: "MD5_VALUES",
|
||||
file: "jtreg_bin-4.2.zip",
|
||||
environment_name: "JT_HOME",
|
||||
|
@ -394,3 +394,4 @@ f95cc86b6ac22ec1ade5d4f825dc7782adeea228 jdk-9+148
|
||||
00b19338e505690abe93d5995ed74a473d969c2c jdk-9+149
|
||||
9205e980062a5c4530b51021c6e274025f4ccbdf jdk-9+150
|
||||
77f827f5bbad3ef795664bc675f72d98d156b9f8 jdk-9+151
|
||||
ff8cb43c07c069b1debdee44cb88ca22db1ec757 jdk-9+152
|
||||
|
@ -554,3 +554,4 @@ a82cb5350cad96a0b4de496afebe3ded89f27efa jdk-9+146
|
||||
30e1996bd55da36183434f24ed964adebf9ca71e jdk-9+149
|
||||
98fe046473c90204cbc9b34c512b9fc10dfb8479 jdk-9+150
|
||||
2a2ac7d9f52c8cb2b80077e515b5840b947e640c jdk-9+151
|
||||
31f1d26c60df7b2e516a4f84160d76ba017d4e09 jdk-9+152
|
||||
|
@ -394,3 +394,4 @@ c45db75bfe8bc20bb80b4a009ae3f69c9cd2d885 jdk-9+148
|
||||
5978df8bfa3894f2b3d07b7256f25f78dffb1f9c jdk-9+149
|
||||
f85154af719f99a3b4d81b67a8b4c18a650d10f9 jdk-9+150
|
||||
13c6906bfc861d99dc35a19c80b7a99f0b0ac58d jdk-9+151
|
||||
7e3da313b1746578da648155e37dd8526e83153d jdk-9+152
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
@ -17,20 +17,16 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/*
|
||||
* $Id: DOM2SAX.java,v 1.2.4.1 2005/09/06 11:52:46 pvedula Exp $
|
||||
*/
|
||||
|
||||
|
||||
package com.sun.org.apache.xalan.internal.xsltc.trax;
|
||||
|
||||
import com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl;
|
||||
import com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Stack;
|
||||
import java.util.Vector;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.xml.sax.ContentHandler;
|
||||
@ -58,7 +54,7 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
private ContentHandler _sax = null;
|
||||
private LexicalHandler _lex = null;
|
||||
private SAXImpl _saxImpl = null;
|
||||
private Map<String, Stack> _nsPrefixes = new HashMap<>();
|
||||
private Map<String, Stack<String>> _nsPrefixes = new HashMap<>();
|
||||
|
||||
public DOM2SAX(Node root) {
|
||||
_dom = root;
|
||||
@ -73,7 +69,7 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
{
|
||||
_sax = handler;
|
||||
if (handler instanceof LexicalHandler) {
|
||||
_lex = (LexicalHandler) handler;
|
||||
_lex = (LexicalHandler)handler;
|
||||
}
|
||||
|
||||
if (handler instanceof SAXImpl) {
|
||||
@ -90,25 +86,22 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
throws SAXException
|
||||
{
|
||||
boolean pushed = true;
|
||||
Stack uriStack = _nsPrefixes.get(prefix);
|
||||
Stack<String> uriStack = _nsPrefixes.get(prefix);
|
||||
|
||||
if (uriStack != null) {
|
||||
if (uriStack.isEmpty()) {
|
||||
_sax.startPrefixMapping(prefix, uri);
|
||||
uriStack.push(uri);
|
||||
}
|
||||
else {
|
||||
final String lastUri = (String) uriStack.peek();
|
||||
} else {
|
||||
final String lastUri = uriStack.peek();
|
||||
if (!lastUri.equals(uri)) {
|
||||
_sax.startPrefixMapping(prefix, uri);
|
||||
uriStack.push(uri);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
pushed = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
_sax.startPrefixMapping(prefix, uri);
|
||||
_nsPrefixes.put(prefix, uriStack = new Stack());
|
||||
uriStack.push(uri);
|
||||
@ -123,7 +116,7 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
private void endPrefixMapping(String prefix)
|
||||
throws SAXException
|
||||
{
|
||||
final Stack uriStack = _nsPrefixes.get(prefix);
|
||||
final Stack<String> uriStack = _nsPrefixes.get(prefix);
|
||||
|
||||
if (uriStack != null) {
|
||||
_sax.endPrefixMapping(prefix);
|
||||
@ -131,22 +124,6 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If the DOM was created using a DOM 1.0 API, the local name may be
|
||||
* null. If so, get the local name from the qualified name before
|
||||
* generating the SAX event.
|
||||
*/
|
||||
private static String getLocalName(Node node) {
|
||||
final String localName = node.getLocalName();
|
||||
|
||||
if (localName == null) {
|
||||
final String qname = node.getNodeName();
|
||||
final int col = qname.lastIndexOf(':');
|
||||
return (col > 0) ? qname.substring(col + 1) : qname;
|
||||
}
|
||||
return localName;
|
||||
}
|
||||
|
||||
public void parse(InputSource unused) throws IOException, SAXException {
|
||||
parse(_dom);
|
||||
}
|
||||
@ -173,8 +150,8 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
* declarations.
|
||||
*/
|
||||
private void parse(Node node) throws IOException, SAXException {
|
||||
Node first = null;
|
||||
if (node == null) return;
|
||||
if (node == null)
|
||||
return;
|
||||
|
||||
switch (node.getNodeType()) {
|
||||
case Node.ATTRIBUTE_NODE: // handled by ELEMENT_NODE
|
||||
@ -198,7 +175,6 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
_sax.characters(cdata.toCharArray(), 0, cdata.length());
|
||||
}
|
||||
break;
|
||||
|
||||
case Node.COMMENT_NODE: // should be handled!!!
|
||||
if (_lex != null) {
|
||||
final String value = node.getNodeValue();
|
||||
@ -216,10 +192,9 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
}
|
||||
_sax.endDocument();
|
||||
break;
|
||||
|
||||
case Node.ELEMENT_NODE:
|
||||
String prefix;
|
||||
Vector pushedPrefixes = new Vector();
|
||||
ArrayList<String> pushedPrefixes = new ArrayList<>();
|
||||
final AttributesImpl attrs = new AttributesImpl();
|
||||
final NamedNodeMap map = node.getAttributes();
|
||||
final int length = map.getLength();
|
||||
@ -235,7 +210,7 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
final int colon = qnameAttr.lastIndexOf(':');
|
||||
prefix = (colon > 0) ? qnameAttr.substring(colon + 1) : EMPTYSTRING;
|
||||
if (startPrefixMapping(prefix, uriAttr)) {
|
||||
pushedPrefixes.addElement(prefix);
|
||||
pushedPrefixes.add(prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -248,27 +223,25 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
// Ignore NS declarations here
|
||||
if (!qnameAttr.startsWith(XMLNS_PREFIX)) {
|
||||
final String uriAttr = attr.getNamespaceURI();
|
||||
final String localNameAttr = getLocalName(attr);
|
||||
|
||||
// Uri may be implicitly declared
|
||||
if (uriAttr != null) {
|
||||
final int colon = qnameAttr.lastIndexOf(':');
|
||||
if (colon > 0) {
|
||||
prefix = qnameAttr.substring(0, colon);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// If no prefix for this attr, we need to create
|
||||
// one because we cannot use the default ns
|
||||
prefix = BasisLibrary.generatePrefix();
|
||||
qnameAttr = prefix + ':' + qnameAttr;
|
||||
}
|
||||
if (startPrefixMapping(prefix, uriAttr)) {
|
||||
pushedPrefixes.addElement(prefix);
|
||||
pushedPrefixes.add(prefix);
|
||||
}
|
||||
}
|
||||
|
||||
// Add attribute to list
|
||||
attrs.addAttribute(attr.getNamespaceURI(), getLocalName(attr),
|
||||
attrs.addAttribute(attr.getNamespaceURI(), attr.getLocalName(),
|
||||
qnameAttr, "CDATA", attr.getNodeValue());
|
||||
}
|
||||
}
|
||||
@ -276,22 +249,21 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
// Now process the element itself
|
||||
final String qname = node.getNodeName();
|
||||
final String uri = node.getNamespaceURI();
|
||||
final String localName = getLocalName(node);
|
||||
final String localName = node.getLocalName();
|
||||
|
||||
// Uri may be implicitly declared
|
||||
// URI may be implicitly declared
|
||||
if (uri != null) {
|
||||
final int colon = qname.lastIndexOf(':');
|
||||
prefix = (colon > 0) ? qname.substring(0, colon) : EMPTYSTRING;
|
||||
if (startPrefixMapping(prefix, uri)) {
|
||||
pushedPrefixes.addElement(prefix);
|
||||
pushedPrefixes.add(prefix);
|
||||
}
|
||||
}
|
||||
|
||||
// Generate SAX event to start element
|
||||
if (_saxImpl != null) {
|
||||
_saxImpl.startElement(uri, localName, qname, attrs, node);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
_sax.startElement(uri, localName, qname, attrs);
|
||||
}
|
||||
|
||||
@ -308,15 +280,13 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
// Generate endPrefixMapping() for all pushed prefixes
|
||||
final int nPushedPrefixes = pushedPrefixes.size();
|
||||
for (int i = 0; i < nPushedPrefixes; i++) {
|
||||
endPrefixMapping((String) pushedPrefixes.elementAt(i));
|
||||
endPrefixMapping(pushedPrefixes.get(i));
|
||||
}
|
||||
break;
|
||||
|
||||
case Node.PROCESSING_INSTRUCTION_NODE:
|
||||
_sax.processingInstruction(node.getNodeName(),
|
||||
node.getNodeValue());
|
||||
break;
|
||||
|
||||
case Node.TEXT_NODE:
|
||||
final String data = node.getNodeValue();
|
||||
_sax.characters(data.toCharArray(), 0, data.length());
|
||||
@ -449,36 +419,4 @@ public class DOM2SAX implements XMLReader, Locator {
|
||||
public String getSystemId() {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Debugging
|
||||
private String getNodeTypeFromCode(short code) {
|
||||
String retval = null;
|
||||
switch (code) {
|
||||
case Node.ATTRIBUTE_NODE :
|
||||
retval = "ATTRIBUTE_NODE"; break;
|
||||
case Node.CDATA_SECTION_NODE :
|
||||
retval = "CDATA_SECTION_NODE"; break;
|
||||
case Node.COMMENT_NODE :
|
||||
retval = "COMMENT_NODE"; break;
|
||||
case Node.DOCUMENT_FRAGMENT_NODE :
|
||||
retval = "DOCUMENT_FRAGMENT_NODE"; break;
|
||||
case Node.DOCUMENT_NODE :
|
||||
retval = "DOCUMENT_NODE"; break;
|
||||
case Node.DOCUMENT_TYPE_NODE :
|
||||
retval = "DOCUMENT_TYPE_NODE"; break;
|
||||
case Node.ELEMENT_NODE :
|
||||
retval = "ELEMENT_NODE"; break;
|
||||
case Node.ENTITY_NODE :
|
||||
retval = "ENTITY_NODE"; break;
|
||||
case Node.ENTITY_REFERENCE_NODE :
|
||||
retval = "ENTITY_REFERENCE_NODE"; break;
|
||||
case Node.NOTATION_NODE :
|
||||
retval = "NOTATION_NODE"; break;
|
||||
case Node.PROCESSING_INSTRUCTION_NODE :
|
||||
retval = "PROCESSING_INSTRUCTION_NODE"; break;
|
||||
case Node.TEXT_NODE:
|
||||
retval = "TEXT_NODE"; break;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,13 +1,13 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
* Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2005 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
@ -17,13 +17,17 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
/*
|
||||
* $Id: SAX2DTM2.java,v 1.2.4.1 2005/09/15 08:15:12 suresh_emailid Exp $
|
||||
*/
|
||||
|
||||
package com.sun.org.apache.xml.internal.dtm.ref.sax2dtm;
|
||||
|
||||
import com.sun.org.apache.xml.internal.dtm.*;
|
||||
import com.sun.org.apache.xml.internal.dtm.ref.*;
|
||||
import com.sun.org.apache.xml.internal.dtm.DTM;
|
||||
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
|
||||
import com.sun.org.apache.xml.internal.dtm.DTMException;
|
||||
import com.sun.org.apache.xml.internal.dtm.DTMManager;
|
||||
import com.sun.org.apache.xml.internal.dtm.DTMWSFilter;
|
||||
import com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase;
|
||||
import com.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable;
|
||||
import com.sun.org.apache.xml.internal.dtm.ref.ExtendedType;
|
||||
import com.sun.org.apache.xml.internal.utils.FastStringBuffer;
|
||||
import com.sun.org.apache.xml.internal.utils.XMLString;
|
||||
import com.sun.org.apache.xml.internal.utils.XMLStringDefault;
|
||||
@ -31,11 +35,12 @@ import com.sun.org.apache.xml.internal.utils.XMLStringFactory;
|
||||
import com.sun.org.apache.xml.internal.res.XMLMessages;
|
||||
import com.sun.org.apache.xml.internal.res.XMLErrorResources;
|
||||
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
|
||||
|
||||
import javax.xml.transform.Source;
|
||||
import java.util.Vector;
|
||||
import com.sun.org.apache.xml.internal.utils.SuballocatedIntVector;
|
||||
import org.xml.sax.*;
|
||||
import java.util.ArrayList;
|
||||
import javax.xml.transform.Source;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.ContentHandler;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
/**
|
||||
* SAX2DTM2 is an optimized version of SAX2DTM which is used in non-incremental situation.
|
||||
@ -53,10 +58,6 @@ import org.xml.sax.*;
|
||||
* The design of SAX2DTM2 may limit its extensibilty. If you have a reason to extend the
|
||||
* SAX2DTM model, please extend from SAX2DTM instead of this class.
|
||||
* <p>
|
||||
* TODO: This class is currently only used by XSLTC. We need to investigate the possibility
|
||||
* of also using it in Xalan-J Interpretive. Xalan's performance is likely to get an instant
|
||||
* boost if we use SAX2DTM2 instead of SAX2DTM in non-incremental case.
|
||||
* <p>
|
||||
* %MK% The code in this class is critical to the XSLTC_DTM performance. Be very careful
|
||||
* when making changes here!
|
||||
*/
|
||||
@ -87,11 +88,10 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
if (node == DTMDefaultBase.ROOTNODE)
|
||||
node = getDocument();
|
||||
if (_isRestartable)
|
||||
{
|
||||
if (_isRestartable) {
|
||||
_startNode = node;
|
||||
_currentNode = (node == DTM.NULL) ? DTM.NULL
|
||||
: _firstch2(makeNodeIdentity(node));
|
||||
@ -108,8 +108,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* @return The next node handle in the iteration, or END if no more
|
||||
* are available.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
public int next() {
|
||||
if (_currentNode != NULL) {
|
||||
int node = _currentNode;
|
||||
_currentNode = _nextsib2(node);
|
||||
@ -139,13 +138,11 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return A DTMAxisIterator set to the start of the iteration.
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
public DTMAxisIterator setStartNode(int node) {
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
if (node == DTMDefaultBase.ROOTNODE)
|
||||
node = getDocument();
|
||||
if (_isRestartable)
|
||||
{
|
||||
if (_isRestartable) {
|
||||
_startNode = node;
|
||||
|
||||
if (node != DTM.NULL)
|
||||
@ -229,8 +226,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @param nodeType The extended type ID being requested.
|
||||
*/
|
||||
public TypedChildrenIterator(int nodeType)
|
||||
{
|
||||
public TypedChildrenIterator(int nodeType) {
|
||||
_nodeType = nodeType;
|
||||
}
|
||||
|
||||
@ -242,17 +238,14 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return A DTMAxisIterator set to the start of the iteration.
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
public DTMAxisIterator setStartNode(int node) {
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
if (node == DTMDefaultBase.ROOTNODE)
|
||||
node = getDocument();
|
||||
if (_isRestartable)
|
||||
{
|
||||
if (_isRestartable) {
|
||||
_startNode = node;
|
||||
_currentNode = (node == DTM.NULL)
|
||||
? DTM.NULL
|
||||
: _firstch2(makeNodeIdentity(_startNode));
|
||||
_currentNode = (node == DTM.NULL) ? DTM.NULL :
|
||||
_firstch2(makeNodeIdentity(_startNode));
|
||||
|
||||
return resetPosition();
|
||||
}
|
||||
@ -265,8 +258,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The next node handle in the iteration, or END.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
public int next() {
|
||||
int node = _currentNode;
|
||||
if (node == DTM.NULL)
|
||||
return DTM.NULL;
|
||||
@ -301,14 +293,12 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
_currentNode = _nextsib2(node);
|
||||
return returnNode(makeNodeHandle(node));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the node at the given position.
|
||||
*/
|
||||
public int getNodeByPosition(int position)
|
||||
{
|
||||
public int getNodeByPosition(int position) {
|
||||
if (position <= 0)
|
||||
return DTM.NULL;
|
||||
|
||||
@ -327,8 +317,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
node = _nextsib2(node);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
while (node != DTM.NULL) {
|
||||
if (_exptype2(node) >= DTM.NTYPES) {
|
||||
pos++;
|
||||
@ -415,13 +404,11 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return A DTMAxisIterator set to the start of the iteration.
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
public DTMAxisIterator setStartNode(int node) {
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
if (node == DTMDefaultBase.ROOTNODE)
|
||||
node = getDocument();
|
||||
if (_isRestartable)
|
||||
{
|
||||
if (_isRestartable) {
|
||||
_startNode = node;
|
||||
_currentNode = makeNodeIdentity(node);
|
||||
|
||||
@ -436,8 +423,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The next node handle in the iteration, or END.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
public int next() {
|
||||
_currentNode = (_currentNode == DTM.NULL) ? DTM.NULL
|
||||
: _nextsib2(_currentNode);
|
||||
return returnNode(makeNodeHandle(_currentNode));
|
||||
@ -460,8 +446,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @param type The extended type ID being requested.
|
||||
*/
|
||||
public TypedFollowingSiblingIterator(int type)
|
||||
{
|
||||
public TypedFollowingSiblingIterator(int type) {
|
||||
_nodeType = type;
|
||||
}
|
||||
|
||||
@ -470,8 +455,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The next node handle in the iteration, or END.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
public int next() {
|
||||
if (_currentNode == DTM.NULL) {
|
||||
return DTM.NULL;
|
||||
}
|
||||
@ -481,8 +465,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
|
||||
if (nodeType != DTM.ELEMENT_NODE) {
|
||||
while ((node = _nextsib2(node)) != DTM.NULL && _exptype2(node) != nodeType) {}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
while ((node = _nextsib2(node)) != DTM.NULL && _exptype2(node) < DTM.NTYPES) {}
|
||||
}
|
||||
|
||||
@ -498,8 +481,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
/**
|
||||
* Iterator that returns attribute nodes (of what nodes?)
|
||||
*/
|
||||
public final class AttributeIterator extends InternalAxisIteratorBase
|
||||
{
|
||||
public final class AttributeIterator extends InternalAxisIteratorBase {
|
||||
|
||||
// assumes caller will pass element nodes
|
||||
|
||||
@ -511,13 +493,11 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return A DTMAxisIterator set to the start of the iteration.
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
public DTMAxisIterator setStartNode(int node) {
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
if (node == DTMDefaultBase.ROOTNODE)
|
||||
node = getDocument();
|
||||
if (_isRestartable)
|
||||
{
|
||||
if (_isRestartable) {
|
||||
_startNode = node;
|
||||
_currentNode = getFirstAttributeIdentity(makeNodeIdentity(node));
|
||||
|
||||
@ -532,9 +512,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The next node handle in the iteration, or END.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
|
||||
public int next() {
|
||||
final int node = _currentNode;
|
||||
|
||||
if (node != NULL) {
|
||||
@ -561,8 +539,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @param nodeType The extended type ID that is requested.
|
||||
*/
|
||||
public TypedAttributeIterator(int nodeType)
|
||||
{
|
||||
public TypedAttributeIterator(int nodeType) {
|
||||
_nodeType = nodeType;
|
||||
}
|
||||
|
||||
@ -576,14 +553,10 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return A DTMAxisIterator set to the start of the iteration.
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
if (_isRestartable)
|
||||
{
|
||||
public DTMAxisIterator setStartNode(int node) {
|
||||
if (_isRestartable) {
|
||||
_startNode = node;
|
||||
|
||||
_currentNode = getTypedAttribute(node, _nodeType);
|
||||
|
||||
return resetPosition();
|
||||
}
|
||||
|
||||
@ -595,9 +568,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The next node handle in the iteration, or END.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
|
||||
public int next() {
|
||||
final int node = _currentNode;
|
||||
|
||||
// singleton iterator, since there can only be one attribute of
|
||||
@ -624,8 +595,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return true.
|
||||
*/
|
||||
public boolean isReverse()
|
||||
{
|
||||
public boolean isReverse() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -637,30 +607,25 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return A DTMAxisIterator set to the start of the iteration.
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
public DTMAxisIterator setStartNode(int node) {
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
if (node == DTMDefaultBase.ROOTNODE)
|
||||
node = getDocument();
|
||||
if (_isRestartable)
|
||||
{
|
||||
if (_isRestartable) {
|
||||
_startNode = node;
|
||||
node = _startNodeID = makeNodeIdentity(node);
|
||||
|
||||
if(node == NULL)
|
||||
{
|
||||
if(node == NULL) {
|
||||
_currentNode = node;
|
||||
return resetPosition();
|
||||
}
|
||||
|
||||
int type = _type2(node);
|
||||
if(ExpandedNameTable.ATTRIBUTE == type
|
||||
|| ExpandedNameTable.NAMESPACE == type )
|
||||
if (ExpandedNameTable.ATTRIBUTE == type ||
|
||||
ExpandedNameTable.NAMESPACE == type)
|
||||
{
|
||||
_currentNode = node;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
// Be careful to handle the Document node properly
|
||||
_currentNode = _parent2(node);
|
||||
if(NULL!=_currentNode)
|
||||
@ -680,18 +645,12 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The next node handle in the iteration, or END.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
|
||||
if (_currentNode == _startNodeID || _currentNode == DTM.NULL)
|
||||
{
|
||||
public int next() {
|
||||
if (_currentNode == _startNodeID || _currentNode == DTM.NULL) {
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
final int node = _currentNode;
|
||||
_currentNode = _nextsib2(node);
|
||||
|
||||
return returnNode(makeNodeHandle(node));
|
||||
}
|
||||
}
|
||||
@ -714,8 +673,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @param type The extended type ID being requested.
|
||||
*/
|
||||
public TypedPrecedingSiblingIterator(int type)
|
||||
{
|
||||
public TypedPrecedingSiblingIterator(int type) {
|
||||
_nodeType = type;
|
||||
}
|
||||
|
||||
@ -724,8 +682,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The next node handle in the iteration, or END.
|
||||
*/
|
||||
public int next()
|
||||
{
|
||||
public int next() {
|
||||
int node = _currentNode;
|
||||
|
||||
final int nodeType = _nodeType;
|
||||
@ -735,8 +692,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
while (node != NULL && node != startNodeID && _exptype2(node) != nodeType) {
|
||||
node = _nextsib2(node);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
while (node != NULL && node != startNodeID && _exptype2(node) < DTM.NTYPES) {
|
||||
node = _nextsib2(node);
|
||||
}
|
||||
@ -745,8 +701,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
if (node == DTM.NULL || node == startNodeID) {
|
||||
_currentNode = NULL;
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
_currentNode = _nextsib2(node);
|
||||
return returnNode(makeNodeHandle(node));
|
||||
}
|
||||
@ -755,8 +710,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
/**
|
||||
* Return the index of the last node in this iterator.
|
||||
*/
|
||||
public int getLast()
|
||||
{
|
||||
public int getLast() {
|
||||
if (_last != -1)
|
||||
return _last;
|
||||
|
||||
@ -774,8 +728,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
}
|
||||
node = _nextsib2(node);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
while (node != NULL && node != startNodeID) {
|
||||
if (_exptype2(node) >= DTM.NTYPES) {
|
||||
last++;
|
||||
@ -860,7 +813,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*/
|
||||
public DTMAxisIterator setStartNode(int node)
|
||||
{
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
|
||||
if (node == DTMDefaultBase.ROOTNODE)
|
||||
node = getDocument();
|
||||
if (_isRestartable)
|
||||
@ -1799,9 +1752,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
// %OPT% These values are unlikely to be equal. Storing
|
||||
// them in a plain Vector is more efficient than storing in the
|
||||
// DTMStringPool because we can save the cost for hash calculation.
|
||||
//
|
||||
// %REVISIT% Do we need a custom class (e.g. StringVector) here?
|
||||
protected Vector m_values;
|
||||
protected ArrayList<String> m_values;
|
||||
|
||||
// The current index into the m_values Vector.
|
||||
private int m_valueIndex = 0;
|
||||
@ -1881,9 +1832,8 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
m_buildIdIndex = buildIdIndex;
|
||||
|
||||
// Some documents do not have attribute nodes. That is why
|
||||
// we set the initial size of this Vector to be small and set
|
||||
// the increment to a bigger number.
|
||||
m_values = new Vector(32, 512);
|
||||
// we set the initial size of this ArrayList to be small.
|
||||
m_values = new ArrayList<>(32);
|
||||
|
||||
m_maxNodeIndex = 1 << DTMManager.IDENT_DTM_NODE_BITS;
|
||||
|
||||
@ -1953,10 +1903,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* @param identity A node identity, which <em>must not</em> be equal to
|
||||
* <code>DTM.NULL</code>
|
||||
*/
|
||||
public final int _firstch2(int identity)
|
||||
{
|
||||
//return m_firstch.elementAt(identity);
|
||||
|
||||
public final int _firstch2(int identity) {
|
||||
if (identity < m_blocksize)
|
||||
return m_firstch_map0[identity];
|
||||
else
|
||||
@ -1969,10 +1916,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* @param identity A node identity, which <em>must not</em> be equal to
|
||||
* <code>DTM.NULL</code>
|
||||
*/
|
||||
public final int _parent2(int identity)
|
||||
{
|
||||
//return m_parent.elementAt(identity);
|
||||
|
||||
public final int _parent2(int identity) {
|
||||
if (identity < m_blocksize)
|
||||
return m_parent_map0[identity];
|
||||
else
|
||||
@ -1985,9 +1929,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* @param identity A node identity, which <em>must not</em> be equal to
|
||||
* <code>DTM.NULL</code>
|
||||
*/
|
||||
public final int _type2(int identity)
|
||||
{
|
||||
//int eType = _exptype2(identity);
|
||||
public final int _type2(int identity) {
|
||||
int eType;
|
||||
if (identity < m_blocksize)
|
||||
eType = m_exptype_map0[identity];
|
||||
@ -2006,12 +1948,9 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* <p>This one is only used by DOMAdapter.getExpandedTypeID(int), which
|
||||
* is mostly called from the compiled translets.
|
||||
*/
|
||||
public final int getExpandedTypeID2(int nodeHandle)
|
||||
{
|
||||
public final int getExpandedTypeID2(int nodeHandle) {
|
||||
int nodeID = makeNodeIdentity(nodeHandle);
|
||||
|
||||
//return (nodeID != NULL) ? _exptype2(nodeID) : NULL;
|
||||
|
||||
if (nodeID != NULL) {
|
||||
if (nodeID < m_blocksize)
|
||||
return m_exptype_map0[nodeID];
|
||||
@ -2026,12 +1965,10 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* END of DTM base accessor interfaces
|
||||
*************************************************************************/
|
||||
|
||||
|
||||
/**
|
||||
* Return the node type from the expanded type
|
||||
*/
|
||||
public final int _exptype2Type(int exptype)
|
||||
{
|
||||
public final int _exptype2Type(int exptype) {
|
||||
if (NULL != exptype)
|
||||
return m_extendedTypes[exptype].getNodeType();
|
||||
else
|
||||
@ -2046,16 +1983,14 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @return The prefix if there is one, or null.
|
||||
*/
|
||||
public int getIdForNamespace(String uri)
|
||||
{
|
||||
public int getIdForNamespace(String uri) {
|
||||
int index = m_values.indexOf(uri);
|
||||
if (index < 0)
|
||||
{
|
||||
m_values.addElement(uri);
|
||||
if (index < 0) {
|
||||
m_values.add(uri);
|
||||
return m_valueIndex++;
|
||||
}
|
||||
else
|
||||
} else {
|
||||
return index;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2079,15 +2014,25 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* @param attributes The specified or defaulted attributes.
|
||||
* @throws SAXException Any SAX exception, possibly
|
||||
* wrapping another exception.
|
||||
* @see org.xml.sax.ContentHandler#startElement
|
||||
* @see ContentHandler#startElement
|
||||
*/
|
||||
public void startElement(String uri, String localName, String qName, Attributes attributes)
|
||||
throws SAXException
|
||||
public void startElement(String uri, String localName, String qName,
|
||||
Attributes attributes) throws SAXException
|
||||
{
|
||||
|
||||
charactersFlush();
|
||||
|
||||
int exName = m_expandedNameTable.getExpandedTypeID(uri, localName, DTM.ELEMENT_NODE);
|
||||
// in case URI and localName are empty, the input is not using the
|
||||
// namespaces feature. Then we should take the part after the last
|
||||
// colon of qName as localName (strip all namespace prefixes)
|
||||
if ((uri == null || uri.isEmpty()) &&
|
||||
(localName == null || localName.isEmpty()))
|
||||
{
|
||||
final int colon = qName.lastIndexOf(':');
|
||||
localName = (colon > -1) ? qName.substring(colon + 1) : qName;
|
||||
}
|
||||
|
||||
int exName = m_expandedNameTable.getExpandedTypeID(uri, localName,
|
||||
DTM.ELEMENT_NODE);
|
||||
|
||||
int prefixIndex = (qName.length() != localName.length())
|
||||
? m_valuesOrPrefixes.stringToIndex(qName) : 0;
|
||||
@ -2095,7 +2040,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
int elemNode = addNode(DTM.ELEMENT_NODE, exName,
|
||||
m_parents.peek(), m_previous, prefixIndex, true);
|
||||
|
||||
if(m_indexing)
|
||||
if (m_indexing)
|
||||
indexNode(exName, elemNode);
|
||||
|
||||
m_parents.push(elemNode);
|
||||
@ -2104,31 +2049,31 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
int nDecls = m_prefixMappings.size();
|
||||
String prefix;
|
||||
|
||||
if(!m_pastFirstElement)
|
||||
{
|
||||
if (!m_pastFirstElement) {
|
||||
// SPECIAL CASE: Implied declaration at root element
|
||||
prefix="xml";
|
||||
prefix = "xml";
|
||||
String declURL = "http://www.w3.org/XML/1998/namespace";
|
||||
exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
|
||||
m_values.addElement(declURL);
|
||||
exName = m_expandedNameTable.getExpandedTypeID(null, prefix,
|
||||
DTM.NAMESPACE_NODE);
|
||||
m_values.add(declURL);
|
||||
int val = m_valueIndex++;
|
||||
addNode(DTM.NAMESPACE_NODE, exName, elemNode,
|
||||
DTM.NULL, val, false);
|
||||
m_pastFirstElement=true;
|
||||
}
|
||||
|
||||
for (int i = startDecls; i < nDecls; i += 2)
|
||||
{
|
||||
prefix = (String) m_prefixMappings.elementAt(i);
|
||||
for (int i = startDecls; i < nDecls; i += 2) {
|
||||
prefix = m_prefixMappings.elementAt(i);
|
||||
|
||||
if (prefix == null)
|
||||
continue;
|
||||
|
||||
String declURL = (String) m_prefixMappings.elementAt(i + 1);
|
||||
String declURL = m_prefixMappings.elementAt(i + 1);
|
||||
|
||||
exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
|
||||
exName = m_expandedNameTable.getExpandedTypeID(null, prefix,
|
||||
DTM.NAMESPACE_NODE);
|
||||
|
||||
m_values.addElement(declURL);
|
||||
m_values.add(declURL);
|
||||
int val = m_valueIndex++;
|
||||
|
||||
addNode(DTM.NAMESPACE_NODE, exName, elemNode, DTM.NULL, val, false);
|
||||
@ -2136,28 +2081,37 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
|
||||
int n = attributes.getLength();
|
||||
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
for (int i = 0; i < n; i++) {
|
||||
String attrUri = attributes.getURI(i);
|
||||
String attrLocalName = attributes.getLocalName(i);
|
||||
String attrQName = attributes.getQName(i);
|
||||
String valString = attributes.getValue(i);
|
||||
|
||||
// in case URI and localName are empty, the input is not using the
|
||||
// namespaces feature. Then we should take the part after the last
|
||||
// colon of qName as localName (strip all namespace prefixes)
|
||||
// When the URI is empty but localName has colons then we can also
|
||||
// assume non namespace aware and prefixes can be stripped
|
||||
if (attrUri == null || attrUri.isEmpty()) {
|
||||
if (attrLocalName == null || attrLocalName.isEmpty()) {
|
||||
final int colon = attrQName.lastIndexOf(':');
|
||||
attrLocalName = (colon > -1) ? attrQName.substring(colon + 1) : attrQName;
|
||||
} else {
|
||||
final int colon = attrLocalName.lastIndexOf(':');
|
||||
attrLocalName = (colon > -1) ? attrLocalName.substring(colon + 1) : attrLocalName;
|
||||
}
|
||||
}
|
||||
|
||||
int nodeType;
|
||||
|
||||
String attrLocalName = attributes.getLocalName(i);
|
||||
|
||||
if ((null != attrQName)
|
||||
&& (attrQName.equals("xmlns")
|
||||
|| attrQName.startsWith("xmlns:")))
|
||||
if ((null != attrQName) &&
|
||||
(attrQName.equals("xmlns") || attrQName.startsWith("xmlns:")))
|
||||
{
|
||||
prefix = getPrefix(attrQName, attrUri);
|
||||
if (declAlreadyDeclared(prefix))
|
||||
continue; // go to the next attribute.
|
||||
|
||||
nodeType = DTM.NAMESPACE_NODE;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
nodeType = DTM.ATTRIBUTE_NODE;
|
||||
|
||||
if (m_buildIdIndex && attributes.getType(i).equalsIgnoreCase("ID"))
|
||||
@ -2166,36 +2120,31 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
|
||||
// Bit of a hack... if somehow valString is null, stringToIndex will
|
||||
// return -1, which will make things very unhappy.
|
||||
if(null == valString)
|
||||
if (null == valString)
|
||||
valString = "";
|
||||
|
||||
m_values.addElement(valString);
|
||||
m_values.add(valString);
|
||||
int val = m_valueIndex++;
|
||||
|
||||
if (attrLocalName.length() != attrQName.length())
|
||||
{
|
||||
|
||||
if (attrLocalName.length() != attrQName.length()) {
|
||||
prefixIndex = m_valuesOrPrefixes.stringToIndex(attrQName);
|
||||
|
||||
int dataIndex = m_data.size();
|
||||
|
||||
m_data.addElement(prefixIndex);
|
||||
m_data.addElement(val);
|
||||
|
||||
val = -dataIndex;
|
||||
}
|
||||
|
||||
exName = m_expandedNameTable.getExpandedTypeID(attrUri, attrLocalName, nodeType);
|
||||
addNode(nodeType, exName, elemNode, DTM.NULL, val,
|
||||
false);
|
||||
exName = m_expandedNameTable.getExpandedTypeID(attrUri, attrLocalName,
|
||||
nodeType);
|
||||
addNode(nodeType, exName, elemNode, DTM.NULL, val, false);
|
||||
}
|
||||
|
||||
if (null != m_wsfilter)
|
||||
{
|
||||
short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode), this);
|
||||
boolean shouldStrip = (DTMWSFilter.INHERIT == wsv)
|
||||
? getShouldStripWhitespace()
|
||||
: (DTMWSFilter.STRIP == wsv);
|
||||
if (null != m_wsfilter) {
|
||||
short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode),
|
||||
this);
|
||||
boolean shouldStrip = (DTMWSFilter.INHERIT == wsv) ?
|
||||
getShouldStripWhitespace() :
|
||||
(DTMWSFilter.STRIP == wsv);
|
||||
|
||||
pushShouldStripWhitespace(shouldStrip);
|
||||
}
|
||||
@ -2223,7 +2172,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* empty string if qualified names are not available.
|
||||
* @throws SAXException Any SAX exception, possibly
|
||||
* wrapping another exception.
|
||||
* @see org.xml.sax.ContentHandler#endElement
|
||||
* @see ContentHandler#endElement
|
||||
*/
|
||||
public void endElement(String uri, String localName, String qName)
|
||||
throws SAXException
|
||||
@ -2257,9 +2206,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* @param length The number of characters to use from the array.
|
||||
* @throws SAXException The application may raise an exception.
|
||||
*/
|
||||
public void comment(char ch[], int start, int length) throws SAXException
|
||||
{
|
||||
|
||||
public void comment(char ch[], int start, int length) throws SAXException {
|
||||
if (m_insideDTD) // ignore comments if we're inside the DTD
|
||||
return;
|
||||
|
||||
@ -2267,7 +2214,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
|
||||
// %OPT% Saving the comment string in a Vector has a lower cost than
|
||||
// saving it in DTMStringPool.
|
||||
m_values.addElement(new String(ch, start, length));
|
||||
m_values.add(new String(ch, start, length));
|
||||
int dataIndex = m_valueIndex++;
|
||||
|
||||
m_previous = addNode(DTM.COMMENT_NODE, DTM.COMMENT_NODE,
|
||||
@ -2279,13 +2226,10 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @throws SAXException Any SAX exception, possibly
|
||||
* wrapping another exception.
|
||||
* @see org.xml.sax.ContentHandler#startDocument
|
||||
* @see ContentHandler#startDocument
|
||||
*/
|
||||
public void startDocument() throws SAXException
|
||||
{
|
||||
|
||||
int doc = addNode(DTM.DOCUMENT_NODE,
|
||||
DTM.DOCUMENT_NODE,
|
||||
public void startDocument() throws SAXException {
|
||||
int doc = addNode(DTM.DOCUMENT_NODE, DTM.DOCUMENT_NODE,
|
||||
DTM.NULL, DTM.NULL, 0, true);
|
||||
|
||||
m_parents.push(doc);
|
||||
@ -2299,10 +2243,9 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
*
|
||||
* @throws SAXException Any SAX exception, possibly
|
||||
* wrapping another exception.
|
||||
* @see org.xml.sax.ContentHandler#endDocument
|
||||
* @see ContentHandler#endDocument
|
||||
*/
|
||||
public void endDocument() throws SAXException
|
||||
{
|
||||
public void endDocument() throws SAXException {
|
||||
super.endDocument();
|
||||
|
||||
// Add a NULL entry to the end of the node arrays as
|
||||
@ -2334,16 +2277,15 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* @return The index identity of the node that was added.
|
||||
*/
|
||||
protected final int addNode(int type, int expandedTypeID,
|
||||
int parentIndex, int previousSibling,
|
||||
int dataOrPrefix, boolean canHaveFirstChild)
|
||||
int parentIndex, int previousSibling,
|
||||
int dataOrPrefix, boolean canHaveFirstChild)
|
||||
{
|
||||
// Common to all nodes:
|
||||
int nodeIndex = m_size++;
|
||||
|
||||
// Have we overflowed a DTM Identity's addressing range?
|
||||
//if(m_dtmIdent.size() == (nodeIndex>>>DTMManager.IDENT_DTM_NODE_BITS))
|
||||
if (nodeIndex == m_maxNodeIndex)
|
||||
{
|
||||
if (nodeIndex == m_maxNodeIndex) {
|
||||
addNewDTMID(nodeIndex);
|
||||
m_maxNodeIndex += (1 << DTMManager.IDENT_DTM_NODE_BITS);
|
||||
}
|
||||
@ -2366,8 +2308,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
// is called, to handle successive characters() events.
|
||||
|
||||
// Special handling by type: Declare namespaces, attach first child
|
||||
switch(type)
|
||||
{
|
||||
switch(type) {
|
||||
case DTM.NAMESPACE_NODE:
|
||||
declareNamespaceInContext(parentIndex,nodeIndex);
|
||||
break;
|
||||
@ -2376,8 +2317,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
default:
|
||||
if (DTM.NULL != previousSibling) {
|
||||
m_nextsib.setElementAt(nodeIndex,previousSibling);
|
||||
}
|
||||
else if (DTM.NULL != parentIndex) {
|
||||
} else if (DTM.NULL != parentIndex) {
|
||||
m_firstch.setElementAt(nodeIndex,parentIndex);
|
||||
}
|
||||
break;
|
||||
@ -2390,16 +2330,12 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* Check whether accumulated text should be stripped; if not,
|
||||
* append the appropriate flavor of text/cdata node.
|
||||
*/
|
||||
protected final void charactersFlush()
|
||||
{
|
||||
|
||||
if (m_textPendingStart >= 0) // -1 indicates no-text-in-progress
|
||||
{
|
||||
protected final void charactersFlush() {
|
||||
if (m_textPendingStart >= 0) { // -1 indicates no-text-in-progress
|
||||
int length = m_chars.size() - m_textPendingStart;
|
||||
boolean doStrip = false;
|
||||
|
||||
if (getShouldStripWhitespace())
|
||||
{
|
||||
if (getShouldStripWhitespace()) {
|
||||
doStrip = m_chars.isWhitespace(m_textPendingStart, length);
|
||||
}
|
||||
|
||||
@ -2412,19 +2348,19 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
// If the offset and length do not exceed the given limits
|
||||
// (offset < 2^21 and length < 2^10), then save both the offset
|
||||
// and length in a bitwise encoded value.
|
||||
if (length <= TEXT_LENGTH_MAX
|
||||
&& m_textPendingStart <= TEXT_OFFSET_MAX) {
|
||||
if (length <= TEXT_LENGTH_MAX &&
|
||||
m_textPendingStart <= TEXT_OFFSET_MAX) {
|
||||
m_previous = addNode(m_coalescedTextType, DTM.TEXT_NODE,
|
||||
m_parents.peek(), m_previous,
|
||||
length + (m_textPendingStart << TEXT_LENGTH_BITS),
|
||||
false);
|
||||
m_parents.peek(), m_previous,
|
||||
length + (m_textPendingStart << TEXT_LENGTH_BITS),
|
||||
false);
|
||||
|
||||
} else {
|
||||
// Store offset and length in the m_data array if one exceeds
|
||||
// the given limits. Use a negative dataIndex as an indication.
|
||||
int dataIndex = m_data.size();
|
||||
m_previous = addNode(m_coalescedTextType, DTM.TEXT_NODE,
|
||||
m_parents.peek(), m_previous, -dataIndex, false);
|
||||
m_parents.peek(), m_previous, -dataIndex, false);
|
||||
|
||||
m_data.addElement(m_textPendingStart);
|
||||
m_data.addElement(length);
|
||||
@ -2452,7 +2388,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
* none is supplied.
|
||||
* @throws SAXException Any SAX exception, possibly
|
||||
* wrapping another exception.
|
||||
* @see org.xml.sax.ContentHandler#processingInstruction
|
||||
* @see ContentHandler#processingInstruction
|
||||
*/
|
||||
public void processingInstruction(String target, String data)
|
||||
throws SAXException
|
||||
@ -2467,7 +2403,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
-dataIndex, false);
|
||||
|
||||
m_data.addElement(m_valuesOrPrefixes.stringToIndex(target));
|
||||
m_values.addElement(data);
|
||||
m_values.add(data);
|
||||
m_data.addElement(m_valueIndex++);
|
||||
|
||||
}
|
||||
@ -2865,9 +2801,9 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
}
|
||||
|
||||
if (m_xstrf != null)
|
||||
return m_xstrf.newstr((String)m_values.elementAt(dataIndex));
|
||||
return m_xstrf.newstr(m_values.get(dataIndex));
|
||||
else
|
||||
return new XMLStringDefault((String)m_values.elementAt(dataIndex));
|
||||
return new XMLStringDefault(m_values.get(dataIndex));
|
||||
}
|
||||
}
|
||||
|
||||
@ -2966,7 +2902,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
dataIndex = m_data.elementAt(dataIndex + 1);
|
||||
}
|
||||
|
||||
return (String)m_values.elementAt(dataIndex);
|
||||
return m_values.get(dataIndex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3106,7 +3042,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
dataIndex = m_data.elementAt(dataIndex + 1);
|
||||
}
|
||||
|
||||
String str = (String)m_values.elementAt(dataIndex);
|
||||
String str = m_values.get(dataIndex);
|
||||
|
||||
if(normalize)
|
||||
FastStringBuffer.sendNormalizedSAXcharacters(str.toCharArray(),
|
||||
@ -3160,7 +3096,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
dataIndex = m_data.elementAt(dataIndex + 1);
|
||||
}
|
||||
|
||||
return (String)m_values.elementAt(dataIndex);
|
||||
return m_values.get(dataIndex);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3202,8 +3138,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
if (uri.length() == 0) {
|
||||
handler.startElement(name);
|
||||
return name;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int qnameIndex = m_dataOrQName.elementAt(nodeID);
|
||||
|
||||
if (qnameIndex == 0) {
|
||||
@ -3223,14 +3158,12 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
String prefix;
|
||||
if (prefixIndex > 0) {
|
||||
prefix = qName.substring(0, prefixIndex);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
prefix = null;
|
||||
}
|
||||
handler.namespaceAfterStartElement(prefix, uri);
|
||||
return qName;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3285,7 +3218,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
dataIndex = m_data.elementAt(dataIndex + 1);
|
||||
}
|
||||
|
||||
String nodeValue = (String)m_values.elementAt(dataIndex);
|
||||
String nodeValue = m_values.get(dataIndex);
|
||||
|
||||
handler.namespaceAfterStartElement(nodeName, nodeValue);
|
||||
|
||||
@ -3335,7 +3268,6 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Copy an Attribute node to a SerializationHandler
|
||||
*
|
||||
@ -3347,14 +3279,6 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
SerializationHandler handler)
|
||||
throws SAXException
|
||||
{
|
||||
/*
|
||||
final String uri = getNamespaceName(node);
|
||||
if (uri.length() != 0) {
|
||||
final String prefix = getPrefix(node);
|
||||
handler.namespaceAfterStartElement(prefix, uri);
|
||||
}
|
||||
handler.addAttribute(getNodeName(node), getNodeValue(node));
|
||||
*/
|
||||
final ExtendedType extType = m_extendedTypes[exptype];
|
||||
final String uri = extType.getNamespace();
|
||||
final String localName = extType.getLocalName();
|
||||
@ -3377,7 +3301,7 @@ public class SAX2DTM2 extends SAX2DTM
|
||||
}
|
||||
|
||||
String nodeName = (prefix != null) ? qname : localName;
|
||||
String nodeValue = (String)m_values.elementAt(valueIndex);
|
||||
String nodeValue = m_values.get(valueIndex);
|
||||
|
||||
handler.addAttribute(uri, localName, nodeName, "CDATA", nodeValue);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -58,7 +58,7 @@ class AltCatalog extends BaseEntry {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the catalog attribute as an URI String.
|
||||
* Returns the catalog attribute as a URI String.
|
||||
* @return The value of the catalog attribute
|
||||
*/
|
||||
String getCatalogId() {
|
||||
@ -66,7 +66,7 @@ class AltCatalog extends BaseEntry {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the catalog attribute as an URI.
|
||||
* Returns the catalog attribute as a URI.
|
||||
* @return The value of the catalog attribute
|
||||
*/
|
||||
URI getCatalogURI() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,6 +27,7 @@ package javax.xml.catalog;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.util.Objects;
|
||||
import static javax.xml.catalog.CatalogMessages.ERR_INVALID_ARGUMENT;
|
||||
|
||||
/**
|
||||
* Represents a general Catalog entry.
|
||||
@ -210,13 +211,12 @@ abstract class BaseEntry {
|
||||
* @param arg The name of the argument
|
||||
* @param uri The URI to be verified
|
||||
* @return The URI created from the specified uri
|
||||
* @throws IllegalArgumentException if the specified uri is null,
|
||||
* or an URL can not be created based on the specified base and uri
|
||||
* @throws NullPointerException if the specified uri is null
|
||||
* @throws IllegalArgumentException if a URL can not be created based on
|
||||
* the specified base and uri
|
||||
*/
|
||||
URL verifyURI(String arg, URL base, String uri) {
|
||||
if (uri == null) {
|
||||
CatalogMessages.reportIAE(new Object[]{uri, arg}, null);
|
||||
}
|
||||
CatalogMessages.reportNPEOnNull(arg, uri);
|
||||
|
||||
URL url = null;
|
||||
uri = Normalizer.normalizeURI(uri);
|
||||
@ -228,32 +228,9 @@ abstract class BaseEntry {
|
||||
url = new URL(uri);
|
||||
}
|
||||
} catch (MalformedURLException e) {
|
||||
CatalogMessages.reportIAE(new Object[]{uri, arg}, e);
|
||||
CatalogMessages.reportIAE(ERR_INVALID_ARGUMENT,
|
||||
new Object[]{uri, arg}, e);
|
||||
}
|
||||
return url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct an absolute URI from a relative one, using the current base
|
||||
* URI.
|
||||
*
|
||||
* @param sysid The (possibly relative) system identifier
|
||||
* @return The system identifier made absolute with respect to the current
|
||||
* {@link #base}.
|
||||
*/
|
||||
protected String makeAbsolute(String sysid) {
|
||||
URL local = null;
|
||||
|
||||
sysid = Util.fixSlashes(sysid);
|
||||
/**
|
||||
* try { local = new URL(base, sysid); } catch (MalformedURLException e)
|
||||
* { catalogManager.debug.message(1, "Malformed URL on system
|
||||
* identifier", sysid); }
|
||||
*/
|
||||
if (local != null) {
|
||||
return local.toString();
|
||||
} else {
|
||||
return sysid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 @@ import java.util.stream.Stream;
|
||||
* <ul>
|
||||
* <li>Locate the external resources with a public or system identifier;
|
||||
* </li>
|
||||
* <li>Locate an alternate URI reference with an URI.
|
||||
* <li>Locate an alternate URI reference with a URI.
|
||||
* </li>
|
||||
* </ul>
|
||||
* <p>
|
||||
@ -84,7 +84,7 @@ public interface Catalog {
|
||||
*
|
||||
* @param systemId the system identifier of the entity to be matched
|
||||
*
|
||||
* @return an URI string if a mapping is found, or null otherwise
|
||||
* @return a URI string if a mapping is found, or null otherwise
|
||||
*/
|
||||
public String matchSystem(String systemId);
|
||||
|
||||
@ -108,7 +108,7 @@ public interface Catalog {
|
||||
*
|
||||
* @param publicId the public identifier of the entity to be matched
|
||||
* @see CatalogFeatures.Feature
|
||||
* @return an URI string if a mapping is found, or null otherwise
|
||||
* @return a URI string if a mapping is found, or null otherwise
|
||||
*/
|
||||
public String matchPublic(String publicId);
|
||||
|
||||
@ -134,7 +134,7 @@ public interface Catalog {
|
||||
*
|
||||
* @param uri the URI reference of the entity to be matched
|
||||
*
|
||||
* @return an URI string if a mapping is found, or null otherwise
|
||||
* @return a URI string if a mapping is found, or null otherwise
|
||||
*/
|
||||
public String matchURI(String uri);
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -56,14 +56,14 @@ import jdk.xml.internal.SecuritySupport;
|
||||
*
|
||||
* <tr>
|
||||
* <td><a name="FILES">FILES</a></td>
|
||||
* <td>A semicolon-delimited list of catalog files. Relative file paths are
|
||||
* considered relative to ${user.dir}.
|
||||
* <td>A semicolon-delimited list of URIs to locate the catalog files.
|
||||
* The URIs must be absolute and have a URL protocol handler for the URI scheme.
|
||||
* </td>
|
||||
* <td>javax.xml.catalog.files</td>
|
||||
* <td>javax.xml.catalog.files</td>
|
||||
* <td>javax.xml.catalog.files</td>
|
||||
* <td>String</td>
|
||||
* <td>File paths</td>
|
||||
* <td>URIs</td>
|
||||
* <td>
|
||||
* Reads the first catalog as the current catalog; Loads others if no match
|
||||
* is found in the current catalog including delegate catalogs if any.
|
||||
@ -170,7 +170,7 @@ import jdk.xml.internal.SecuritySupport;
|
||||
* Properties set through the Catalog API override those that may have been set
|
||||
* by system properties and/or in {@code jaxp.properties}. In case of multiple
|
||||
* interfaces, the latest in a procedure shall take preference. For
|
||||
* {@link Feature#FILES}, this means that the path(s) specified through the methods
|
||||
* {@link Feature#FILES}, this means that the URI(s) specified through the methods
|
||||
* of the {@link CatalogManager} will override any that may have been entered
|
||||
* through the {@link Builder}.
|
||||
*
|
||||
@ -188,7 +188,7 @@ import jdk.xml.internal.SecuritySupport;
|
||||
* in the following sample code:
|
||||
* <pre>{@code
|
||||
CatalogFeatures f = CatalogFeatures.builder()
|
||||
.with(Feature.FILES, "catalog.xml")
|
||||
.with(Feature.FILES, "file:///etc/xml/catalog")
|
||||
.with(Feature.PREFER, "public")
|
||||
.with(Feature.DEFER, "true")
|
||||
.with(Feature.RESOLVE, "ignore")
|
||||
@ -202,14 +202,14 @@ import jdk.xml.internal.SecuritySupport;
|
||||
* Schema Validation ({@link javax.xml.validation}), and XML Transformation
|
||||
* ({@link javax.xml.transform}). The features described above can be set through JAXP
|
||||
* factories or processors that define a setProperty or setAttribute interface.
|
||||
* For example, the following code snippet sets a path to a catalog file on a SAX
|
||||
* For example, the following code snippet sets a URI to a catalog file on a SAX
|
||||
* parser through the {@code javax.xml.catalog.files} property:
|
||||
* <p>
|
||||
* <pre>{@code
|
||||
* SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||
* spf.setFeature(XMLConstants.USE_CATALOG, true); [1]
|
||||
* SAXParser parser = spf.newSAXParser();
|
||||
* parser.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), "catalog.xml");
|
||||
* parser.setProperty(CatalogFeatures.Feature.FILES.getPropertyName(), "file:///etc/xml/catalog");
|
||||
* }</pre>
|
||||
* <p>
|
||||
* [1] Note that this statement is not required since the default value of
|
||||
@ -275,7 +275,7 @@ import jdk.xml.internal.SecuritySupport;
|
||||
The following XInclude element:
|
||||
<xi:include href="http://openjdk.java.net/xml/disclaimer.xml"/>
|
||||
|
||||
can be resolved using an uri entry:
|
||||
can be resolved using a URI entry:
|
||||
<uri name="http://openjdk.java.net/xml/disclaimer.xml" uri="file:///pathto/local/disclaimer.xml"/>
|
||||
or
|
||||
<uriSuffix uriSuffix="disclaimer.xml" uri="file:///pathto/local/disclaimer.xml"/>
|
||||
@ -291,7 +291,7 @@ import jdk.xml.internal.SecuritySupport;
|
||||
<xsd:import namespace="http://openjdk.java.net/xsd/XSDImport_person"
|
||||
schemaLocation="http://openjdk.java.net/xsd/XSDImport_person.xsd"/>
|
||||
|
||||
can be resolved using an uri entry:
|
||||
can be resolved using a URI entry:
|
||||
<uri name="http://openjdk.java.net/xsd/XSDImport_person.xsd" uri="file:///pathto/local/XSDImport_person.xsd"/>
|
||||
or
|
||||
<uriSuffix uriSuffix="XSDImport_person.xsd" uri="file:///pathto/local/XSDImport_person.xsd"/>
|
||||
@ -308,7 +308,7 @@ import jdk.xml.internal.SecuritySupport;
|
||||
The following include element:
|
||||
<xsd:include schemaLocation="http://openjdk.java.net/xsd/XSDInclude_person.xsd"/>
|
||||
|
||||
can be resolved using an uri entry:
|
||||
can be resolved using a URI entry:
|
||||
<uri name="http://openjdk.java.net/xsd/XSDInclude_person.xsd" uri="file:///pathto/local/XSDInclude_person.xsd"/>
|
||||
or
|
||||
<uriSuffix uriSuffix="XSDInclude_person.xsd" uri="file:///pathto/local/XSDInclude_person.xsd"/>
|
||||
@ -323,7 +323,7 @@ import jdk.xml.internal.SecuritySupport;
|
||||
The following include element:
|
||||
<xsl:include href="http://openjdk.java.net/xsl/include.xsl"/>
|
||||
|
||||
can be resolved using an uri entry:
|
||||
can be resolved using a URI entry:
|
||||
<uri name="http://openjdk.java.net/xsl/include.xsl" uri="file:///pathto/local/include.xsl"/>
|
||||
or
|
||||
<uriSuffix uriSuffix="include.xsl" uri="file:///pathto/local/include.xsl"/>
|
||||
@ -338,7 +338,7 @@ import jdk.xml.internal.SecuritySupport;
|
||||
The document in the following element:
|
||||
<xsl:variable name="dummy" select="document('http://openjdk.java.net/xsl/list.xml')"/>
|
||||
|
||||
can be resolved using an uri entry:
|
||||
can be resolved using a URI entry:
|
||||
<uri name="http://openjdk.java.net/xsl/list.xml" uri="file:///pathto/local/list.xml"/>
|
||||
or
|
||||
<uriSuffix uriSuffix="list.xml" uri="file:///pathto/local/list.xml"/>
|
||||
@ -559,7 +559,7 @@ public class CatalogFeatures {
|
||||
values = new String[Feature.values().length];
|
||||
states = new State[Feature.values().length];
|
||||
for (Feature cf : Feature.values()) {
|
||||
setProperty(cf.ordinal(), State.DEFAULT, cf.defaultValue());
|
||||
setProperty(cf, State.DEFAULT, cf.defaultValue());
|
||||
}
|
||||
//read system properties or jaxp.properties
|
||||
readSystemProperties();
|
||||
@ -571,52 +571,27 @@ public class CatalogFeatures {
|
||||
*/
|
||||
private void setProperties(Builder builder) {
|
||||
builder.values.entrySet().stream().forEach((entry) -> {
|
||||
setProperty(entry.getKey().ordinal(), State.APIPROPERTY, entry.getValue());
|
||||
setProperty(entry.getKey(), State.APIPROPERTY, entry.getValue());
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Sets the value of a property by its index, updates only if it shall override.
|
||||
* Sets the value of a property, updates only if it shall override.
|
||||
*
|
||||
* @param index the index of the property
|
||||
* @param state the state of the property
|
||||
* @param value the value of the property
|
||||
* @throws IllegalArgumentException if the value is invalid
|
||||
*/
|
||||
private void setProperty(int index, State state, String value) {
|
||||
private void setProperty(Feature feature, State state, String value) {
|
||||
int index = feature.ordinal();
|
||||
if (value != null && value.length() != 0) {
|
||||
if (index == Feature.PREFER.ordinal()) {
|
||||
if (!value.equals(PREFER_SYSTEM) && !value.equals(PREFER_PUBLIC)) {
|
||||
CatalogMessages.reportIAE(new Object[]{value, Feature.PREFER.name()}, null);
|
||||
}
|
||||
} else if (index == Feature.DEFER.ordinal()) {
|
||||
if (!value.equals(DEFER_TRUE) && !value.equals(DEFER_FALSE)) {
|
||||
CatalogMessages.reportIAE(new Object[]{value, Feature.DEFER.name()}, null);
|
||||
}
|
||||
} else if (index == Feature.RESOLVE.ordinal()) {
|
||||
if (!value.equals(RESOLVE_STRICT) && !value.equals(RESOLVE_CONTINUE)
|
||||
&& !value.equals(RESOLVE_IGNORE)) {
|
||||
CatalogMessages.reportIAE(new Object[]{value, Feature.RESOLVE.name()}, null);
|
||||
}
|
||||
} else if (index == Feature.FILES.ordinal()) {
|
||||
try {
|
||||
String[] catalogFile = value.split(";[ ]*");
|
||||
for (String temp : catalogFile) {
|
||||
if (Util.verifyAndGetURI(temp, null) == null) {
|
||||
CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, null);
|
||||
}
|
||||
}
|
||||
}catch (MalformedURLException | URISyntaxException | IllegalArgumentException ex) {
|
||||
CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, ex);
|
||||
}
|
||||
if (state != State.APIPROPERTY) {
|
||||
Util.validateFeatureInput(feature, value);
|
||||
}
|
||||
if (states[index] == null || state.compareTo(states[index]) >= 0) {
|
||||
values[index] = value;
|
||||
states[index] = state;
|
||||
}
|
||||
} else {
|
||||
if (state == State.SYSTEMPROPERTY || state == State.JAXPDOTPROPERTIES) {
|
||||
CatalogMessages.reportIAE(new Object[]{value, Feature.values()[index].name()}, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -639,13 +614,13 @@ public class CatalogFeatures {
|
||||
if (cf.hasSystemProperty()) {
|
||||
String value = SecuritySupport.getSystemProperty(sysPropertyName);
|
||||
if (value != null && !value.equals("")) {
|
||||
setProperty(cf.ordinal(), State.SYSTEMPROPERTY, value);
|
||||
setProperty(cf, State.SYSTEMPROPERTY, value);
|
||||
return true;
|
||||
}
|
||||
|
||||
value = SecuritySupport.readJAXPProperty(sysPropertyName);
|
||||
if (value != null && !value.equals("")) {
|
||||
setProperty(cf.ordinal(), State.JAXPDOTPROPERTIES, value);
|
||||
setProperty(cf, State.JAXPDOTPROPERTIES, value);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -685,9 +660,7 @@ public class CatalogFeatures {
|
||||
* property
|
||||
*/
|
||||
public Builder with(Feature feature, String value) {
|
||||
if (value == null || value.length() == 0) {
|
||||
CatalogMessages.reportIAE(new Object[]{value, feature.name()}, null);
|
||||
}
|
||||
Util.validateFeatureInput(feature, value);
|
||||
values.put(feature, value);
|
||||
return this;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -75,7 +75,7 @@ class CatalogImpl extends GroupEntry implements Catalog {
|
||||
|
||||
/*
|
||||
A list of catalog entry files from the input, excluding the current catalog.
|
||||
Paths in the List are normalized.
|
||||
URIs in the List are verified during input validation or property retrieval.
|
||||
*/
|
||||
List<String> inputFiles;
|
||||
|
||||
@ -86,43 +86,44 @@ class CatalogImpl extends GroupEntry implements Catalog {
|
||||
SAXParser parser;
|
||||
|
||||
/**
|
||||
* Construct a Catalog with specified path.
|
||||
* Construct a Catalog with specified URI.
|
||||
*
|
||||
* @param file The path to a catalog file.
|
||||
* @param uris the uri(s) to one or more catalogs
|
||||
* @throws CatalogException If an error happens while parsing the specified
|
||||
* catalog file.
|
||||
*/
|
||||
public CatalogImpl(CatalogFeatures f, String... file) throws CatalogException {
|
||||
this(null, f, file);
|
||||
public CatalogImpl(CatalogFeatures f, URI... uris) throws CatalogException {
|
||||
this(null, f, uris);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a Catalog with specified path.
|
||||
* Construct a Catalog with specified URI.
|
||||
*
|
||||
* @param parent The parent catalog
|
||||
* @param file The path to a catalog file.
|
||||
* @param uris the uri(s) to one or more catalogs
|
||||
* @throws CatalogException If an error happens while parsing the specified
|
||||
* catalog file.
|
||||
*/
|
||||
public CatalogImpl(CatalogImpl parent, CatalogFeatures f, String... file) throws CatalogException {
|
||||
public CatalogImpl(CatalogImpl parent, CatalogFeatures f, URI... uris) throws CatalogException {
|
||||
super(CatalogEntryType.CATALOG, parent);
|
||||
if (f == null) {
|
||||
throw new NullPointerException(
|
||||
formatMessage(CatalogMessages.ERR_NULL_ARGUMENT, new Object[]{"CatalogFeatures"}));
|
||||
}
|
||||
|
||||
if (file.length > 0) {
|
||||
CatalogMessages.reportNPEOnNull("The path to the catalog file", file[0]);
|
||||
}
|
||||
|
||||
init(f);
|
||||
|
||||
//Path of catalog files
|
||||
String[] catalogFile = file;
|
||||
if (level == 0 && file.length == 0) {
|
||||
String[] catalogFile = null;
|
||||
if (level == 0 && uris.length == 0) {
|
||||
String files = features.get(Feature.FILES);
|
||||
if (files != null) {
|
||||
catalogFile = files.split(";[ ]*");
|
||||
catalogFile = files.split(";");
|
||||
}
|
||||
} else {
|
||||
catalogFile = new String[uris.length];
|
||||
for (int i=0; i<uris.length; i++) {
|
||||
catalogFile[i] = uris[i].toASCIIString();
|
||||
}
|
||||
}
|
||||
|
||||
@ -134,10 +135,10 @@ class CatalogImpl extends GroupEntry implements Catalog {
|
||||
int start = 0;
|
||||
URI uri = null;
|
||||
for (String temp : catalogFile) {
|
||||
uri = getSystemId(temp);
|
||||
uri = URI.create(temp);
|
||||
start++;
|
||||
if (verifyCatalogFile(uri)) {
|
||||
systemId = uri.toASCIIString();
|
||||
systemId = temp;
|
||||
try {
|
||||
baseURI = new URL(systemId);
|
||||
} catch (MalformedURLException e) {
|
||||
@ -293,29 +294,6 @@ class CatalogImpl extends GroupEntry implements Catalog {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the specified file path to an absolute systemId. If it is
|
||||
* relative, it shall be resolved using the base or user.dir property if
|
||||
* base is not specified.
|
||||
*
|
||||
* @param file The specified file path
|
||||
* @return The systemId of the file
|
||||
* @throws CatalogException if the specified file path can not be converted
|
||||
* to a system id
|
||||
*/
|
||||
private URI getSystemId(String file) {
|
||||
URI temp = null;
|
||||
|
||||
try {
|
||||
temp = Util.verifyAndGetURI(file, baseURI);
|
||||
} catch (MalformedURLException | URISyntaxException | IllegalArgumentException e) {
|
||||
CatalogMessages.reportRunTimeError(CatalogMessages.ERR_INVALID_PATH,
|
||||
new Object[]{file}, e);
|
||||
}
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a SAXParser instance
|
||||
* @return a SAXParser instance
|
||||
@ -394,7 +372,7 @@ class CatalogImpl extends GroupEntry implements Catalog {
|
||||
//Check the input list
|
||||
if (c == null && inputFiles != null) {
|
||||
while (c == null && inputFilesIndex < inputFiles.size()) {
|
||||
c = getCatalog(getSystemId(inputFiles.get(inputFilesIndex++)));
|
||||
c = getCatalog(URI.create(inputFiles.get(inputFilesIndex++)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -436,8 +414,8 @@ class CatalogImpl extends GroupEntry implements Catalog {
|
||||
|
||||
//loads catalogs from the input list
|
||||
if (inputFiles != null) {
|
||||
inputFiles.stream().forEach((file) -> {
|
||||
getCatalog(getSystemId(file));
|
||||
inputFiles.stream().forEach((uri) -> {
|
||||
getCatalog(URI.create(uri));
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -454,12 +432,11 @@ class CatalogImpl extends GroupEntry implements Catalog {
|
||||
}
|
||||
|
||||
CatalogImpl c = null;
|
||||
String path = uri.toASCIIString();
|
||||
|
||||
if (verifyCatalogFile(uri)) {
|
||||
c = getLoadedCatalog(path);
|
||||
c = getLoadedCatalog(uri.toASCIIString());
|
||||
if (c == null) {
|
||||
c = new CatalogImpl(this, features, path);
|
||||
c = new CatalogImpl(this, features, uri);
|
||||
c.load();
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -24,6 +24,7 @@
|
||||
*/
|
||||
package javax.xml.catalog;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
/**
|
||||
* The Catalog Manager manages the creation of XML Catalogs and Catalog Resolvers.
|
||||
@ -39,30 +40,36 @@ public final class CatalogManager {
|
||||
|
||||
/**
|
||||
* Creates a {@code Catalog} object using the specified feature settings and
|
||||
* path to one or more catalog files.
|
||||
* uri(s) to one or more catalog files.
|
||||
* <p>
|
||||
* If {@code paths} is empty, system property {@code javax.xml.catalog.files}
|
||||
* will be read to locate the initial list of catalog files.
|
||||
* If {@code uris} is empty, system property {@code javax.xml.catalog.files},
|
||||
* as defined in {@link CatalogFeatures}, will be read to locate the initial
|
||||
* list of catalog files.
|
||||
* <p>
|
||||
* If more than one catalog files are specified through the paths argument or
|
||||
* If multiple catalog files are specified through the {@code uris} argument or
|
||||
* {@code javax.xml.catalog.files} property, the first entry is considered
|
||||
* the main catalog, while others are treated as alternative catalogs after
|
||||
* those referenced by the {@code nextCatalog} elements in the main catalog.
|
||||
* <p>
|
||||
* As specified in
|
||||
* <a href="https://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html#s.res.fail">
|
||||
* XML Catalogs, OASIS Standard V1.1</a>, invalid path entries will be ignored.
|
||||
* No error will be reported. In case all entries are invalid, the resolver
|
||||
* will return as no mapping is found.
|
||||
* XML Catalogs, OASIS Standard V1.1</a>, if a catalog entry is invalid, it
|
||||
* is ignored. In case all entries are invalid, the resulting Catalog object
|
||||
* will contain no Catalog elements. Any matching operation using the Catalog
|
||||
* will return null.
|
||||
*
|
||||
* @param features the catalog features
|
||||
* @param paths path(s) to one or more catalogs.
|
||||
* @param uris uri(s) to one or more catalogs.
|
||||
*
|
||||
* @return an instance of a {@code Catalog}
|
||||
* @throws IllegalArgumentException if either the URIs are not absolute
|
||||
* or do not have a URL protocol handler for the URI scheme
|
||||
* @throws CatalogException If an error occurs while parsing the catalog
|
||||
* @throws SecurityException if access to the resource is denied by the security manager
|
||||
*/
|
||||
public static Catalog catalog(CatalogFeatures features, String... paths) {
|
||||
CatalogImpl catalog = new CatalogImpl(features, paths);
|
||||
public static Catalog catalog(CatalogFeatures features, URI... uris) {
|
||||
Util.validateUrisSyntax(uris);
|
||||
CatalogImpl catalog = new CatalogImpl(features, uris);
|
||||
catalog.load();
|
||||
return catalog;
|
||||
}
|
||||
@ -80,30 +87,36 @@ public final class CatalogManager {
|
||||
|
||||
/**
|
||||
* Creates an instance of a {@code CatalogResolver} using the specified feature
|
||||
* settings and path to one or more catalog files.
|
||||
* settings and uri(s) to one or more catalog files.
|
||||
* <p>
|
||||
* If {@code paths} is empty, system property {@code javax.xml.catalog.files}
|
||||
* will be read to locate the initial list of catalog files.
|
||||
* If {@code uris} is empty, system property {@code javax.xml.catalog.files},
|
||||
* as defined in {@link CatalogFeatures}, will be read to locate the initial
|
||||
* list of catalog files.
|
||||
* <p>
|
||||
* If more than one catalog files are specified through the paths argument or
|
||||
* If multiple catalog files are specified through the {@code uris} argument or
|
||||
* {@code javax.xml.catalog.files} property, the first entry is considered
|
||||
* the main catalog, while others are treated as alternative catalogs after
|
||||
* those referenced by the {@code nextCatalog} elements in the main catalog.
|
||||
* <p>
|
||||
* As specified in
|
||||
* <a href="https://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html#s.res.fail">
|
||||
* XML Catalogs, OASIS Standard V1.1</a>, invalid path entries will be ignored.
|
||||
* No error will be reported. In case all entries are invalid, the resolver
|
||||
* will return as no mapping is found.
|
||||
* XML Catalogs, OASIS Standard V1.1</a>, if a catalog entry is invalid, it
|
||||
* is ignored. In case all entries are invalid, the resulting CatalogResolver
|
||||
* object will contain no valid catalog. Any resolution operation using the
|
||||
* resolver therefore will return as no mapping is found. See {@link CatalogResolver}
|
||||
* for the behavior when no mapping is found.
|
||||
*
|
||||
* @param features the catalog features
|
||||
* @param paths the path(s) to one or more catalogs
|
||||
* @param uris the uri(s) to one or more catalogs
|
||||
*
|
||||
* @return an instance of a {@code CatalogResolver}
|
||||
* @throws IllegalArgumentException if either the URIs are not absolute
|
||||
* or do not have a URL protocol handler for the URI scheme
|
||||
* @throws CatalogException If an error occurs while parsing the catalog
|
||||
* @throws SecurityException if access to the resource is denied by the security manager
|
||||
*/
|
||||
public static CatalogResolver catalogResolver(CatalogFeatures features, String... paths) {
|
||||
Catalog catalog = catalog(features, paths);
|
||||
public static CatalogResolver catalogResolver(CatalogFeatures features, URI... uris) {
|
||||
Catalog catalog = catalog(features, uris);
|
||||
return new CatalogResolverImpl(catalog);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,10 +24,11 @@
|
||||
*/
|
||||
package javax.xml.catalog;
|
||||
|
||||
import jdk.xml.internal.SecuritySupport;
|
||||
import java.net.URI;
|
||||
import java.util.Locale;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
import jdk.xml.internal.SecuritySupport;
|
||||
|
||||
/**
|
||||
* Catalog Error messages
|
||||
@ -38,6 +39,8 @@ final class CatalogMessages {
|
||||
|
||||
public static final String ERR_INVALID_CATALOG = "InvalidCatalog";
|
||||
public static final String ERR_INVALID_ENTRY_TYPE = "InvalidEntryType";
|
||||
public static final String ERR_URI_NOTABSOLUTE = "UriNotAbsolute";
|
||||
public static final String ERR_URI_NOTVALIDURL = "UriNotValidUrl";
|
||||
public static final String ERR_INVALID_ARGUMENT = "InvalidArgument";
|
||||
public static final String ERR_NULL_ARGUMENT = "NullArgument";
|
||||
public static final String ERR_CIRCULAR_REFERENCE = "CircularReference";
|
||||
@ -120,7 +123,7 @@ final class CatalogMessages {
|
||||
* @param name the name of the argument
|
||||
* @param value the value of the argument
|
||||
*/
|
||||
static void reportNPEOnNull(String name, String value) {
|
||||
static void reportNPEOnNull(String name, Object value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException(
|
||||
formatMessage(ERR_NULL_ARGUMENT, new Object[]{name}));
|
||||
@ -132,9 +135,9 @@ final class CatalogMessages {
|
||||
* @param arguments the arguments for formating the error message
|
||||
* @param cause the cause if any
|
||||
*/
|
||||
static void reportIAE(Object[] arguments, Throwable cause) {
|
||||
static void reportIAE(String key, Object[] arguments, Throwable cause) {
|
||||
throw new IllegalArgumentException(
|
||||
formatMessage(ERR_INVALID_ARGUMENT, arguments), cause);
|
||||
formatMessage(key, arguments), cause);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -174,7 +177,7 @@ final class CatalogMessages {
|
||||
|
||||
/**
|
||||
* Returns sanitized URI.
|
||||
* @param uri an URI to be sanitized
|
||||
* @param uri a URI to be sanitized
|
||||
*/
|
||||
static String sanitize(String uri) {
|
||||
if (uri == null) {
|
||||
|
@ -31,6 +31,8 @@ InvalidEntryType = The entry type ''{0}'' is not valid.
|
||||
CircularReference = Circular reference is not allowed: ''{0}''.
|
||||
|
||||
#errors
|
||||
UriNotAbsolute = The specified URI ''{0}'' is not absolute.
|
||||
UriNotValidUrl = The specified URI ''{0}'' is not a valid URL.
|
||||
InvalidArgument = The specified argument ''{0}'' (case sensitive) for ''{1}'' is not valid.
|
||||
NullArgument = The argument ''{0}'' can not be null.
|
||||
InvalidPath = The path ''{0}'' is invalid.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,10 +25,6 @@
|
||||
package javax.xml.catalog;
|
||||
|
||||
import java.io.StringReader;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import javax.xml.catalog.BaseEntry.CatalogEntryType;
|
||||
import javax.xml.parsers.SAXParser;
|
||||
import javax.xml.transform.Source;
|
||||
@ -94,25 +90,6 @@ class CatalogReader extends DefaultHandler implements EntityResolver, URIResolve
|
||||
this.parser = parser;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns when the specified path is valid.
|
||||
* @param path a path
|
||||
* @return true if the path is valid, false otherwise
|
||||
*/
|
||||
boolean isValidPath(String path) {
|
||||
boolean valid = true;
|
||||
try {
|
||||
Path p = Paths.get(new URI(path));
|
||||
if (!p.toFile().exists()) {
|
||||
valid = false;
|
||||
}
|
||||
} catch (URISyntaxException ex) {
|
||||
valid = false;
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String namespaceURI,
|
||||
String localName,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,7 +47,7 @@ import org.xml.sax.InputSource;
|
||||
* {@link javax.xml.stream.XMLResolver} and {@link org.w3c.dom.ls.LSResourceResolver}
|
||||
* however, make no such distinction.
|
||||
* In consistent with the existing Java API, this CatalogResolver recognizes a
|
||||
* system identifier as an URI and will search both {@code system} and {@code uri}
|
||||
* system identifier as a URI and will search both {@code system} and {@code uri}
|
||||
* entries in a catalog in order to find a matching entry.
|
||||
* <p>
|
||||
* The search is started in the current catalog. If a match is found,
|
||||
@ -137,9 +137,9 @@ public interface CatalogResolver extends EntityResolver, XMLResolver,
|
||||
* with the specified {@code href} attribute. The {@code href} attribute will
|
||||
* be used literally, with no attempt to be made absolute to the {@code base}.
|
||||
* <p>
|
||||
* If the value is an URN, the {@code href} attribute is recognized as a
|
||||
* If the value is a URN, the {@code href} attribute is recognized as a
|
||||
* {@code publicId}, and used to search {@code public} entries.
|
||||
* If the value is an URI, it is taken as a {@code systemId}, and used to
|
||||
* If the value is a URI, it is taken as a {@code systemId}, and used to
|
||||
* search both {@code system} and {@code uri} entries.
|
||||
*
|
||||
*
|
||||
@ -219,7 +219,7 @@ public interface CatalogResolver extends EntityResolver, XMLResolver,
|
||||
* @param publicId the public identifier of the external entity being
|
||||
* referenced, or {@code null} if no public identifier was
|
||||
* supplied or if the resource is not an entity.
|
||||
* @param systemId the system identifier, an URI reference of the
|
||||
* @param systemId the system identifier, a URI reference of the
|
||||
* external resource being referenced
|
||||
* @param baseUri the absolute base URI, not used by the CatalogResolver
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -73,7 +73,7 @@ final class CatalogResolverImpl implements CatalogResolver {
|
||||
systemId = Normalizer.normalizeURI(Util.getNotNullOrEmpty(systemId));
|
||||
publicId = Normalizer.normalizePublicId(Normalizer.decodeURN(Util.getNotNullOrEmpty(publicId)));
|
||||
|
||||
//check whether systemId is an urn
|
||||
//check whether systemId is a urn
|
||||
if (systemId != null && systemId.startsWith(Util.URN)) {
|
||||
systemId = Normalizer.decodeURN(systemId);
|
||||
if (publicId != null && !publicId.equals(systemId)) {
|
||||
@ -123,7 +123,7 @@ final class CatalogResolverImpl implements CatalogResolver {
|
||||
return null;
|
||||
}
|
||||
|
||||
//check whether uri is an urn
|
||||
//check whether uri is a urn
|
||||
if (uri != null && uri.startsWith(Util.URN)) {
|
||||
String publicId = Normalizer.decodeURN(uri);
|
||||
if (publicId != null) {
|
||||
@ -131,7 +131,7 @@ final class CatalogResolverImpl implements CatalogResolver {
|
||||
}
|
||||
}
|
||||
|
||||
//if no match with a public id, continue search for an URI
|
||||
//if no match with a public id, continue search for a URI
|
||||
if (result == null) {
|
||||
//remove fragment if any.
|
||||
int hashPos = uri.indexOf("#");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,8 +25,6 @@
|
||||
package javax.xml.catalog;
|
||||
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
@ -217,7 +215,7 @@ class GroupEntry extends BaseEntry {
|
||||
* @param systemId The system identifier of the external entity being
|
||||
* referenced.
|
||||
*
|
||||
* @return An URI string if a mapping is found, or null otherwise.
|
||||
* @return a URI string if a mapping is found, or null otherwise.
|
||||
*/
|
||||
public String matchSystem(String systemId) {
|
||||
systemEntrySearched = true;
|
||||
@ -285,7 +283,7 @@ class GroupEntry extends BaseEntry {
|
||||
* @param publicId The public identifier of the external entity being
|
||||
* referenced.
|
||||
*
|
||||
* @return An URI string if a mapping is found, or null otherwise.
|
||||
* @return a URI string if a mapping is found, or null otherwise.
|
||||
*/
|
||||
public String matchPublic(String publicId) {
|
||||
/*
|
||||
@ -329,7 +327,7 @@ class GroupEntry extends BaseEntry {
|
||||
*
|
||||
* @param uri The URI reference of a resource.
|
||||
*
|
||||
* @return An URI string if a mapping is found, or null otherwise.
|
||||
* @return a URI string if a mapping is found, or null otherwise.
|
||||
*/
|
||||
public String matchURI(String uri) {
|
||||
String match = null;
|
||||
@ -455,7 +453,7 @@ class GroupEntry extends BaseEntry {
|
||||
delegateCatalog = getLoadedCatalog(catalogId);
|
||||
if (delegateCatalog == null) {
|
||||
if (verifyCatalogFile(catalogURI)) {
|
||||
delegateCatalog = new CatalogImpl(catalog, features, catalogId);
|
||||
delegateCatalog = new CatalogImpl(catalog, features, catalogURI);
|
||||
delegateCatalog.load();
|
||||
delegateCatalogs.put(catalogId, delegateCatalog);
|
||||
}
|
||||
@ -504,7 +502,8 @@ class GroupEntry extends BaseEntry {
|
||||
}
|
||||
|
||||
//Ignore it if it doesn't exist
|
||||
if (!Files.exists(Paths.get(catalogURI))) {
|
||||
if (Util.isFileUri(catalogURI) &&
|
||||
!Util.isFileUriExist(catalogURI, false)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,7 +27,7 @@ package javax.xml.catalog;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* Represents an uriEntry entry.
|
||||
* Represents a uri entry.
|
||||
*
|
||||
* @since 9
|
||||
*/
|
||||
@ -36,7 +36,7 @@ final class UriEntry extends BaseEntry {
|
||||
URL uri;
|
||||
|
||||
/**
|
||||
* Construct a group entry.
|
||||
* Construct a uri entry.
|
||||
* @param name The name attribute.
|
||||
* @param uri The uri attribute.
|
||||
*/
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,13 +25,20 @@
|
||||
package javax.xml.catalog;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Iterator;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import static javax.xml.catalog.CatalogFeatures.DEFER_FALSE;
|
||||
import static javax.xml.catalog.CatalogFeatures.DEFER_TRUE;
|
||||
import javax.xml.catalog.CatalogFeatures.Feature;
|
||||
import static javax.xml.catalog.CatalogFeatures.PREFER_PUBLIC;
|
||||
import static javax.xml.catalog.CatalogFeatures.PREFER_SYSTEM;
|
||||
import static javax.xml.catalog.CatalogFeatures.RESOLVE_CONTINUE;
|
||||
import static javax.xml.catalog.CatalogFeatures.RESOLVE_IGNORE;
|
||||
import static javax.xml.catalog.CatalogFeatures.RESOLVE_STRICT;
|
||||
import jdk.xml.internal.SecuritySupport;
|
||||
|
||||
/**
|
||||
@ -39,22 +46,25 @@ import jdk.xml.internal.SecuritySupport;
|
||||
* @since 9
|
||||
*/
|
||||
class Util {
|
||||
|
||||
final static String URN = "urn:publicid:";
|
||||
final static String PUBLICID_PREFIX = "-//";
|
||||
final static String PUBLICID_PREFIX_ALT = "+//";
|
||||
final static String SCHEME_FILE = "file";
|
||||
final static String SCHEME_JAR = "jar";
|
||||
final static String SCHEME_JARFILE = "jar:file:";
|
||||
|
||||
/**
|
||||
* Finds an entry in the catalog that matches with the publicId or systemId.
|
||||
*
|
||||
* The resolution follows the following rules determined by the prefer setting:
|
||||
* The resolution follows the following rules determined by the prefer
|
||||
* setting:
|
||||
*
|
||||
* prefer "system": attempts to resolve with a system entry;
|
||||
* attempts to resolve with a public entry when only
|
||||
* publicId is specified.
|
||||
* prefer "system": attempts to resolve with a system entry; attempts to
|
||||
* resolve with a public entry when only publicId is specified.
|
||||
*
|
||||
* prefer "public": attempts to resolve with a system entry;
|
||||
* attempts to resolve with a public entry if no matching
|
||||
* system entry is found.
|
||||
* prefer "public": attempts to resolve with a system entry; attempts to
|
||||
* resolve with a public entry if no matching system entry is found.
|
||||
*
|
||||
* If no match is found, continue searching uri entries
|
||||
*
|
||||
@ -70,9 +80,9 @@ class Util {
|
||||
catalog.reset();
|
||||
if (systemId != null) {
|
||||
/*
|
||||
If a system identifier is specified, it is used no matter how
|
||||
prefer is set.
|
||||
*/
|
||||
If a system identifier is specified, it is used no matter how
|
||||
prefer is set.
|
||||
*/
|
||||
resolvedSystemId = catalog.matchSystem(systemId);
|
||||
}
|
||||
|
||||
@ -91,7 +101,7 @@ class Util {
|
||||
if (resolvedSystemId == null) {
|
||||
Iterator<Catalog> iter = catalog.catalogs().iterator();
|
||||
while (iter.hasNext()) {
|
||||
resolvedSystemId = resolve((CatalogImpl)iter.next(), publicId, systemId);
|
||||
resolvedSystemId = resolve((CatalogImpl) iter.next(), publicId, systemId);
|
||||
if (resolvedSystemId != null) {
|
||||
break;
|
||||
}
|
||||
@ -102,73 +112,112 @@ class Util {
|
||||
return resolvedSystemId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the specified file path to an absolute systemId. If it is
|
||||
* relative, it shall be resolved using the base or user.dir property if
|
||||
* base is not specified.
|
||||
*
|
||||
* @param file The specified file path
|
||||
* @param baseURI the base URI
|
||||
* @return The URI
|
||||
* @throws CatalogException if the specified file path can not be converted
|
||||
* to a system id
|
||||
*/
|
||||
static URI verifyAndGetURI(String file, URL baseURI)
|
||||
throws MalformedURLException, URISyntaxException, IllegalArgumentException {
|
||||
URL filepath;
|
||||
URI temp;
|
||||
if (file != null && file.length() > 0) {
|
||||
File f = new File(file);
|
||||
|
||||
if (baseURI != null && !f.isAbsolute()) {
|
||||
filepath = new URL(baseURI, fixSlashes(file));
|
||||
temp = filepath.toURI();
|
||||
} else {
|
||||
temp = resolveURI(file);
|
||||
}
|
||||
//Paths.get may throw IllegalArgumentException
|
||||
Path path = Paths.get(temp);
|
||||
if (path.toFile().isFile()) {
|
||||
return temp;
|
||||
}
|
||||
static void validateUrisSyntax(URI... uris) {
|
||||
for (URI uri : uris) {
|
||||
validateUriSyntax(uri);
|
||||
}
|
||||
}
|
||||
|
||||
static void validateUrisSyntax(String... uris) {
|
||||
for (String uri : uris) {
|
||||
validateUriSyntax(URI.create(uri));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves the specified uri. If the uri is relative, makes it absolute by
|
||||
* the user.dir directory.
|
||||
* Validate that the URI must be absolute and a valid URL.
|
||||
*
|
||||
* @param uri The specified URI.
|
||||
* @return The resolved URI
|
||||
* Note that this method does not verify the existence of the resource. The
|
||||
* Catalog standard requires that such resources be ignored.
|
||||
*
|
||||
* @param uri
|
||||
* @throws IllegalArgumentException if the uri is not absolute and a valid
|
||||
* URL
|
||||
*/
|
||||
static URI resolveURI(String uri) throws MalformedURLException {
|
||||
if (uri == null) {
|
||||
uri = "";
|
||||
static void validateUriSyntax(URI uri) {
|
||||
CatalogMessages.reportNPEOnNull("URI input", uri);
|
||||
|
||||
if (!uri.isAbsolute()) {
|
||||
CatalogMessages.reportIAE(CatalogMessages.ERR_URI_NOTABSOLUTE,
|
||||
new Object[]{uri}, null);
|
||||
}
|
||||
|
||||
URI temp = null;
|
||||
try {
|
||||
URL url = new URL(uri);
|
||||
temp = url.toURI();
|
||||
} catch (MalformedURLException | URISyntaxException mue) {
|
||||
File file = new File(uri);
|
||||
temp = file.toURI();
|
||||
// check if the scheme was valid
|
||||
uri.toURL();
|
||||
} catch (MalformedURLException ex) {
|
||||
CatalogMessages.reportIAE(CatalogMessages.ERR_URI_NOTVALIDURL,
|
||||
new Object[]{uri}, null);
|
||||
}
|
||||
|
||||
return temp;
|
||||
// verify the resource exists where possible
|
||||
if (isFileUri(uri)) {
|
||||
if (!isFileUriExist(uri, false)) {
|
||||
CatalogMessages.reportIAE(CatalogMessages.ERR_URI_NOTVALIDURL,
|
||||
new Object[]{uri}, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace backslashes with forward slashes. (URLs always use forward
|
||||
* slashes.)
|
||||
* Checks whether the URI is a file URI, including JAR file.
|
||||
*
|
||||
* @param sysid The input system identifier.
|
||||
* @return The same system identifier with backslashes turned into forward
|
||||
* slashes.
|
||||
* @param uri the specified URI.
|
||||
* @return true if it is a file or JAR file URI, false otherwise
|
||||
*/
|
||||
static String fixSlashes(String sysid) {
|
||||
return sysid.replace('\\', '/');
|
||||
static boolean isFileUri(URI uri) {
|
||||
if (SCHEME_FILE.equals(uri.getScheme())
|
||||
|| SCHEME_JAR.equals(uri.getScheme())) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies whether the file resource exists.
|
||||
*
|
||||
* @param uri the URI to locate the resource
|
||||
* @param openJarFile a flag to indicate whether a JAR file should be
|
||||
* opened. This operation may be expensive.
|
||||
* @return true if the resource exists, false otherwise.
|
||||
*/
|
||||
static boolean isFileUriExist(URI uri, boolean openJarFile) {
|
||||
if (uri != null && uri.isAbsolute()) {
|
||||
if (null != uri.getScheme()) {
|
||||
switch (uri.getScheme()) {
|
||||
case SCHEME_FILE:
|
||||
String path = uri.getPath();
|
||||
File f1 = new File(path);
|
||||
if (f1.isFile()) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case SCHEME_JAR:
|
||||
String tempUri = uri.toString();
|
||||
int pos = tempUri.indexOf("!");
|
||||
if (pos < 0) {
|
||||
return false;
|
||||
}
|
||||
if (openJarFile) {
|
||||
String jarFile = tempUri.substring(SCHEME_JARFILE.length(), pos);
|
||||
String entryName = tempUri.substring(pos + 2);
|
||||
try {
|
||||
JarFile jf = new JarFile(jarFile);
|
||||
JarEntry je = jf.getJarEntry(entryName);
|
||||
if (je != null) {
|
||||
return true;
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -187,11 +236,12 @@ class Util {
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the specified string is null or empty, returns the original
|
||||
* string with leading and trailing spaces removed if not.
|
||||
* Checks whether the specified string is null or empty, returns the
|
||||
* original string with leading and trailing spaces removed if not.
|
||||
*
|
||||
* @param test the string to be tested
|
||||
* @return the original string with leading and trailing spaces removed,
|
||||
* or null if it is null or empty
|
||||
* @return the original string with leading and trailing spaces removed, or
|
||||
* null if it is null or empty
|
||||
*
|
||||
*/
|
||||
static String getNotNullOrEmpty(String test) {
|
||||
@ -206,4 +256,39 @@ class Util {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the input for features.
|
||||
*
|
||||
* @param f the feature
|
||||
* @param value the value
|
||||
* @throws IllegalArgumentException if the value is invalid for the feature
|
||||
*/
|
||||
static void validateFeatureInput(Feature f, String value) {
|
||||
CatalogMessages.reportNPEOnNull(f.name(), value);
|
||||
if (value.length() == 0) {
|
||||
CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
|
||||
new Object[]{value, f.name()}, null);
|
||||
}
|
||||
|
||||
if (f == Feature.PREFER) {
|
||||
if (!value.equals(PREFER_SYSTEM) && !value.equals(PREFER_PUBLIC)) {
|
||||
CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
|
||||
new Object[]{value, Feature.PREFER.name()}, null);
|
||||
}
|
||||
} else if (f == Feature.DEFER) {
|
||||
if (!value.equals(DEFER_TRUE) && !value.equals(DEFER_FALSE)) {
|
||||
CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
|
||||
new Object[]{value, Feature.DEFER.name()}, null);
|
||||
}
|
||||
} else if (f == Feature.RESOLVE) {
|
||||
if (!value.equals(RESOLVE_STRICT) && !value.equals(RESOLVE_CONTINUE)
|
||||
&& !value.equals(RESOLVE_IGNORE)) {
|
||||
CatalogMessages.reportIAE(CatalogMessages.ERR_INVALID_ARGUMENT,
|
||||
new Object[]{value, Feature.RESOLVE.name()}, null);
|
||||
}
|
||||
} else if (f == Feature.FILES) {
|
||||
Util.validateUrisSyntax(value.split(";"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -81,7 +81,7 @@ public class SpecifyCatalogTest {
|
||||
@Test
|
||||
public void specifyCatalogViaSysProps() {
|
||||
setSystemProperty(FEATURE_FILES,
|
||||
getCatalogPath("specifyCatalog-sysProps.xml"));
|
||||
getCatalogPath("specifyCatalog-sysProps.xml").toASCIIString());
|
||||
|
||||
checkResolutionOnEntityResolver(catalogResolver((String[]) null),
|
||||
"http://local/base/dtd/docSysPropsSys.dtd");
|
||||
@ -107,6 +107,6 @@ public class SpecifyCatalogTest {
|
||||
}
|
||||
|
||||
private static CatalogFeatures createFeature(String catalogName) {
|
||||
return builder().with(FILES, getCatalogPath(catalogName)).build();
|
||||
return builder().with(FILES, getCatalogPath(catalogName).toASCIIString()).build();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1 @@
|
||||
<dummy />
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,17 +25,16 @@ package catalog;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.xml.catalog.CatalogFeatures;
|
||||
import javax.xml.catalog.CatalogManager;
|
||||
import javax.xml.catalog.CatalogResolver;
|
||||
|
||||
import jaxp.library.JAXPTestUtilities;
|
||||
|
||||
/*
|
||||
@ -115,20 +114,20 @@ final class CatalogTestUtils {
|
||||
}
|
||||
|
||||
// Gets the paths of the specified catalogs.
|
||||
private static String[] getCatalogPaths(String... catalogNames) {
|
||||
private static URI[] getCatalogPaths(String... catalogNames) {
|
||||
return catalogNames == null
|
||||
? null
|
||||
: Stream.of(catalogNames).map(
|
||||
catalogName -> getCatalogPath(catalogName)).collect(
|
||||
Collectors.toList()).toArray(new String[0]);
|
||||
Collectors.toList()).toArray(new URI[0]);
|
||||
}
|
||||
|
||||
// Gets the paths of the specified catalogs.
|
||||
static String getCatalogPath(String catalogName) {
|
||||
static URI getCatalogPath(String catalogName) {
|
||||
return catalogName == null
|
||||
? null
|
||||
: JAXPTestUtilities.getPathByClassName(CatalogTestUtils.class, "catalogFiles")
|
||||
+ catalogName;
|
||||
: Paths.get(JAXPTestUtilities.getPathByClassName(CatalogTestUtils.class, "catalogFiles")
|
||||
+ catalogName).toUri();
|
||||
}
|
||||
|
||||
/* ********** jaxp.properties ********** */
|
||||
|
141
jaxp/test/javax/xml/jaxp/libs/jaxp/library/JarUtils.java
Normal file
141
jaxp/test/javax/xml/jaxp/libs/jaxp/library/JarUtils.java
Normal file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jaxp.library;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.jar.JarEntry;
|
||||
import java.util.jar.JarFile;
|
||||
import java.util.jar.JarOutputStream;
|
||||
import java.util.jar.Manifest;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* This class consists exclusively of static utility methods that are useful
|
||||
* for creating and manipulating JAR files.
|
||||
*/
|
||||
|
||||
public final class JarUtils {
|
||||
private JarUtils() { }
|
||||
|
||||
/**
|
||||
* Creates a JAR file.
|
||||
*
|
||||
* Equivalent to {@code jar cfm <jarfile> <manifest> -C <dir> file...}
|
||||
*
|
||||
* The input files are resolved against the given directory. Any input
|
||||
* files that are directories are processed recursively.
|
||||
*/
|
||||
public static void createJarFile(Path jarfile, Manifest man, Path dir, Path... file)
|
||||
throws IOException
|
||||
{
|
||||
// create the target directory
|
||||
Path parent = jarfile.getParent();
|
||||
if (parent != null)
|
||||
Files.createDirectories(parent);
|
||||
|
||||
List<Path> entries = new ArrayList<>();
|
||||
for (Path entry : file) {
|
||||
Files.find(dir.resolve(entry), Integer.MAX_VALUE,
|
||||
(p, attrs) -> attrs.isRegularFile())
|
||||
.map(e -> dir.relativize(e))
|
||||
.forEach(entries::add);
|
||||
}
|
||||
|
||||
try (OutputStream out = Files.newOutputStream(jarfile);
|
||||
JarOutputStream jos = new JarOutputStream(out))
|
||||
{
|
||||
if (man != null) {
|
||||
JarEntry je = new JarEntry(JarFile.MANIFEST_NAME);
|
||||
jos.putNextEntry(je);
|
||||
man.write(jos);
|
||||
jos.closeEntry();
|
||||
}
|
||||
|
||||
for (Path entry : entries) {
|
||||
String name = toJarEntryName(entry);
|
||||
jos.putNextEntry(new JarEntry(name));
|
||||
Files.copy(dir.resolve(entry), jos);
|
||||
jos.closeEntry();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a JAR file.
|
||||
*
|
||||
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
|
||||
*
|
||||
* The input files are resolved against the given directory. Any input
|
||||
* files that are directories are processed recursively.
|
||||
*/
|
||||
public static void createJarFile(Path jarfile, Path dir, Path... file)
|
||||
throws IOException
|
||||
{
|
||||
createJarFile(jarfile, null, dir, file);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a JAR file.
|
||||
*
|
||||
* Equivalent to {@code jar cf <jarfile> -C <dir> file...}
|
||||
*
|
||||
* The input files are resolved against the given directory. Any input
|
||||
* files that are directories are processed recursively.
|
||||
*/
|
||||
public static void createJarFile(Path jarfile, Path dir, String... input)
|
||||
throws IOException
|
||||
{
|
||||
Path[] paths = Stream.of(input).map(Paths::get).toArray(Path[]::new);
|
||||
createJarFile(jarfile, dir, paths);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a JAR file from the contents of a directory.
|
||||
*
|
||||
* Equivalent to {@code jar cf <jarfile> -C <dir> .}
|
||||
*/
|
||||
public static void createJarFile(Path jarfile, Path dir) throws IOException {
|
||||
createJarFile(jarfile, dir, Paths.get("."));
|
||||
}
|
||||
|
||||
/**
|
||||
* Map a file path to the equivalent name in a JAR file
|
||||
*/
|
||||
private static String toJarEntryName(Path file) {
|
||||
Path normalized = file.normalize();
|
||||
return normalized.subpath(0, normalized.getNameCount()) // drop root
|
||||
.toString()
|
||||
.replace(File.separatorChar, '/');
|
||||
}
|
||||
}
|
177
jaxp/test/javax/xml/jaxp/libs/jaxp/library/SimpleHttpServer.java
Normal file
177
jaxp/test/javax/xml/jaxp/libs/jaxp/library/SimpleHttpServer.java
Normal file
@ -0,0 +1,177 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jaxp.library;
|
||||
|
||||
import com.sun.net.httpserver.Headers;
|
||||
import com.sun.net.httpserver.HttpContext;
|
||||
import com.sun.net.httpserver.HttpExchange;
|
||||
import com.sun.net.httpserver.HttpHandler;
|
||||
import com.sun.net.httpserver.HttpServer;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.URI;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
/**
|
||||
* A simple HTTP Server
|
||||
*/
|
||||
public class SimpleHttpServer {
|
||||
HttpServer _httpserver;
|
||||
ExecutorService _executor;
|
||||
|
||||
String _address;
|
||||
|
||||
String _context, _docroot;
|
||||
int _port;
|
||||
|
||||
public SimpleHttpServer(String context, String docroot) {
|
||||
//let the system pick up an ephemeral port in a bind operation
|
||||
this(0, context, docroot);
|
||||
}
|
||||
|
||||
public SimpleHttpServer(int port, String context, String docroot) {
|
||||
_port = port;
|
||||
_context = context;
|
||||
_docroot = docroot;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
MyHttpHandler handler = new MyHttpHandler(_docroot);
|
||||
InetSocketAddress addr = new InetSocketAddress(_port);
|
||||
try {
|
||||
_httpserver = HttpServer.create(addr, 0);
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException("cannot create httpserver", ex);
|
||||
}
|
||||
|
||||
//TestHandler is mapped to /test
|
||||
HttpContext ctx = _httpserver.createContext(_context, handler);
|
||||
|
||||
_executor = Executors.newCachedThreadPool();
|
||||
_httpserver.setExecutor(_executor);
|
||||
_httpserver.start();
|
||||
|
||||
_address = "http://localhost:" + _httpserver.getAddress().getPort();
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
_httpserver.stop(2);
|
||||
_executor.shutdown();
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return _address;
|
||||
}
|
||||
|
||||
static class MyHttpHandler implements HttpHandler {
|
||||
|
||||
String _docroot;
|
||||
|
||||
public MyHttpHandler(String docroot) {
|
||||
_docroot = docroot;
|
||||
}
|
||||
|
||||
public void handle(HttpExchange t)
|
||||
throws IOException {
|
||||
InputStream is = t.getRequestBody();
|
||||
Headers map = t.getRequestHeaders();
|
||||
Headers rmap = t.getResponseHeaders();
|
||||
OutputStream os = t.getResponseBody();
|
||||
URI uri = t.getRequestURI();
|
||||
String path = uri.getPath();
|
||||
|
||||
|
||||
while (is.read() != -1) ;
|
||||
is.close();
|
||||
|
||||
File f = new File(_docroot, path);
|
||||
if (!f.exists()) {
|
||||
notfound(t, path);
|
||||
return;
|
||||
}
|
||||
|
||||
String method = t.getRequestMethod();
|
||||
if (method.equals("HEAD")) {
|
||||
rmap.set("Content-Length", Long.toString(f.length()));
|
||||
t.sendResponseHeaders(200, -1);
|
||||
t.close();
|
||||
} else if (!method.equals("GET")) {
|
||||
t.sendResponseHeaders(405, -1);
|
||||
t.close();
|
||||
return;
|
||||
}
|
||||
|
||||
if (path.endsWith(".html") || path.endsWith(".htm")) {
|
||||
rmap.set("Content-Type", "text/html");
|
||||
} else {
|
||||
rmap.set("Content-Type", "text/plain");
|
||||
}
|
||||
|
||||
t.sendResponseHeaders (200, f.length());
|
||||
|
||||
FileInputStream fis = new FileInputStream(f);
|
||||
int count = 0;
|
||||
try {
|
||||
byte[] buf = new byte[16 * 1024];
|
||||
int len;
|
||||
while ((len = fis.read(buf)) != -1) {
|
||||
os.write(buf, 0, len);
|
||||
count += len;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
fis.close();
|
||||
os.close();
|
||||
}
|
||||
|
||||
void moved(HttpExchange t) throws IOException {
|
||||
Headers req = t.getRequestHeaders();
|
||||
Headers map = t.getResponseHeaders();
|
||||
URI uri = t.getRequestURI();
|
||||
String host = req.getFirst("Host");
|
||||
String location = "http://" + host + uri.getPath() + "/";
|
||||
map.set("Content-Type", "text/html");
|
||||
map.set("Location", location);
|
||||
t.sendResponseHeaders(301, -1);
|
||||
t.close();
|
||||
}
|
||||
|
||||
void notfound(HttpExchange t, String p) throws IOException {
|
||||
t.getResponseHeaders().set("Content-Type", "text/html");
|
||||
t.sendResponseHeaders(404, 0);
|
||||
OutputStream os = t.getResponseBody();
|
||||
String s = "<h2>File not found</h2>";
|
||||
s = s + p + "<p>";
|
||||
os.write(s.getBytes());
|
||||
os.close();
|
||||
t.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 catalog;
|
||||
|
||||
import java.net.URI;
|
||||
import javax.xml.catalog.CatalogFeatures;
|
||||
import javax.xml.catalog.CatalogManager;
|
||||
import javax.xml.catalog.CatalogResolver;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Listeners;
|
||||
import org.testng.annotations.Test;
|
||||
import org.xml.sax.InputSource;
|
||||
import static jaxp.library.JAXPTestUtilities.tryRunWithAllPerm;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8171243
|
||||
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
|
||||
* @run testng/othervm -DrunSecMngr=true catalog.CatalogAccessTest
|
||||
* @summary the Catalog API grants no privilege to external resources. This test
|
||||
* verifies that SecurityException will be thrown if access to resources is denied
|
||||
* by the security manager.
|
||||
*/
|
||||
@Listeners({jaxp.library.BasePolicy.class})
|
||||
public class CatalogAccessTest {
|
||||
static final CatalogFeatures FEATURES = CatalogFeatures.builder().
|
||||
with(CatalogFeatures.Feature.PREFER, "system").build();
|
||||
|
||||
/*
|
||||
* Verifies that the SecurityException is thrown if access to the resource is
|
||||
* denied by the security manager.
|
||||
*/
|
||||
@Test(dataProvider = "accessTest", expectedExceptions = SecurityException.class)
|
||||
public void testSecurity(String cfile, String sysId, String pubId) throws Exception {
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, URI.create(cfile));
|
||||
InputSource is = cr.resolveEntity(pubId, sysId);
|
||||
Assert.fail("Failed to throw SecurityException");
|
||||
}
|
||||
|
||||
/*
|
||||
DataProvider: used for SecurityException testing
|
||||
Data columns:
|
||||
catalog uri, systemId, publicId
|
||||
*/
|
||||
@DataProvider(name = "accessTest")
|
||||
Object[][] getDataForAccessTest() throws Exception {
|
||||
String systemId = "http://www.sys00test.com/rewrite.dtd";
|
||||
String publicId = "PUB-404";
|
||||
String urlFile = tryRunWithAllPerm(() ->
|
||||
getClass().getResource("rewriteSystem_id.xml").toExternalForm());
|
||||
return new Object[][]{
|
||||
{urlFile, systemId, publicId}
|
||||
};
|
||||
}
|
||||
}
|
@ -0,0 +1,282 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 catalog;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import static java.nio.file.StandardOpenOption.APPEND;
|
||||
import static java.nio.file.StandardOpenOption.CREATE;
|
||||
import javax.xml.catalog.Catalog;
|
||||
import javax.xml.catalog.CatalogException;
|
||||
import javax.xml.catalog.CatalogFeatures;
|
||||
import javax.xml.catalog.CatalogManager;
|
||||
import javax.xml.catalog.CatalogResolver;
|
||||
import static jaxp.library.JAXPTestUtilities.getSystemProperty;
|
||||
import jaxp.library.JarUtils;
|
||||
import jaxp.library.SimpleHttpServer;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.AfterClass;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Listeners;
|
||||
import org.testng.annotations.Test;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8151154 8171243
|
||||
* @library /javax/xml/jaxp/libs /javax/xml/jaxp/unittest
|
||||
* @run testng/othervm catalog.CatalogFileInputTest
|
||||
* @summary Verifies that the Catalog API accepts valid URIs only;
|
||||
Verifies that the CatalogFeatures' builder throws
|
||||
* IllegalArgumentException on invalid file inputs.
|
||||
* This test was splitted from CatalogTest.java due to
|
||||
* JDK-8168968, it has to only run without SecurityManager
|
||||
* because an ACE will be thrown for invalid path.
|
||||
*/
|
||||
@Listeners({jaxp.library.FilePolicy.class, jaxp.library.NetAccessPolicy.class})
|
||||
public class CatalogFileInputTest extends CatalogSupportBase {
|
||||
|
||||
static final CatalogFeatures FEATURES = CatalogFeatures.builder().
|
||||
with(CatalogFeatures.Feature.PREFER, "system").build();
|
||||
static String USER_DIR = getSystemProperty("user.dir");
|
||||
static String CLS_DIR = getSystemProperty("test.classes");
|
||||
static String SRC_DIR = System.getProperty("test.src");
|
||||
static String JAR_CONTENT = "META-INF";
|
||||
final static String SCHEME_JARFILE = "jar:";
|
||||
static final String REMOTE_FILE_LOCATION = "/jar/META-INF";
|
||||
static final String DOCROOT = SRC_DIR;
|
||||
static final String TESTCONTEXT = REMOTE_FILE_LOCATION; //mapped to local file path
|
||||
SimpleHttpServer _httpserver;
|
||||
String _remoteFilePath;
|
||||
|
||||
/*
|
||||
* Initializing fields
|
||||
*/
|
||||
@BeforeClass
|
||||
public void setUpClass() throws Exception {
|
||||
super.setUp();
|
||||
|
||||
// set up HttpServer
|
||||
_httpserver = new SimpleHttpServer(TESTCONTEXT, DOCROOT);
|
||||
_httpserver.start();
|
||||
_remoteFilePath = _httpserver.getAddress() + REMOTE_FILE_LOCATION;
|
||||
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
protected void tearDown() throws Exception {
|
||||
if (_httpserver != null) {
|
||||
_httpserver.stop();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Verifies that the Catalog can be created with file system paths including JAR
|
||||
* and http URL, and used to resolve a systemId as expected.
|
||||
*/
|
||||
@Test(dataProvider = "acceptedURI")
|
||||
public void testMatch(String uri, String sysId, String pubId,
|
||||
String expectedId, String msg) throws Exception {
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, URI.create(uri));
|
||||
InputSource is = cr.resolveEntity(pubId, sysId);
|
||||
Assert.assertNotNull(is, msg);
|
||||
Assert.assertEquals(expectedId, is.getSystemId(), msg);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "invalidCatalog")
|
||||
public void testEmptyCatalog(String uri, String publicId, String msg) {
|
||||
Catalog c = CatalogManager.catalog(FEATURES, uri != null? URI.create(uri) : null);
|
||||
Assert.assertNull(c.matchSystem(publicId), msg);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "invalidCatalog", expectedExceptions = CatalogException.class)
|
||||
public void testCatalogResolverWEmptyCatalog(String uri, String publicId, String msg) {
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(
|
||||
CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, "strict").build(),
|
||||
uri != null? URI.create(uri) : null);
|
||||
InputSource is = cr.resolveEntity(publicId, "");
|
||||
}
|
||||
|
||||
@Test(dataProvider = "invalidCatalog")
|
||||
public void testCatalogResolverWEmptyCatalog1(String uri, String publicId, String msg) {
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(
|
||||
CatalogFeatures.builder().with(CatalogFeatures.Feature.RESOLVE, "continue").build(),
|
||||
uri != null? URI.create(uri) : null);
|
||||
Assert.assertNull(cr.resolveEntity(publicId, ""), msg);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "invalidInput", expectedExceptions = IllegalArgumentException.class)
|
||||
public void testFileInput(String file) {
|
||||
CatalogFeatures features = CatalogFeatures.builder()
|
||||
.with(CatalogFeatures.Feature.FILES, file)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Test(dataProvider = "invalidInput", expectedExceptions = IllegalArgumentException.class)
|
||||
public void testInvalidUri(String file) {
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, file != null? URI.create(file) : null);
|
||||
}
|
||||
|
||||
@Test(dataProvider = "invalidInput", expectedExceptions = IllegalArgumentException.class)
|
||||
public void testInvalidUri1(String file) {
|
||||
Catalog c = CatalogManager.catalog(FEATURES, file != null? URI.create(file) : null);
|
||||
System.err.println("Catalog =" + c);
|
||||
}
|
||||
|
||||
|
||||
@Test(expectedExceptions = NullPointerException.class)
|
||||
public void testNullFileInput() {
|
||||
CatalogFeatures features = CatalogFeatures.builder()
|
||||
.with(CatalogFeatures.Feature.FILES, null)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = NullPointerException.class)
|
||||
public void testNullUri() {
|
||||
URI uri = null;
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(FEATURES, uri);
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = NullPointerException.class)
|
||||
public void testNullUri1() {
|
||||
URI uri = null;
|
||||
Catalog c = CatalogManager.catalog(FEATURES, uri);
|
||||
}
|
||||
|
||||
String systemId = "http://www.sys00test.com/rewrite.dtd";
|
||||
String publicId = "PUB-404";
|
||||
String expected = "http://www.groupxmlbase.com/dtds/rewrite.dtd";
|
||||
String errMsg = "Relative rewriteSystem with xml:base at group level failed";
|
||||
|
||||
/*
|
||||
DataProvider: used to verify CatalogResolver's resolveEntity function.
|
||||
Data columns:
|
||||
catalog, systemId, publicId, expectedUri, msg
|
||||
*/
|
||||
@DataProvider(name = "acceptedURI")
|
||||
Object[][] getData() throws Exception {
|
||||
String filename = "rewriteSystem_id.xml";
|
||||
String urlFile = getClass().getResource(filename).toExternalForm();
|
||||
String urlHttp = _remoteFilePath + "/jax-ws-catalog.xml";
|
||||
String remoteXSD = _remoteFilePath + "/catalog/ws-addr.xsd";
|
||||
File file = new File(CLS_DIR + "/JDK8171243.jar!/META-INF/jax-ws-catalog.xml");
|
||||
String jarPath = SCHEME_JARFILE + file.toURI().toString();
|
||||
String xsd = jarPath.substring(0, jarPath.lastIndexOf("/")) + "/catalog/ws-addr.xsd";
|
||||
|
||||
// create JAR file
|
||||
try {
|
||||
JarUtils.createJarFile(Paths.get(CLS_DIR + "/JDK8171243.jar"),
|
||||
Paths.get(SRC_DIR + "/jar"), JAR_CONTENT);
|
||||
} catch (IOException ex) {
|
||||
Assert.fail("Failed to create JAR: " + ex.getMessage());
|
||||
}
|
||||
|
||||
return new Object[][]{
|
||||
// URL
|
||||
{urlFile, systemId, publicId, expected, errMsg},
|
||||
{urlHttp, "http://www.w3.org/2006/03/addressing/ws-addr.xsd", "", remoteXSD, "http test failed."},
|
||||
// JAR file
|
||||
{jarPath, "http://www.w3.org/2006/03/addressing/ws-addr.xsd", "", xsd, "jar file test failed."},
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* DataProvider: invalid catalog result in empty catalog
|
||||
* Note: the difference from invalidInput is that invalidInput is syntactically
|
||||
* rejected with an IAE.
|
||||
*/
|
||||
@DataProvider(name = "invalidCatalog")
|
||||
public Object[][] getInvalidCatalog() throws Exception {
|
||||
String catalogUri = getClass().getResource("catalog_invalid.xml").toExternalForm();
|
||||
return new Object[][]{
|
||||
{catalogUri, "-//W3C//DTD XHTML 1.0 Strict//EN",
|
||||
"The catalog is invalid, attempting to match the public entry shall return null."}
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* DataProvider: a list of invalid inputs, expects IAE
|
||||
* Note: exclude null since NPE would have been expected
|
||||
*/
|
||||
@DataProvider(name = "invalidInput")
|
||||
public Object[][] getFiles() throws Exception {
|
||||
String filename = "rewriteSystem_id.xml";
|
||||
copyFile(Paths.get(SRC_DIR + "/" + filename), Paths.get(filename));
|
||||
String absolutePath = getClass().getResource(filename).getFile();
|
||||
|
||||
return new Object[][]{
|
||||
{""},
|
||||
{"file:a/b\\c"},
|
||||
{"file:/../../.."},
|
||||
{"c:/te:t"},
|
||||
{"c:/te?t"},
|
||||
{"c/te*t"},
|
||||
{"in|valid.txt"},
|
||||
{"shema:invalid.txt"},
|
||||
// relative file path
|
||||
{filename},
|
||||
// absolute file path
|
||||
{absolutePath}
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
DataProvider: a list of invalid inputs
|
||||
*/
|
||||
@DataProvider(name = "nullTest")
|
||||
public Object[][] getNull() throws Exception {
|
||||
|
||||
return new Object[][]{
|
||||
{null},
|
||||
};
|
||||
}
|
||||
|
||||
void copyFile(Path src, Path target) throws Exception {
|
||||
|
||||
try (InputStream in = Files.newInputStream(src);
|
||||
BufferedReader reader
|
||||
= new BufferedReader(new InputStreamReader(in));
|
||||
OutputStream out = new BufferedOutputStream(
|
||||
Files.newOutputStream(target, CREATE, APPEND));
|
||||
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out))) {
|
||||
String line = null;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
bw.write(line);
|
||||
}
|
||||
} catch (IOException x) {
|
||||
throw new Exception(x.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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 catalog;
|
||||
|
||||
import javax.xml.catalog.CatalogFeatures;
|
||||
|
||||
import org.testng.annotations.DataProvider;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8151154
|
||||
* @run testng/othervm catalog.CatalogInvalidPathTest
|
||||
* @summary Verifies that the CatalogFeatures' builder throws
|
||||
* IllegalArgumentException on invalid file inputs.
|
||||
* This test was splitted from CatalogTest.java due to
|
||||
* JDK-8168968, it has to only run without SecurityManager
|
||||
* because an ACE will be thrown for invalid path.
|
||||
*/
|
||||
public class CatalogInvalidPathTest {
|
||||
/*
|
||||
DataProvider: for testing the verification of file paths by
|
||||
the CatalogFeatures builder
|
||||
*/
|
||||
@DataProvider(name = "invalidPaths")
|
||||
public Object[][] getFiles() {
|
||||
return new Object[][]{
|
||||
{null},
|
||||
{""},
|
||||
{"file:a/b\\c"},
|
||||
{"file:/../../.."},
|
||||
{"c:/te:t"},
|
||||
{"c:/te?t"},
|
||||
{"c/te*t"},
|
||||
{"in|valid.txt"},
|
||||
{"shema:invalid.txt"},
|
||||
};
|
||||
}
|
||||
|
||||
@Test(dataProvider = "invalidPaths", expectedExceptions = IllegalArgumentException.class)
|
||||
public void testFileInput(String file) {
|
||||
CatalogFeatures features = CatalogFeatures.builder()
|
||||
.with(CatalogFeatures.Feature.FILES, file)
|
||||
.build();
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -35,6 +35,13 @@ import java.io.Reader;
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.file.Paths;
|
||||
import java.security.CodeSource;
|
||||
import java.security.Permission;
|
||||
import java.security.PermissionCollection;
|
||||
import java.security.Permissions;
|
||||
import java.security.Policy;
|
||||
import java.security.ProtectionDomain;
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.catalog.CatalogFeatures;
|
||||
import javax.xml.catalog.CatalogResolver;
|
||||
@ -133,8 +140,8 @@ public class CatalogSupportBase {
|
||||
dtd_system = filepath + "system.dtd";
|
||||
dtd_systemResolved = "<!ENTITY system \"resolved by an EntityHandler, rather than a Catalog\">";
|
||||
|
||||
xml_catalog = filepath + "CatalogSupport.xml";
|
||||
xml_bogus_catalog = filepath + "CatalogSupport_bogus.xml";
|
||||
xml_catalog = Paths.get(filepath + "CatalogSupport.xml").toUri().toASCIIString();
|
||||
xml_bogus_catalog = Paths.get(filepath + "CatalogSupport_bogus.xml").toUri().toASCIIString();
|
||||
|
||||
xml_xInclude = "<?xml version=\"1.0\"?>\n" +
|
||||
"<xinclude:include xmlns:xinclude=\"http://www.w3.org/2001/XInclude\"\n" +
|
||||
@ -997,4 +1004,35 @@ public class CatalogSupportBase {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple policy implementation that grants a set of permissions to all code
|
||||
* sources and protection domains.
|
||||
*/
|
||||
static class SimplePolicy extends Policy {
|
||||
|
||||
private final Permissions perms;
|
||||
|
||||
public SimplePolicy(Permission... permissions) {
|
||||
perms = new Permissions();
|
||||
for (Permission permission : permissions) {
|
||||
perms.add(permission);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PermissionCollection getPermissions(CodeSource cs) {
|
||||
return perms;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PermissionCollection getPermissions(ProtectionDomain pd) {
|
||||
return perms;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean implies(ProtectionDomain pd, Permission p) {
|
||||
return perms.implies(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,17 +22,14 @@
|
||||
*/
|
||||
package catalog;
|
||||
|
||||
import static jaxp.library.JAXPTestUtilities.clearSystemProperty;
|
||||
import static jaxp.library.JAXPTestUtilities.setSystemProperty;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.StringReader;
|
||||
import java.io.StringWriter;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.catalog.Catalog;
|
||||
import javax.xml.catalog.CatalogException;
|
||||
@ -55,7 +52,8 @@ import javax.xml.transform.stream.StreamSource;
|
||||
import javax.xml.validation.Schema;
|
||||
import javax.xml.validation.SchemaFactory;
|
||||
import javax.xml.validation.Validator;
|
||||
|
||||
import static jaxp.library.JAXPTestUtilities.clearSystemProperty;
|
||||
import static jaxp.library.JAXPTestUtilities.setSystemProperty;
|
||||
import org.testng.Assert;
|
||||
import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.DataProvider;
|
||||
@ -95,10 +93,10 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* CatalogException is thrown.
|
||||
*/
|
||||
@Test(dataProvider = "getFeatures", expectedExceptions = CatalogException.class)
|
||||
public void testCircularRef(CatalogFeatures cf, String xml) {
|
||||
public void testCircularRef(CatalogFeatures cf, String xml) throws Exception {
|
||||
CatalogResolver catalogResolver = CatalogManager.catalogResolver(
|
||||
cf,
|
||||
getClass().getResource(xml).getFile());
|
||||
getClass().getResource(xml).toURI());
|
||||
catalogResolver.resolve("anyuri", "");
|
||||
}
|
||||
|
||||
@ -108,14 +106,14 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
*/
|
||||
@DataProvider(name = "getFeatures")
|
||||
public Object[][] getFeatures() {
|
||||
|
||||
String self = "catalogReferCircle-itself.xml";
|
||||
String left = "catalogReferCircle-left.xml";
|
||||
return new Object[][]{
|
||||
{CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "false").build(),
|
||||
"catalogReferCircle-itself.xml"},
|
||||
{CatalogFeatures.defaults(), "catalogReferCircle-itself.xml"},
|
||||
{CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "false").build(),
|
||||
"catalogReferCircle-left.xml"},
|
||||
{CatalogFeatures.defaults(), "catalogReferCircle-left.xml"},};
|
||||
{CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "false").build(), self},
|
||||
{CatalogFeatures.defaults(), self},
|
||||
{CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "false").build(), left},
|
||||
{CatalogFeatures.defaults(), left}
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
@ -134,7 +132,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* Expected: the parser returns the expected string.
|
||||
*/
|
||||
@Test(dataProvider = "supportXMLResolver")
|
||||
public void supportEntityResolver(String catalogFile, String xml, String expected) throws Exception {
|
||||
public void supportEntityResolver(URI catalogFile, String xml, String expected) throws Exception {
|
||||
String xmlSource = getClass().getResource(xml).getFile();
|
||||
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile);
|
||||
@ -150,7 +148,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* Expected: the parser returns the expected string.
|
||||
*/
|
||||
@Test(dataProvider = "supportXMLResolver")
|
||||
public void supportXMLResolver(String catalogFile, String xml, String expected) throws Exception {
|
||||
public void supportXMLResolver(URI catalogFile, String xml, String expected) throws Exception {
|
||||
String xmlSource = getClass().getResource(xml).getFile();
|
||||
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile);
|
||||
@ -159,7 +157,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
xifactory.setProperty(XMLInputFactory.IS_COALESCING, true);
|
||||
xifactory.setProperty(XMLInputFactory.RESOLVER, cr);
|
||||
File file = new File(xmlSource);
|
||||
String systemId = file.toURI().toString();
|
||||
String systemId = file.toURI().toASCIIString();
|
||||
InputStream entityxml = new FileInputStream(file);
|
||||
XMLStreamReader streamReader = xifactory.createXMLStreamReader(systemId, entityxml);
|
||||
String result = null;
|
||||
@ -183,7 +181,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* Fail: throws Exception if references are not resolved (by the CatalogResolver)
|
||||
*/
|
||||
@Test(dataProvider = "supportLSResourceResolver")
|
||||
public void supportLSResourceResolver(String catalogFile, Source schemaSource) throws SAXException {
|
||||
public void supportLSResourceResolver(URI catalogFile, Source schemaSource) throws SAXException {
|
||||
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile);
|
||||
|
||||
@ -199,7 +197,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* Fail: throws Exception if references are not resolved (by the CatalogResolver)
|
||||
*/
|
||||
@Test(dataProvider = "supportLSResourceResolver1")
|
||||
public void supportLSResourceResolver1(String catalogFile, Source source) throws Exception {
|
||||
public void supportLSResourceResolver1(URI catalogFile, Source source) throws Exception {
|
||||
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile);
|
||||
|
||||
@ -215,7 +213,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* Fail: throws Exception if references are not resolved (by the CatalogResolver)
|
||||
*/
|
||||
@Test(dataProvider = "supportURIResolver")
|
||||
public void supportURIResolver(String catalogFile, Source xsl, Source xml, String expected) throws Exception {
|
||||
public void supportURIResolver(URI catalogFile, Source xsl, Source xml, String expected) throws Exception {
|
||||
|
||||
CatalogResolver cr = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile);
|
||||
|
||||
@ -235,9 +233,9 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
catalog filepath, xml source file, expected result
|
||||
*/
|
||||
@DataProvider(name = "supportXMLResolver")
|
||||
public Object[][] supportXMLResolver() {
|
||||
String catalogFile = getClass().getResource("catalog.xml").getFile();
|
||||
String catalogFileUri = getClass().getResource("catalog_uri.xml").getFile();
|
||||
public Object[][] supportXMLResolver() throws Exception {
|
||||
URI catalogFile = getClass().getResource("catalog.xml").toURI();
|
||||
URI catalogFileUri = getClass().getResource("catalog_uri.xml").toURI();
|
||||
|
||||
return new Object[][]{
|
||||
{catalogFile, "system.xml", "Test system entry"},
|
||||
@ -263,9 +261,9 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
catalog filepath, schema source file
|
||||
*/
|
||||
@DataProvider(name = "supportLSResourceResolver")
|
||||
public Object[][] supportLSResourceResolver() {
|
||||
String catalogFile = getClass().getResource("CatalogSupport.xml").getFile();
|
||||
String catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").getFile();
|
||||
public Object[][] supportLSResourceResolver() throws Exception {
|
||||
URI catalogFile = getClass().getResource("CatalogSupport.xml").toURI();
|
||||
URI catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").toURI();
|
||||
|
||||
/*
|
||||
* XMLSchema.xsd has a reference to XMLSchema.dtd which in turn refers to
|
||||
@ -287,9 +285,9 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
catalog filepath, source file
|
||||
*/
|
||||
@DataProvider(name = "supportLSResourceResolver1")
|
||||
public Object[][] supportLSResourceResolver1() {
|
||||
String catalogFile = getClass().getResource("CatalogSupport.xml").getFile();
|
||||
String catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").getFile();
|
||||
public Object[][] supportLSResourceResolver1() throws Exception {
|
||||
URI catalogFile = getClass().getResource("CatalogSupport.xml").toURI();
|
||||
URI catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").toURI();
|
||||
|
||||
/*
|
||||
* val_test.xml has a reference to system.dtd and val_test.xsd
|
||||
@ -310,9 +308,9 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
catalog filepath, xsl source, xml source file
|
||||
*/
|
||||
@DataProvider(name = "supportURIResolver")
|
||||
public Object[][] supportURIResolver() {
|
||||
String catalogFile = getClass().getResource("CatalogSupport.xml").getFile();
|
||||
String catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").getFile();
|
||||
public Object[][] supportURIResolver() throws Exception {
|
||||
URI catalogFile = getClass().getResource("CatalogSupport.xml").toURI();
|
||||
URI catalogFileUri = getClass().getResource("CatalogSupport_uri.xml").toURI();
|
||||
SAXSource xslSource = new SAXSource(new InputSource(new File(xsl_doc).toURI().toASCIIString()));
|
||||
|
||||
/*
|
||||
@ -353,8 +351,9 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* other cases in that test.
|
||||
*/
|
||||
@Test(dataProvider = "resolveUri")
|
||||
public void testMatch1(String cFile, String href, String expectedFile, String expectedUri, String msg) {
|
||||
String catalogFile = getClass().getResource(cFile).getFile();
|
||||
public void testMatch1(String cFile, String href, String expectedFile,
|
||||
String expectedUri, String msg) throws Exception {
|
||||
URI catalogFile = getClass().getResource(cFile).toURI();
|
||||
CatalogResolver cur = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalogFile);
|
||||
Source source = cur.resolve(href, null);
|
||||
Assert.assertNotNull(source, "Source returned is null");
|
||||
@ -368,15 +367,16 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
*/
|
||||
@Test(dataProvider = "hierarchyOfCatFilesData")
|
||||
public void hierarchyOfCatFiles2(String systemId, String expectedUri) {
|
||||
String file1 = getClass().getResource("first_cat.xml").getFile();
|
||||
String file2 = getClass().getResource("second_cat.xml").getFile();
|
||||
String file1 = getClass().getResource("first_cat.xml").toExternalForm();
|
||||
String file2 = getClass().getResource("second_cat.xml").toExternalForm();
|
||||
String files = file1 + ";" + file2;
|
||||
|
||||
try {
|
||||
setSystemProperty(KEY_FILES, files);
|
||||
CatalogResolver catalogResolver = CatalogManager.catalogResolver(CatalogFeatures.defaults());
|
||||
String sysId = catalogResolver.resolveEntity(null, systemId).getSystemId();
|
||||
Assert.assertEquals(sysId, Paths.get(filepath + expectedUri).toUri().toString().replace("///", "/"), "System ID match not right");
|
||||
Assert.assertEquals(sysId, Paths.get(filepath + expectedUri).toUri().toString().replace("///", "/"),
|
||||
"System ID match not right");
|
||||
} finally {
|
||||
clearSystemProperty(KEY_FILES);
|
||||
}
|
||||
@ -390,8 +390,9 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* expected.
|
||||
*/
|
||||
@Test(dataProvider = "resolveEntity")
|
||||
public void testMatch1(String cfile, String prefer, String sysId, String pubId, String expectedUri, String expectedFile, String msg) {
|
||||
String catalogFile = getClass().getResource(cfile).getFile();
|
||||
public void testMatch1(String cfile, String prefer, String sysId, String pubId,
|
||||
String expectedUri, String expectedFile, String msg) throws Exception {
|
||||
URI catalogFile = getClass().getResource(cfile).toURI();
|
||||
CatalogFeatures features = CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, prefer).build();
|
||||
CatalogResolver catalogResolver = CatalogManager.catalogResolver(features, catalogFile);
|
||||
InputSource is = catalogResolver.resolveEntity(pubId, sysId);
|
||||
@ -406,9 +407,12 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* results as expected.
|
||||
*/
|
||||
@Test(dataProvider = "matchWithPrefer")
|
||||
public void matchWithPrefer(String prefer, String cfile, String publicId, String systemId, String expected) {
|
||||
String catalogFile = getClass().getResource(cfile).getFile();
|
||||
Catalog c = CatalogManager.catalog(CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, prefer).build(), catalogFile);
|
||||
public void matchWithPrefer(String prefer, String cfile, String publicId,
|
||||
String systemId, String expected) throws Exception {
|
||||
URI catalogFile = getClass().getResource(cfile).toURI();
|
||||
Catalog c = CatalogManager.catalog(
|
||||
CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, prefer).build(),
|
||||
catalogFile);
|
||||
String result;
|
||||
if (publicId != null && publicId.length() > 0) {
|
||||
result = c.matchPublic(publicId);
|
||||
@ -430,8 +434,9 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* system entry is found.
|
||||
*/
|
||||
@Test(dataProvider = "resolveWithPrefer")
|
||||
public void resolveWithPrefer(String prefer, String cfile, String publicId, String systemId, String expected) {
|
||||
String catalogFile = getClass().getResource(cfile).getFile();
|
||||
public void resolveWithPrefer(String prefer, String cfile, String publicId,
|
||||
String systemId, String expected) throws Exception {
|
||||
URI catalogFile = getClass().getResource(cfile).toURI();
|
||||
CatalogFeatures f = CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, prefer).with(CatalogFeatures.Feature.RESOLVE, "ignore").build();
|
||||
CatalogResolver catalogResolver = CatalogManager.catalogResolver(f, catalogFile);
|
||||
String result = catalogResolver.resolveEntity(publicId, systemId).getSystemId();
|
||||
@ -445,8 +450,8 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* be loaded is determined by the defer attribute.
|
||||
*/
|
||||
@Test(dataProvider = "invalidAltCatalogs", expectedExceptions = CatalogException.class)
|
||||
public void testDeferAltCatalogs(String file) {
|
||||
String catalogFile = getClass().getResource(file).getFile();
|
||||
public void testDeferAltCatalogs(String file) throws Exception {
|
||||
URI catalogFile = getClass().getResource(file).toURI();
|
||||
CatalogFeatures features = CatalogFeatures.builder().with(CatalogFeatures.Feature.DEFER, "true").build();
|
||||
/*
|
||||
Since the defer attribute is set to false in the specified catalog file,
|
||||
@ -462,8 +467,8 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
* PREFER from Features API taking precedence over catalog file
|
||||
*/
|
||||
@Test
|
||||
public void testJDK8146237() {
|
||||
String catalogFile = getClass().getResource("JDK8146237_catalog.xml").getFile();
|
||||
public void testJDK8146237() throws Exception {
|
||||
URI catalogFile = getClass().getResource("JDK8146237_catalog.xml").toURI();
|
||||
|
||||
try {
|
||||
CatalogFeatures features = CatalogFeatures.builder().with(CatalogFeatures.Feature.PREFER, "system").build();
|
||||
@ -482,8 +487,8 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
Verifies that the resulting systemId does not contain duplicate slashes
|
||||
*/
|
||||
@Test
|
||||
public void testRewriteSystem() {
|
||||
String catalog = getClass().getResource("rewriteCatalog.xml").getFile();
|
||||
public void testRewriteSystem() throws Exception {
|
||||
URI catalog = getClass().getResource("rewriteCatalog.xml").toURI();
|
||||
|
||||
try {
|
||||
CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), catalog);
|
||||
@ -500,8 +505,8 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
Verifies that the resulting systemId does not contain duplicate slashes
|
||||
*/
|
||||
@Test
|
||||
public void testRewriteUri() {
|
||||
String catalog = getClass().getResource("rewriteCatalog.xml").getFile();
|
||||
public void testRewriteUri() throws Exception {
|
||||
URI catalog = getClass().getResource("rewriteCatalog.xml").toURI();
|
||||
|
||||
try {
|
||||
|
||||
@ -519,18 +524,18 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
*/
|
||||
@Test(expectedExceptions = NullPointerException.class)
|
||||
public void testFeatureNull() {
|
||||
CatalogResolver resolver = CatalogManager.catalogResolver(null, "");
|
||||
CatalogResolver resolver = CatalogManager.catalogResolver(null, null);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@bug 8144966
|
||||
Verifies that passing null as the path will result in a NPE.
|
||||
Verifies that passing null as the URI will result in a NPE.
|
||||
*/
|
||||
@Test(expectedExceptions = NullPointerException.class)
|
||||
public void testPathNull() {
|
||||
String path = null;
|
||||
CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), path);
|
||||
URI uri = null;
|
||||
CatalogResolver resolver = CatalogManager.catalogResolver(CatalogFeatures.defaults(), uri);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -540,10 +545,11 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
that matches the expected value.
|
||||
*/
|
||||
@Test(dataProvider = "catalog")
|
||||
public void testCatalogResolver(String test, String expected, String catalogFile, String xml, SAXParser saxParser) {
|
||||
String catalog = null;
|
||||
public void testCatalogResolver(String test, String expected, String catalogFile,
|
||||
String xml, SAXParser saxParser) throws Exception {
|
||||
URI catalog = null;
|
||||
if (catalogFile != null) {
|
||||
catalog = getClass().getResource(catalogFile).getFile();
|
||||
catalog = getClass().getResource(catalogFile).toURI();
|
||||
}
|
||||
String url = getClass().getResource(xml).getFile();
|
||||
try {
|
||||
@ -565,8 +571,8 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
catalog is provided, the resolver will throw an exception by default.
|
||||
*/
|
||||
@Test
|
||||
public void testInvalidCatalog() {
|
||||
String catalog = getClass().getResource("catalog_invalid.xml").getFile();
|
||||
public void testInvalidCatalog() throws Exception {
|
||||
URI catalog = getClass().getResource("catalog_invalid.xml").toURI();
|
||||
|
||||
String test = "testInvalidCatalog";
|
||||
try {
|
||||
@ -590,7 +596,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
*/
|
||||
@Test
|
||||
public void testIgnoreInvalidCatalog() {
|
||||
String catalog = getClass().getResource("catalog_invalid.xml").getFile();
|
||||
String catalog = getClass().getResource("catalog_invalid.xml").toExternalForm();
|
||||
CatalogFeatures f = CatalogFeatures.builder()
|
||||
.with(Feature.FILES, catalog)
|
||||
.with(Feature.PREFER, "public")
|
||||
@ -600,7 +606,7 @@ public class CatalogTest extends CatalogSupportBase {
|
||||
|
||||
String test = "testInvalidCatalog";
|
||||
try {
|
||||
CatalogResolver resolver = CatalogManager.catalogResolver(f, "");
|
||||
CatalogResolver resolver = CatalogManager.catalogResolver(f);
|
||||
String actualSystemId = resolver.resolveEntity(null, "http://remote/xml/dtd/sys/alice/docAlice.dtd").getSystemId();
|
||||
System.out.println("testIgnoreInvalidCatalog: expected [null]");
|
||||
System.out.println("testIgnoreInvalidCatalog: expected [null]");
|
||||
|
@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
Created-By: 9-ea (Oracle Corporation)
|
||||
|
@ -0,0 +1,137 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
W3C XML Schema defined in the Web Services Addressing 1.0 specification
|
||||
http://www.w3.org/TR/ws-addr-core
|
||||
|
||||
Copyright © 2005 World Wide Web Consortium,
|
||||
|
||||
(Massachusetts Institute of Technology, European Research Consortium for
|
||||
Informatics and Mathematics, Keio University). All Rights Reserved. This
|
||||
work is distributed under the W3C® Software License [1] 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.
|
||||
|
||||
[1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
|
||||
|
||||
$Id: ws-addr.xsd,v 1.2 2008/07/23 13:38:16 plehegar Exp $
|
||||
-->
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.w3.org/2005/08/addressing" targetNamespace="http://www.w3.org/2005/08/addressing" blockDefault="#all" elementFormDefault="qualified" finalDefault="" attributeFormDefault="unqualified">
|
||||
|
||||
<!-- Constructs from the WS-Addressing Core -->
|
||||
|
||||
<xs:element name="EndpointReference" type="tns:EndpointReferenceType"/>
|
||||
<xs:complexType name="EndpointReferenceType" mixed="false">
|
||||
<xs:sequence>
|
||||
<xs:element name="Address" type="tns:AttributedURIType"/>
|
||||
<xs:element ref="tns:ReferenceParameters" minOccurs="0"/>
|
||||
<xs:element ref="tns:Metadata" minOccurs="0"/>
|
||||
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="ReferenceParameters" type="tns:ReferenceParametersType"/>
|
||||
<xs:complexType name="ReferenceParametersType" mixed="false">
|
||||
<xs:sequence>
|
||||
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="Metadata" type="tns:MetadataType"/>
|
||||
<xs:complexType name="MetadataType" mixed="false">
|
||||
<xs:sequence>
|
||||
<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="MessageID" type="tns:AttributedURIType"/>
|
||||
<xs:element name="RelatesTo" type="tns:RelatesToType"/>
|
||||
<xs:complexType name="RelatesToType" mixed="false">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:attribute name="RelationshipType" type="tns:RelationshipTypeOpenEnum" use="optional" default="http://www.w3.org/2005/08/addressing/reply"/>
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:simpleType name="RelationshipTypeOpenEnum">
|
||||
<xs:union memberTypes="tns:RelationshipType xs:anyURI"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="RelationshipType">
|
||||
<xs:restriction base="xs:anyURI">
|
||||
<xs:enumeration value="http://www.w3.org/2005/08/addressing/reply"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:element name="ReplyTo" type="tns:EndpointReferenceType"/>
|
||||
<xs:element name="From" type="tns:EndpointReferenceType"/>
|
||||
<xs:element name="FaultTo" type="tns:EndpointReferenceType"/>
|
||||
<xs:element name="To" type="tns:AttributedURIType"/>
|
||||
<xs:element name="Action" type="tns:AttributedURIType"/>
|
||||
|
||||
<xs:complexType name="AttributedURIType" mixed="false">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:anyURI">
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<!-- Constructs from the WS-Addressing SOAP binding -->
|
||||
|
||||
<xs:attribute name="IsReferenceParameter" type="xs:boolean"/>
|
||||
|
||||
<xs:simpleType name="FaultCodesOpenEnumType">
|
||||
<xs:union memberTypes="tns:FaultCodesType xs:QName"/>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:simpleType name="FaultCodesType">
|
||||
<xs:restriction base="xs:QName">
|
||||
<xs:enumeration value="tns:InvalidAddressingHeader"/>
|
||||
<xs:enumeration value="tns:InvalidAddress"/>
|
||||
<xs:enumeration value="tns:InvalidEPR"/>
|
||||
<xs:enumeration value="tns:InvalidCardinality"/>
|
||||
<xs:enumeration value="tns:MissingAddressInEPR"/>
|
||||
<xs:enumeration value="tns:DuplicateMessageID"/>
|
||||
<xs:enumeration value="tns:ActionMismatch"/>
|
||||
<xs:enumeration value="tns:MessageAddressingHeaderRequired"/>
|
||||
<xs:enumeration value="tns:DestinationUnreachable"/>
|
||||
<xs:enumeration value="tns:ActionNotSupported"/>
|
||||
<xs:enumeration value="tns:EndpointUnavailable"/>
|
||||
</xs:restriction>
|
||||
</xs:simpleType>
|
||||
|
||||
<xs:element name="RetryAfter" type="tns:AttributedUnsignedLongType"/>
|
||||
<xs:complexType name="AttributedUnsignedLongType" mixed="false">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:unsignedLong">
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="ProblemHeaderQName" type="tns:AttributedQNameType"/>
|
||||
<xs:complexType name="AttributedQNameType" mixed="false">
|
||||
<xs:simpleContent>
|
||||
<xs:extension base="xs:QName">
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:extension>
|
||||
</xs:simpleContent>
|
||||
</xs:complexType>
|
||||
|
||||
<xs:element name="ProblemIRI" type="tns:AttributedURIType"/>
|
||||
|
||||
<xs:element name="ProblemAction" type="tns:ProblemActionType"/>
|
||||
<xs:complexType name="ProblemActionType" mixed="false">
|
||||
<xs:sequence>
|
||||
<xs:element ref="tns:Action" minOccurs="0"/>
|
||||
<xs:element name="SoapAction" minOccurs="0" type="xs:anyURI"/>
|
||||
</xs:sequence>
|
||||
<xs:anyAttribute namespace="##other" processContents="lax"/>
|
||||
</xs:complexType>
|
||||
|
||||
</xs:schema>
|
@ -0,0 +1,4 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<catalog prefer="system" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
|
||||
<system systemId="http://www.w3.org/2006/03/addressing/ws-addr.xsd" uri="./catalog/ws-addr.xsd"/>
|
||||
</catalog>
|
@ -37,6 +37,7 @@ import java.io.StringWriter;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerException;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
@ -74,11 +75,30 @@ import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
|
||||
* @run testng/othervm -DrunSecMngr=true transform.TransformerTest
|
||||
* @run testng/othervm transform.TransformerTest
|
||||
* @summary Transformer Tests
|
||||
* @bug 6272879 6305029 6505031 8150704 8162598 8169112 8169772
|
||||
* @bug 6272879 6305029 6505031 8150704 8162598 8169112 8169631 8169772
|
||||
*/
|
||||
@Listeners({jaxp.library.FilePolicy.class})
|
||||
public class TransformerTest {
|
||||
|
||||
// some global constants
|
||||
private static final String LINE_SEPARATOR =
|
||||
getSystemProperty("line.separator");
|
||||
|
||||
private static final String NAMESPACES =
|
||||
"http://xml.org/sax/features/namespaces";
|
||||
|
||||
private static final String NAMESPACE_PREFIXES =
|
||||
"http://xml.org/sax/features/namespace-prefixes";
|
||||
|
||||
private static abstract class TestTemplate {
|
||||
protected void printSnippet(String title, String snippet) {
|
||||
StringBuilder div = new StringBuilder();
|
||||
for (int i = 0; i < title.length(); i++)
|
||||
div.append("=");
|
||||
System.out.println(title + "\n" + div + "\n" + snippet + "\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the contents of the given file into a string.
|
||||
* WARNING: this method adds a final line feed even if the last line of the file doesn't contain one.
|
||||
@ -101,44 +121,7 @@ public class TransformerTest {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method for testBug8162598().
|
||||
* Provides a convenient way to check/assert the expected namespaces
|
||||
* of a Node and its siblings.
|
||||
*
|
||||
* @param test
|
||||
* The node to check
|
||||
* @param nstest
|
||||
* Expected namespace of the node
|
||||
* @param nsb
|
||||
* Expected namespace of the first sibling
|
||||
* @param nsc
|
||||
* Expected namespace of the first sibling of the first sibling
|
||||
*/
|
||||
private void checkNodeNS8162598(Node test, String nstest, String nsb, String nsc) {
|
||||
String testNodeName = test.getNodeName();
|
||||
if (nstest == null) {
|
||||
Assert.assertNull(test.getNamespaceURI(), "unexpected namespace for " + testNodeName);
|
||||
} else {
|
||||
Assert.assertEquals(test.getNamespaceURI(), nstest, "unexpected namespace for " + testNodeName);
|
||||
}
|
||||
Node b = test.getChildNodes().item(0);
|
||||
if (nsb == null) {
|
||||
Assert.assertNull(b.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b");
|
||||
} else {
|
||||
Assert.assertEquals(b.getNamespaceURI(), nsb, "unexpected namespace for " + testNodeName + "->b");
|
||||
}
|
||||
Node c = b.getChildNodes().item(0);
|
||||
if (nsc == null) {
|
||||
Assert.assertNull(c.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b->c");
|
||||
} else {
|
||||
Assert.assertEquals(c.getNamespaceURI(), nsc, "unexpected namespace for " + testNodeName + "->b->c");
|
||||
}
|
||||
}
|
||||
|
||||
private class XMLReaderFor6305029 implements XMLReader {
|
||||
private static final String NAMESPACES = "http://xml.org/sax/features/namespaces";
|
||||
private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes";
|
||||
private boolean namespaces = true;
|
||||
private boolean namespacePrefixes = false;
|
||||
private EntityResolver resolver;
|
||||
@ -235,8 +218,6 @@ public class TransformerTest {
|
||||
*/
|
||||
@Test
|
||||
public final void testBug6272879() throws IOException, TransformerException {
|
||||
final String LINE_SEPARATOR = getSystemProperty("line.separator");
|
||||
|
||||
final String xsl =
|
||||
"<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + LINE_SEPARATOR +
|
||||
"<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" + LINE_SEPARATOR +
|
||||
@ -349,9 +330,125 @@ public class TransformerTest {
|
||||
Assert.assertTrue(s.contains("map1key1value") && s.contains("map2key1value"));
|
||||
}
|
||||
|
||||
private static class Test8169631 extends TestTemplate {
|
||||
private final static String xsl =
|
||||
"<?xml version=\"1.0\"?>" + LINE_SEPARATOR +
|
||||
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">" + LINE_SEPARATOR +
|
||||
" <xsl:template match=\"/\">" + LINE_SEPARATOR +
|
||||
" <xsl:variable name=\"Counter\" select=\"count(//row)\"/>" + LINE_SEPARATOR +
|
||||
" <xsl:variable name=\"AttribCounter\" select=\"count(//@attrib)\"/>" + LINE_SEPARATOR +
|
||||
" <Counter><xsl:value-of select=\"$Counter\"/></Counter>" + LINE_SEPARATOR +
|
||||
" <AttribCounter><xsl:value-of select=\"$AttribCounter\"/></AttribCounter>" + LINE_SEPARATOR +
|
||||
" </xsl:template>" + LINE_SEPARATOR +
|
||||
"</xsl:stylesheet>" + LINE_SEPARATOR;
|
||||
|
||||
private final static String sourceXml =
|
||||
"<?xml version=\"1.0\"?>" + LINE_SEPARATOR +
|
||||
"<envelope xmlns=\"http://www.sap.com/myns\" xmlns:sap=\"http://www.sap.com/myns\">" + LINE_SEPARATOR +
|
||||
" <sap:row sap:attrib=\"a\">1</sap:row>" + LINE_SEPARATOR +
|
||||
" <row attrib=\"b\">2</row>" + LINE_SEPARATOR +
|
||||
" <row sap:attrib=\"c\">3</row>" + LINE_SEPARATOR +
|
||||
"</envelope>" + LINE_SEPARATOR;
|
||||
|
||||
/**
|
||||
* Utility method to print out transformation result and check values.
|
||||
*
|
||||
* @param type
|
||||
* Text describing type of transformation
|
||||
* @param result
|
||||
* Resulting output of transformation
|
||||
* @param elementCount
|
||||
* Counter of elements to check
|
||||
* @param attribCount
|
||||
* Counter of attributes to check
|
||||
*/
|
||||
private void verifyResult(String type, String result, int elementCount,
|
||||
int attribCount)
|
||||
{
|
||||
printSnippet("Result of transformation from " + type + ":",
|
||||
result);
|
||||
Assert.assertEquals(
|
||||
result.contains("<Counter>" + elementCount + "</Counter>"),
|
||||
true, "Result of transformation from " + type +
|
||||
" should have count of " + elementCount + " elements.");
|
||||
Assert.assertEquals(
|
||||
result.contains("<AttribCounter>" + attribCount +
|
||||
"</AttribCounter>"), true, "Result of transformation from " +
|
||||
type + " should have count of "+ attribCount + " attributes.");
|
||||
}
|
||||
|
||||
public void run() throws IOException, TransformerException,
|
||||
SAXException, ParserConfigurationException
|
||||
{
|
||||
printSnippet("Source:", sourceXml);
|
||||
|
||||
printSnippet("Stylesheet:", xsl);
|
||||
|
||||
// create default transformer (namespace aware)
|
||||
TransformerFactory tf1 = TransformerFactory.newInstance();
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(xsl.getBytes());
|
||||
Transformer t1 = tf1.newTransformer(new StreamSource(bais));
|
||||
|
||||
// test transformation from stream source with namespace support
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
bais = new ByteArrayInputStream(sourceXml.getBytes());
|
||||
t1.transform(new StreamSource(bais), new StreamResult(baos));
|
||||
verifyResult("StreamSource with namespace support", baos.toString(), 0, 1);
|
||||
|
||||
// test transformation from DOM source with namespace support
|
||||
bais.reset();
|
||||
baos.reset();
|
||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||
dbf.setNamespaceAware(true);
|
||||
Document doc = dbf.newDocumentBuilder().parse(new InputSource(bais));
|
||||
t1.transform(new DOMSource(doc), new StreamResult(baos));
|
||||
verifyResult("DOMSource with namespace support", baos.toString(), 0, 1);
|
||||
|
||||
// test transformation from DOM source without namespace support
|
||||
bais.reset();
|
||||
baos.reset();
|
||||
dbf.setNamespaceAware(false);
|
||||
doc = dbf.newDocumentBuilder().parse(new InputSource(bais));
|
||||
t1.transform(new DOMSource(doc), new StreamResult(baos));
|
||||
verifyResult("DOMSource without namespace support", baos.toString(), 3, 3);
|
||||
|
||||
// test transformation from SAX source with namespace support
|
||||
bais.reset();
|
||||
baos.reset();
|
||||
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||
spf.setNamespaceAware(true);
|
||||
XMLReader xmlr = spf.newSAXParser().getXMLReader();
|
||||
SAXSource saxS = new SAXSource(xmlr, new InputSource(bais));
|
||||
t1.transform(saxS, new StreamResult(baos));
|
||||
verifyResult("SAXSource with namespace support", baos.toString(), 0, 1);
|
||||
|
||||
// test transformation from SAX source without namespace support
|
||||
bais.reset();
|
||||
baos.reset();
|
||||
spf.setNamespaceAware(false);
|
||||
xmlr = spf.newSAXParser().getXMLReader();
|
||||
saxS = new SAXSource(xmlr, new InputSource(bais));
|
||||
t1.transform(saxS, new StreamResult(baos));
|
||||
verifyResult("SAXSource without namespace support", baos.toString(), 3, 3);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @bug 8169631
|
||||
* @summary Test combinations of namespace awareness settings on
|
||||
* XSL transformations
|
||||
*/
|
||||
@Test
|
||||
public final void testBug8169631() throws IOException, SAXException,
|
||||
TransformerException, ParserConfigurationException
|
||||
{
|
||||
new Test8169631().run();
|
||||
}
|
||||
|
||||
/*
|
||||
* @bug 8150704
|
||||
* @summary Test that XSL transformation with lots of temporary result trees will not run out of DTM IDs.
|
||||
* @summary Test that XSL transformation with lots of temporary result
|
||||
* trees will not run out of DTM IDs.
|
||||
*/
|
||||
@Test
|
||||
public final void testBug8150704() throws TransformerException, IOException {
|
||||
@ -375,16 +472,8 @@ public class TransformerTest {
|
||||
System.out.println("Passed.");
|
||||
}
|
||||
|
||||
/*
|
||||
* @bug 8162598
|
||||
* @summary Test XSLTC handling of namespaces, especially empty namespace definitions to reset the
|
||||
* default namespace
|
||||
*/
|
||||
@Test
|
||||
public final void testBug8162598() throws IOException, TransformerException {
|
||||
final String LINE_SEPARATOR = getSystemProperty("line.separator");
|
||||
|
||||
final String xsl =
|
||||
private static class Test8162598 extends TestTemplate {
|
||||
private static final String xsl =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + LINE_SEPARATOR +
|
||||
"<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">" + LINE_SEPARATOR +
|
||||
" <xsl:template match=\"/\">" + LINE_SEPARATOR +
|
||||
@ -402,39 +491,85 @@ public class TransformerTest {
|
||||
" </xsl:template>" + LINE_SEPARATOR +
|
||||
"</xsl:stylesheet>";
|
||||
|
||||
private static final String sourceXml =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><aaa></aaa>" + LINE_SEPARATOR;
|
||||
/**
|
||||
* Utility method for testBug8162598().
|
||||
* Provides a convenient way to check/assert the expected namespaces
|
||||
* of a Node and its siblings.
|
||||
*
|
||||
* @param test
|
||||
* The node to check
|
||||
* @param nstest
|
||||
* Expected namespace of the node
|
||||
* @param nsb
|
||||
* Expected namespace of the first sibling
|
||||
* @param nsc
|
||||
* Expected namespace of the first sibling of the first sibling
|
||||
*/
|
||||
|
||||
final String sourceXml =
|
||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><aaa></aaa>" + LINE_SEPARATOR;
|
||||
private void checkNodeNS(Node test, String nstest, String nsb, String nsc) {
|
||||
String testNodeName = test.getNodeName();
|
||||
if (nstest == null) {
|
||||
Assert.assertNull(test.getNamespaceURI(), "unexpected namespace for " + testNodeName);
|
||||
} else {
|
||||
Assert.assertEquals(test.getNamespaceURI(), nstest, "unexpected namespace for " + testNodeName);
|
||||
}
|
||||
Node b = test.getChildNodes().item(0);
|
||||
if (nsb == null) {
|
||||
Assert.assertNull(b.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b");
|
||||
} else {
|
||||
Assert.assertEquals(b.getNamespaceURI(), nsb, "unexpected namespace for " + testNodeName + "->b");
|
||||
}
|
||||
Node c = b.getChildNodes().item(0);
|
||||
if (nsc == null) {
|
||||
Assert.assertNull(c.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b->c");
|
||||
} else {
|
||||
Assert.assertEquals(c.getNamespaceURI(), nsc, "unexpected namespace for " + testNodeName + "->b->c");
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println("Stylesheet:");
|
||||
System.out.println("=============================");
|
||||
System.out.println(xsl);
|
||||
System.out.println();
|
||||
public void run() throws IOException, TransformerException {
|
||||
printSnippet("Source:", sourceXml);
|
||||
|
||||
System.out.println("Source before transformation:");
|
||||
System.out.println("=============================");
|
||||
System.out.println(sourceXml);
|
||||
System.out.println();
|
||||
printSnippet("Stylesheet:", xsl);
|
||||
|
||||
// transform to DOM result
|
||||
TransformerFactory tf = TransformerFactory.newInstance();
|
||||
Transformer t = tf.newTransformer(new StreamSource(new ByteArrayInputStream(xsl.getBytes())));
|
||||
DOMResult result = new DOMResult();
|
||||
t.transform(new StreamSource(new ByteArrayInputStream(sourceXml.getBytes())), result);
|
||||
Document document = (Document)result.getNode();
|
||||
// transform to DOM result
|
||||
TransformerFactory tf = TransformerFactory.newInstance();
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(xsl.getBytes());
|
||||
Transformer t = tf.newTransformer(new StreamSource(bais));
|
||||
DOMResult result = new DOMResult();
|
||||
bais = new ByteArrayInputStream(sourceXml.getBytes());
|
||||
t.transform(new StreamSource(bais), result);
|
||||
Document document = (Document)result.getNode();
|
||||
|
||||
System.out.println("Result after transformation:");
|
||||
System.out.println("============================");
|
||||
OutputFormat format = new OutputFormat();
|
||||
format.setIndenting(true);
|
||||
new XMLSerializer(System.out, format).serialize(document);
|
||||
System.out.println();
|
||||
checkNodeNS8162598(document.getElementsByTagName("test1").item(0), "ns2", "ns2", null);
|
||||
checkNodeNS8162598(document.getElementsByTagName("test2").item(0), "ns1", "ns2", null);
|
||||
checkNodeNS8162598(document.getElementsByTagName("test3").item(0), null, null, null);
|
||||
checkNodeNS8162598(document.getElementsByTagName("test4").item(0), null, null, null);
|
||||
checkNodeNS8162598(document.getElementsByTagName("test5").item(0), "ns1", "ns1", null);
|
||||
Assert.assertNull(document.getElementsByTagName("test6").item(0).getNamespaceURI(), "unexpected namespace for test6");
|
||||
System.out.println("Result after transformation:");
|
||||
System.out.println("============================");
|
||||
OutputFormat format = new OutputFormat();
|
||||
format.setIndenting(true);
|
||||
new XMLSerializer(System.out, format).serialize(document);
|
||||
System.out.println();
|
||||
|
||||
checkNodeNS(document.getElementsByTagName("test1").item(0), "ns2", "ns2", null);
|
||||
checkNodeNS(document.getElementsByTagName("test2").item(0), "ns1", "ns2", null);
|
||||
checkNodeNS(document.getElementsByTagName("test3").item(0), null, null, null);
|
||||
checkNodeNS(document.getElementsByTagName("test4").item(0), null, null, null);
|
||||
checkNodeNS(document.getElementsByTagName("test5").item(0), "ns1", "ns1", null);
|
||||
Assert.assertNull(document.getElementsByTagName("test6").item(0).getNamespaceURI(),
|
||||
"unexpected namespace for test6");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @bug 8162598
|
||||
* @summary Test XSLTC handling of namespaces, especially empty namespace
|
||||
* definitions to reset the default namespace
|
||||
*/
|
||||
@Test
|
||||
public final void testBug8162598() throws IOException,
|
||||
TransformerException
|
||||
{
|
||||
new Test8162598().run();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -394,3 +394,4 @@ c41140100bf1e5c10c7b8f3bde91c16eff7485f5 jdk-9+147
|
||||
5a846396a24c7aff01d6a8feaa7afc0a6369f04d jdk-9+149
|
||||
71e198ef3839045e829a879af1d709be16ab0f88 jdk-9+150
|
||||
d27bab22ff62823902d93d1d35ca397cfd50d059 jdk-9+151
|
||||
a20f2cf90762673e1bc4980fd6597e70a2578045 jdk-9+152
|
||||
|
@ -436,15 +436,15 @@ sequence.fallback=latin-1,latin-2,latin-7,cyrillic-iso8859-5,greek,latin-5,latin
|
||||
|
||||
filename.-monotype-arial-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/arial.ttf
|
||||
filename.-monotype-arial-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/ariali.ttf
|
||||
filename.-monotype-arial-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/arialb.ttf
|
||||
filename.-monotype-arial-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/arialbd.ttf
|
||||
filename.-monotype-arial-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/arialbi.ttf
|
||||
filename.-monotype-courier_new-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/cour.ttf
|
||||
filename.-monotype-courier_new-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/couri.ttf
|
||||
filename.-monotype-courier_new-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/courb.ttf
|
||||
filename.-monotype-courier_new-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/courbd.ttf
|
||||
filename.-monotype-courier_new-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/courbi.ttf
|
||||
filename.-monotype-times_new_roman-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/times.ttf
|
||||
filename.-monotype-times_new_roman-medium-i-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/timesi.ttf
|
||||
filename.-monotype-times_new_roman-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/timesb.ttf
|
||||
filename.-monotype-times_new_roman-bold-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/timesbd.ttf
|
||||
filename.-monotype-times_new_roman-bold-i-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/timesbi.ttf
|
||||
|
||||
filename.-monotype-angsana_new-medium-r-normal--*-%d-*-*-p-*-iso10646-1=/usr/share/fonts/TrueType/core/angsa.ttf
|
||||
|
@ -222,6 +222,8 @@ endif
|
||||
# applies to debug builds.
|
||||
ifeq ($(TOOLCHAIN_TYPE), gcc)
|
||||
BUILD_LIBAWT_debug_mem.c_CFLAGS := -w
|
||||
# This option improves performance of MaskFill in Java2D by 20% for some gcc
|
||||
LIBAWT_CFLAGS += -fgcse-after-reload
|
||||
endif
|
||||
|
||||
$(eval $(call SetupNativeCompilation,BUILD_LIBAWT, \
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1962,6 +1962,9 @@ public class File
|
||||
name = sb.toString();
|
||||
}
|
||||
|
||||
// Normalize the path component
|
||||
name = fs.normalize(name);
|
||||
|
||||
File f = new File(dir, name);
|
||||
if (!name.equals(f.getName()) || f.isInvalid()) {
|
||||
if (System.getSecurityManager() != null)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2477,7 +2477,7 @@ public final class Class<T> implements java.io.Serializable,
|
||||
* <ul>
|
||||
*
|
||||
* <li> If the {@code name} begins with a {@code '/'}
|
||||
* (<tt>'\u002f'</tt>), then the absolute name of the resource is the
|
||||
* (<code>'\u002f'</code>), then the absolute name of the resource is the
|
||||
* portion of the {@code name} following the {@code '/'}.
|
||||
*
|
||||
* <li> Otherwise, the absolute name is of the following form:
|
||||
@ -2488,7 +2488,7 @@ public final class Class<T> implements java.io.Serializable,
|
||||
*
|
||||
* <p> Where the {@code modified_package_name} is the package name of this
|
||||
* object with {@code '/'} substituted for {@code '.'}
|
||||
* (<tt>'\u002e'</tt>).
|
||||
* (<code>'\u002e'</code>).
|
||||
*
|
||||
* </ul>
|
||||
*
|
||||
@ -2570,7 +2570,7 @@ public final class Class<T> implements java.io.Serializable,
|
||||
* <ul>
|
||||
*
|
||||
* <li> If the {@code name} begins with a {@code '/'}
|
||||
* (<tt>'\u002f'</tt>), then the absolute name of the resource is the
|
||||
* (<code>'\u002f'</code>), then the absolute name of the resource is the
|
||||
* portion of the {@code name} following the {@code '/'}.
|
||||
*
|
||||
* <li> Otherwise, the absolute name is of the following form:
|
||||
@ -2581,7 +2581,7 @@ public final class Class<T> implements java.io.Serializable,
|
||||
*
|
||||
* <p> Where the {@code modified_package_name} is the package name of this
|
||||
* object with {@code '/'} substituted for {@code '.'}
|
||||
* (<tt>'\u002e'</tt>).
|
||||
* (<code>'\u002e'</code>).
|
||||
*
|
||||
* </ul>
|
||||
*
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -70,34 +70,34 @@ import sun.security.util.SecurityConstants;
|
||||
|
||||
/**
|
||||
* A class loader is an object that is responsible for loading classes. The
|
||||
* class <tt>ClassLoader</tt> is an abstract class. Given the <a
|
||||
* class {@code ClassLoader} is an abstract class. Given the <a
|
||||
* href="#name">binary name</a> of a class, a class loader should attempt to
|
||||
* locate or generate data that constitutes a definition for the class. A
|
||||
* typical strategy is to transform the name into a file name and then read a
|
||||
* "class file" of that name from a file system.
|
||||
*
|
||||
* <p> Every {@link Class <tt>Class</tt>} object contains a {@link
|
||||
* Class#getClassLoader() reference} to the <tt>ClassLoader</tt> that defined
|
||||
* <p> Every {@link java.lang.Class Class} object contains a {@link
|
||||
* Class#getClassLoader() reference} to the {@code ClassLoader} that defined
|
||||
* it.
|
||||
*
|
||||
* <p> <tt>Class</tt> objects for array classes are not created by class
|
||||
* <p> {@code Class} objects for array classes are not created by class
|
||||
* loaders, but are created automatically as required by the Java runtime.
|
||||
* The class loader for an array class, as returned by {@link
|
||||
* Class#getClassLoader()} is the same as the class loader for its element
|
||||
* type; if the element type is a primitive type, then the array class has no
|
||||
* class loader.
|
||||
*
|
||||
* <p> Applications implement subclasses of <tt>ClassLoader</tt> in order to
|
||||
* <p> Applications implement subclasses of {@code ClassLoader} in order to
|
||||
* extend the manner in which the Java virtual machine dynamically loads
|
||||
* classes.
|
||||
*
|
||||
* <p> Class loaders may typically be used by security managers to indicate
|
||||
* security domains.
|
||||
*
|
||||
* <p> The <tt>ClassLoader</tt> class uses a delegation model to search for
|
||||
* classes and resources. Each instance of <tt>ClassLoader</tt> has an
|
||||
* <p> The {@code ClassLoader} class uses a delegation model to search for
|
||||
* classes and resources. Each instance of {@code ClassLoader} has an
|
||||
* associated parent class loader. When requested to find a class or
|
||||
* resource, a <tt>ClassLoader</tt> instance will delegate the search for the
|
||||
* resource, a {@code ClassLoader} instance will delegate the search for the
|
||||
* class or resource to its parent class loader before attempting to find the
|
||||
* class or resource itself.
|
||||
*
|
||||
@ -105,15 +105,15 @@ import sun.security.util.SecurityConstants;
|
||||
* <em>{@linkplain #isRegisteredAsParallelCapable() parallel capable}</em> class
|
||||
* loaders and are required to register themselves at their class initialization
|
||||
* time by invoking the {@link
|
||||
* #registerAsParallelCapable <tt>ClassLoader.registerAsParallelCapable</tt>}
|
||||
* method. Note that the <tt>ClassLoader</tt> class is registered as parallel
|
||||
* #registerAsParallelCapable ClassLoader.registerAsParallelCapable}
|
||||
* method. Note that the {@code ClassLoader} class is registered as parallel
|
||||
* capable by default. However, its subclasses still need to register themselves
|
||||
* if they are parallel capable.
|
||||
* In environments in which the delegation model is not strictly
|
||||
* hierarchical, class loaders need to be parallel capable, otherwise class
|
||||
* loading can lead to deadlocks because the loader lock is held for the
|
||||
* duration of the class loading process (see {@link #loadClass
|
||||
* <tt>loadClass</tt>} methods).
|
||||
* loadClass} methods).
|
||||
*
|
||||
* <h3> <a name="builtinLoaders">Run-time Built-in Class Loaders</a></h3>
|
||||
*
|
||||
@ -143,13 +143,13 @@ import sun.security.util.SecurityConstants;
|
||||
* However, some classes may not originate from a file; they may originate
|
||||
* from other sources, such as the network, or they could be constructed by an
|
||||
* application. The method {@link #defineClass(String, byte[], int, int)
|
||||
* <tt>defineClass</tt>} converts an array of bytes into an instance of class
|
||||
* <tt>Class</tt>. Instances of this newly defined class can be created using
|
||||
* {@link Class#newInstance <tt>Class.newInstance</tt>}.
|
||||
* defineClass} converts an array of bytes into an instance of class
|
||||
* {@code Class}. Instances of this newly defined class can be created using
|
||||
* {@link Class#newInstance Class.newInstance}.
|
||||
*
|
||||
* <p> The methods and constructors of objects created by a class loader may
|
||||
* reference other classes. To determine the class(es) referred to, the Java
|
||||
* virtual machine invokes the {@link #loadClass <tt>loadClass</tt>} method of
|
||||
* virtual machine invokes the {@link #loadClass loadClass} method of
|
||||
* the class loader that originally created the class.
|
||||
*
|
||||
* <p> For example, an application could create a network class loader to
|
||||
@ -162,9 +162,9 @@ import sun.security.util.SecurityConstants;
|
||||
* </pre></blockquote>
|
||||
*
|
||||
* <p> The network class loader subclass must define the methods {@link
|
||||
* #findClass <tt>findClass</tt>} and <tt>loadClassData</tt> to load a class
|
||||
* #findClass findClass} and {@code loadClassData} to load a class
|
||||
* from the network. Once it has downloaded the bytes that make up the class,
|
||||
* it should use the method {@link #defineClass <tt>defineClass</tt>} to
|
||||
* it should use the method {@link #defineClass defineClass} to
|
||||
* create a class instance. A sample implementation is:
|
||||
*
|
||||
* <blockquote><pre>
|
||||
@ -392,7 +392,7 @@ public abstract class ClassLoader {
|
||||
*
|
||||
* <p> If there is a security manager, its {@link
|
||||
* SecurityManager#checkCreateClassLoader()
|
||||
* <tt>checkCreateClassLoader</tt>} method is invoked. This may result in
|
||||
* checkCreateClassLoader} method is invoked. This may result in
|
||||
* a security exception. </p>
|
||||
*
|
||||
* @param parent
|
||||
@ -400,7 +400,7 @@ public abstract class ClassLoader {
|
||||
*
|
||||
* @throws SecurityException
|
||||
* If a security manager exists and its
|
||||
* <tt>checkCreateClassLoader</tt> method doesn't allow creation
|
||||
* {@code checkCreateClassLoader} method doesn't allow creation
|
||||
* of a new class loader.
|
||||
*
|
||||
* @since 1.2
|
||||
@ -410,18 +410,18 @@ public abstract class ClassLoader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new class loader using the <tt>ClassLoader</tt> returned by
|
||||
* Creates a new class loader using the {@code ClassLoader} returned by
|
||||
* the method {@link #getSystemClassLoader()
|
||||
* <tt>getSystemClassLoader()</tt>} as the parent class loader.
|
||||
* getSystemClassLoader()} as the parent class loader.
|
||||
*
|
||||
* <p> If there is a security manager, its {@link
|
||||
* SecurityManager#checkCreateClassLoader()
|
||||
* <tt>checkCreateClassLoader</tt>} method is invoked. This may result in
|
||||
* checkCreateClassLoader} method is invoked. This may result in
|
||||
* a security exception. </p>
|
||||
*
|
||||
* @throws SecurityException
|
||||
* If a security manager exists and its
|
||||
* <tt>checkCreateClassLoader</tt> method doesn't allow creation
|
||||
* {@code checkCreateClassLoader} method doesn't allow creation
|
||||
* of a new class loader.
|
||||
*/
|
||||
protected ClassLoader() {
|
||||
@ -458,13 +458,13 @@ public abstract class ClassLoader {
|
||||
* This method searches for classes in the same manner as the {@link
|
||||
* #loadClass(String, boolean)} method. It is invoked by the Java virtual
|
||||
* machine to resolve class references. Invoking this method is equivalent
|
||||
* to invoking {@link #loadClass(String, boolean) <tt>loadClass(name,
|
||||
* false)</tt>}.
|
||||
* to invoking {@link #loadClass(String, boolean) loadClass(name,
|
||||
* false)}.
|
||||
*
|
||||
* @param name
|
||||
* The <a href="#name">binary name</a> of the class
|
||||
*
|
||||
* @return The resulting <tt>Class</tt> object
|
||||
* @return The resulting {@code Class} object
|
||||
*
|
||||
* @throws ClassNotFoundException
|
||||
* If the class was not found
|
||||
@ -483,8 +483,8 @@ public abstract class ClassLoader {
|
||||
* <li><p> Invoke {@link #findLoadedClass(String)} to check if the class
|
||||
* has already been loaded. </p></li>
|
||||
*
|
||||
* <li><p> Invoke the {@link #loadClass(String) <tt>loadClass</tt>} method
|
||||
* on the parent class loader. If the parent is <tt>null</tt> the class
|
||||
* <li><p> Invoke the {@link #loadClass(String) loadClass} method
|
||||
* on the parent class loader. If the parent is {@code null} the class
|
||||
* loader built-in to the virtual machine is used, instead. </p></li>
|
||||
*
|
||||
* <li><p> Invoke the {@link #findClass(String)} method to find the
|
||||
@ -493,23 +493,23 @@ public abstract class ClassLoader {
|
||||
* </ol>
|
||||
*
|
||||
* <p> If the class was found using the above steps, and the
|
||||
* <tt>resolve</tt> flag is true, this method will then invoke the {@link
|
||||
* #resolveClass(Class)} method on the resulting <tt>Class</tt> object.
|
||||
* {@code resolve} flag is true, this method will then invoke the {@link
|
||||
* #resolveClass(Class)} method on the resulting {@code Class} object.
|
||||
*
|
||||
* <p> Subclasses of <tt>ClassLoader</tt> are encouraged to override {@link
|
||||
* <p> Subclasses of {@code ClassLoader} are encouraged to override {@link
|
||||
* #findClass(String)}, rather than this method. </p>
|
||||
*
|
||||
* <p> Unless overridden, this method synchronizes on the result of
|
||||
* {@link #getClassLoadingLock <tt>getClassLoadingLock</tt>} method
|
||||
* {@link #getClassLoadingLock getClassLoadingLock} method
|
||||
* during the entire class loading process.
|
||||
*
|
||||
* @param name
|
||||
* The <a href="#name">binary name</a> of the class
|
||||
*
|
||||
* @param resolve
|
||||
* If <tt>true</tt> then resolve the class
|
||||
* If {@code true} then resolve the class
|
||||
*
|
||||
* @return The resulting <tt>Class</tt> object
|
||||
* @return The resulting {@code Class} object
|
||||
*
|
||||
* @throws ClassNotFoundException
|
||||
* If the class could not be found
|
||||
@ -606,7 +606,7 @@ public abstract class ClassLoader {
|
||||
* @return the lock for class loading operations
|
||||
*
|
||||
* @throws NullPointerException
|
||||
* If registered as parallel capable and <tt>className</tt> is null
|
||||
* If registered as parallel capable and {@code className} is null
|
||||
*
|
||||
* @see #loadClass(String, boolean)
|
||||
*
|
||||
@ -667,14 +667,14 @@ public abstract class ClassLoader {
|
||||
* Finds the class with the specified <a href="#name">binary name</a>.
|
||||
* This method should be overridden by class loader implementations that
|
||||
* follow the delegation model for loading classes, and will be invoked by
|
||||
* the {@link #loadClass <tt>loadClass</tt>} method after checking the
|
||||
* the {@link #loadClass loadClass} method after checking the
|
||||
* parent class loader for the requested class. The default implementation
|
||||
* throws a <tt>ClassNotFoundException</tt>.
|
||||
* throws a {@code ClassNotFoundException}.
|
||||
*
|
||||
* @param name
|
||||
* The <a href="#name">binary name</a> of the class
|
||||
*
|
||||
* @return The resulting <tt>Class</tt> object
|
||||
* @return The resulting {@code Class} object
|
||||
*
|
||||
* @throws ClassNotFoundException
|
||||
* If the class could not be found
|
||||
@ -722,32 +722,32 @@ public abstract class ClassLoader {
|
||||
|
||||
|
||||
/**
|
||||
* Converts an array of bytes into an instance of class <tt>Class</tt>.
|
||||
* Before the <tt>Class</tt> can be used it must be resolved. This method
|
||||
* Converts an array of bytes into an instance of class {@code Class}.
|
||||
* Before the {@code Class} can be used it must be resolved. This method
|
||||
* is deprecated in favor of the version that takes a <a
|
||||
* href="#name">binary name</a> as its first argument, and is more secure.
|
||||
*
|
||||
* @param b
|
||||
* The bytes that make up the class data. The bytes in positions
|
||||
* <tt>off</tt> through <tt>off+len-1</tt> should have the format
|
||||
* {@code off} through {@code off+len-1} should have the format
|
||||
* of a valid class file as defined by
|
||||
* <cite>The Java™ Virtual Machine Specification</cite>.
|
||||
*
|
||||
* @param off
|
||||
* The start offset in <tt>b</tt> of the class data
|
||||
* The start offset in {@code b} of the class data
|
||||
*
|
||||
* @param len
|
||||
* The length of the class data
|
||||
*
|
||||
* @return The <tt>Class</tt> object that was created from the specified
|
||||
* @return The {@code Class} object that was created from the specified
|
||||
* class data
|
||||
*
|
||||
* @throws ClassFormatError
|
||||
* If the data did not contain a valid class
|
||||
*
|
||||
* @throws IndexOutOfBoundsException
|
||||
* If either <tt>off</tt> or <tt>len</tt> is negative, or if
|
||||
* <tt>off+len</tt> is greater than <tt>b.length</tt>.
|
||||
* If either {@code off} or {@code len} is negative, or if
|
||||
* {@code off+len} is greater than {@code b.length}.
|
||||
*
|
||||
* @throws SecurityException
|
||||
* If an attempt is made to add this class to a package that
|
||||
@ -994,11 +994,11 @@ public abstract class ClassLoader {
|
||||
* #defineClass(String, byte[], int, int, ProtectionDomain)}.
|
||||
*
|
||||
* <p> An invocation of this method of the form
|
||||
* <i>cl</i><tt>.defineClass(</tt><i>name</i><tt>,</tt>
|
||||
* <i>bBuffer</i><tt>,</tt> <i>pd</i><tt>)</tt> yields exactly the same
|
||||
* <i>cl</i>{@code .defineClass(}<i>name</i>{@code ,}
|
||||
* <i>bBuffer</i>{@code ,} <i>pd</i>{@code )} yields exactly the same
|
||||
* result as the statements
|
||||
*
|
||||
*<p> <tt>
|
||||
*<p> <code>
|
||||
* ...<br>
|
||||
* byte[] temp = new byte[bBuffer.{@link
|
||||
* java.nio.ByteBuffer#remaining remaining}()];<br>
|
||||
@ -1007,16 +1007,16 @@ public abstract class ClassLoader {
|
||||
* return {@link #defineClass(String, byte[], int, int, ProtectionDomain)
|
||||
* cl.defineClass}(name, temp, 0,
|
||||
* temp.length, pd);<br>
|
||||
* </tt></p>
|
||||
* </code></p>
|
||||
*
|
||||
* @param name
|
||||
* The expected <a href="#name">binary name</a>. of the class, or
|
||||
* <tt>null</tt> if not known
|
||||
* {@code null} if not known
|
||||
*
|
||||
* @param b
|
||||
* The bytes that make up the class data. The bytes from positions
|
||||
* <tt>b.position()</tt> through <tt>b.position() + b.limit() -1
|
||||
* </tt> should have the format of a valid class file as defined by
|
||||
* {@code b.position()} through {@code b.position() + b.limit() -1
|
||||
* } should have the format of a valid class file as defined by
|
||||
* <cite>The Java™ Virtual Machine Specification</cite>.
|
||||
*
|
||||
* @param protectionDomain
|
||||
@ -1158,7 +1158,7 @@ public abstract class ClassLoader {
|
||||
|
||||
/**
|
||||
* Links the specified class. This (misleadingly named) method may be
|
||||
* used by a class loader to link a class. If the class <tt>c</tt> has
|
||||
* used by a class loader to link a class. If the class {@code c} has
|
||||
* already been linked, then this method simply returns. Otherwise, the
|
||||
* class is linked as described in the "Execution" chapter of
|
||||
* <cite>The Java™ Language Specification</cite>.
|
||||
@ -1167,7 +1167,7 @@ public abstract class ClassLoader {
|
||||
* The class to link
|
||||
*
|
||||
* @throws NullPointerException
|
||||
* If <tt>c</tt> is <tt>null</tt>.
|
||||
* If {@code c} is {@code null}.
|
||||
*
|
||||
* @see #defineClass(String, byte[], int, int)
|
||||
*/
|
||||
@ -1182,16 +1182,16 @@ public abstract class ClassLoader {
|
||||
* loading it if necessary.
|
||||
*
|
||||
* <p> This method loads the class through the system class loader (see
|
||||
* {@link #getSystemClassLoader()}). The <tt>Class</tt> object returned
|
||||
* might have more than one <tt>ClassLoader</tt> associated with it.
|
||||
* Subclasses of <tt>ClassLoader</tt> need not usually invoke this method,
|
||||
* {@link #getSystemClassLoader()}). The {@code Class} object returned
|
||||
* might have more than one {@code ClassLoader} associated with it.
|
||||
* Subclasses of {@code ClassLoader} need not usually invoke this method,
|
||||
* because most class loaders need to override just {@link
|
||||
* #findClass(String)}. </p>
|
||||
*
|
||||
* @param name
|
||||
* The <a href="#name">binary name</a> of the class
|
||||
*
|
||||
* @return The <tt>Class</tt> object for the specified <tt>name</tt>
|
||||
* @return The {@code Class} object for the specified {@code name}
|
||||
*
|
||||
* @throws ClassNotFoundException
|
||||
* If the class could not be found
|
||||
@ -1222,12 +1222,12 @@ public abstract class ClassLoader {
|
||||
* Returns the class with the given <a href="#name">binary name</a> if this
|
||||
* loader has been recorded by the Java virtual machine as an initiating
|
||||
* loader of a class with that <a href="#name">binary name</a>. Otherwise
|
||||
* <tt>null</tt> is returned.
|
||||
* {@code null} is returned.
|
||||
*
|
||||
* @param name
|
||||
* The <a href="#name">binary name</a> of the class
|
||||
*
|
||||
* @return The <tt>Class</tt> object, or <tt>null</tt> if the class has
|
||||
* @return The {@code Class} object, or {@code null} if the class has
|
||||
* not been loaded
|
||||
*
|
||||
* @since 1.1
|
||||
@ -1245,7 +1245,7 @@ public abstract class ClassLoader {
|
||||
* class.
|
||||
*
|
||||
* @param c
|
||||
* The <tt>Class</tt> object
|
||||
* The {@code Class} object
|
||||
*
|
||||
* @param signers
|
||||
* The signers for the class
|
||||
@ -1306,11 +1306,11 @@ public abstract class ClassLoader {
|
||||
* (images, audio, text, etc) that can be accessed by class code in a way
|
||||
* that is independent of the location of the code.
|
||||
*
|
||||
* <p> The name of a resource is a '<tt>/</tt>'-separated path name that
|
||||
* <p> The name of a resource is a '{@code /}'-separated path name that
|
||||
* identifies the resource.
|
||||
*
|
||||
* <p> This method will first search the parent class loader for the
|
||||
* resource; if the parent is <tt>null</tt> the path of the class loader
|
||||
* resource; if the parent is {@code null} the path of the class loader
|
||||
* built-in to the virtual machine is searched. That failing, this method
|
||||
* will invoke {@link #findResource(String)} to find the resource. </p>
|
||||
*
|
||||
@ -1362,7 +1362,7 @@ public abstract class ClassLoader {
|
||||
* (images, audio, text, etc) that can be accessed by class code in a way
|
||||
* that is independent of the location of the code.
|
||||
*
|
||||
* <p> The name of a resource is a <tt>/</tt>-separated path name that
|
||||
* <p> The name of a resource is a {@code /}-separated path name that
|
||||
* identifies the resource.
|
||||
*
|
||||
* <p> The delegation order for searching is described in the documentation
|
||||
@ -1389,7 +1389,7 @@ public abstract class ClassLoader {
|
||||
* @param name
|
||||
* The resource name
|
||||
*
|
||||
* @return An enumeration of {@link java.net.URL <tt>URL</tt>} objects for
|
||||
* @return An enumeration of {@link java.net.URL URL} objects for
|
||||
* the resource. If no resources could be found, the enumeration
|
||||
* will be empty. Resources for which a {@code URL} cannot be
|
||||
* constructed, are in package that is not opened unconditionally,
|
||||
@ -1505,7 +1505,7 @@ public abstract class ClassLoader {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an enumeration of {@link java.net.URL <tt>URL</tt>} objects
|
||||
* Returns an enumeration of {@link java.net.URL URL} objects
|
||||
* representing all the resources with the given name. Class loader
|
||||
* implementations should override this method to specify where to load
|
||||
* resources from.
|
||||
@ -1520,7 +1520,7 @@ public abstract class ClassLoader {
|
||||
* @param name
|
||||
* The resource name
|
||||
*
|
||||
* @return An enumeration of {@link java.net.URL <tt>URL</tt>} objects for
|
||||
* @return An enumeration of {@link java.net.URL URL} objects for
|
||||
* the resource. If no resources could be found, the enumeration
|
||||
* will be empty. Resources for which a {@code URL} cannot be
|
||||
* constructed, are in a package that is not opened unconditionally,
|
||||
@ -1594,7 +1594,7 @@ public abstract class ClassLoader {
|
||||
* @param name
|
||||
* The resource name
|
||||
*
|
||||
* @return A {@link java.net.URL <tt>URL</tt>} to the resource; {@code
|
||||
* @return A {@link java.net.URL URL} to the resource; {@code
|
||||
* null} if the resource could not be found, a URL could not be
|
||||
* constructed to locate the resource, the resource is in a package
|
||||
* that is not opened unconditionally or access to the resource is
|
||||
@ -1609,8 +1609,8 @@ public abstract class ClassLoader {
|
||||
/**
|
||||
* Finds all resources of the specified name from the search path used to
|
||||
* load classes. The resources thus found are returned as an
|
||||
* {@link java.util.Enumeration <tt>Enumeration</tt>} of {@link
|
||||
* java.net.URL <tt>URL</tt>} objects.
|
||||
* {@link java.util.Enumeration Enumeration} of {@link
|
||||
* java.net.URL URL} objects.
|
||||
*
|
||||
* <p> The search order is described in the documentation for {@link
|
||||
* #getSystemResource(String)}. </p>
|
||||
@ -1625,7 +1625,7 @@ public abstract class ClassLoader {
|
||||
* @param name
|
||||
* The resource name
|
||||
*
|
||||
* @return An enumeration of {@link java.net.URL <tt>URL</tt>} objects for
|
||||
* @return An enumeration of {@link java.net.URL URL} objects for
|
||||
* the resource. If no resources could be found, the enumeration
|
||||
* will be empty. Resources for which a {@code URL} cannot be
|
||||
* constructed, are in a package that is not opened unconditionally,
|
||||
@ -1714,11 +1714,11 @@ public abstract class ClassLoader {
|
||||
|
||||
/**
|
||||
* Returns the parent class loader for delegation. Some implementations may
|
||||
* use <tt>null</tt> to represent the bootstrap class loader. This method
|
||||
* will return <tt>null</tt> in such implementations if this class loader's
|
||||
* use {@code null} to represent the bootstrap class loader. This method
|
||||
* will return {@code null} in such implementations if this class loader's
|
||||
* parent is the bootstrap class loader.
|
||||
*
|
||||
* @return The parent <tt>ClassLoader</tt>
|
||||
* @return The parent {@code ClassLoader}
|
||||
*
|
||||
* @throws SecurityException
|
||||
* If a security manager is present, and the caller's class loader
|
||||
@ -1785,7 +1785,7 @@ public abstract class ClassLoader {
|
||||
|
||||
/**
|
||||
* Returns the system class loader for delegation. This is the default
|
||||
* delegation parent for new <tt>ClassLoader</tt> instances, and is
|
||||
* delegation parent for new {@code ClassLoader} instances, and is
|
||||
* typically the class loader used to start the application.
|
||||
*
|
||||
* <p> This method is first invoked early in the runtime's startup
|
||||
@ -1797,12 +1797,12 @@ public abstract class ClassLoader {
|
||||
* <p> The default system class loader is an implementation-dependent
|
||||
* instance of this class.
|
||||
*
|
||||
* <p> If the system property "<tt>java.system.class.loader</tt>" is defined
|
||||
* <p> If the system property "{@code java.system.class.loader}" is defined
|
||||
* when this method is first invoked then the value of that property is
|
||||
* taken to be the name of a class that will be returned as the system
|
||||
* class loader. The class is loaded using the default system class loader
|
||||
* and must define a public constructor that takes a single parameter of
|
||||
* type <tt>ClassLoader</tt> which is used as the delegation parent. An
|
||||
* type {@code ClassLoader} which is used as the delegation parent. An
|
||||
* instance is then created using this constructor with the default system
|
||||
* class loader as the parameter. The resulting class loader is defined
|
||||
* to be the system class loader. During construction, the class loader
|
||||
@ -1825,7 +1825,7 @@ public abstract class ClassLoader {
|
||||
* the application module path then the class path defaults to
|
||||
* the current working directory.
|
||||
*
|
||||
* @return The system <tt>ClassLoader</tt> for delegation
|
||||
* @return The system {@code ClassLoader} for delegation
|
||||
*
|
||||
* @throws SecurityException
|
||||
* If a security manager is present, and the caller's class loader
|
||||
@ -1835,11 +1835,11 @@ public abstract class ClassLoader {
|
||||
*
|
||||
* @throws IllegalStateException
|
||||
* If invoked recursively during the construction of the class
|
||||
* loader specified by the "<tt>java.system.class.loader</tt>"
|
||||
* loader specified by the "{@code java.system.class.loader}"
|
||||
* property.
|
||||
*
|
||||
* @throws Error
|
||||
* If the system property "<tt>java.system.class.loader</tt>"
|
||||
* If the system property "{@code java.system.class.loader}"
|
||||
* is defined but the named class could not be loaded, the
|
||||
* provider class does not define the required constructor, or an
|
||||
* exception is thrown by that constructor when it is invoked. The
|
||||
@ -2249,9 +2249,9 @@ public abstract class ClassLoader {
|
||||
/**
|
||||
* Returns the absolute path name of a native library. The VM invokes this
|
||||
* method to locate the native libraries that belong to classes loaded with
|
||||
* this class loader. If this method returns <tt>null</tt>, the VM
|
||||
* this class loader. If this method returns {@code null}, the VM
|
||||
* searches the library along the path specified as the
|
||||
* "<tt>java.library.path</tt>" property.
|
||||
* "{@code java.library.path}" property.
|
||||
*
|
||||
* @param libname
|
||||
* The library name
|
||||
@ -2270,12 +2270,12 @@ public abstract class ClassLoader {
|
||||
/**
|
||||
* The inner class NativeLibrary denotes a loaded native library instance.
|
||||
* Every classloader contains a vector of loaded native libraries in the
|
||||
* private field <tt>nativeLibraries</tt>. The native libraries loaded
|
||||
* into the system are entered into the <tt>systemNativeLibraries</tt>
|
||||
* private field {@code nativeLibraries}. The native libraries loaded
|
||||
* into the system are entered into the {@code systemNativeLibraries}
|
||||
* vector.
|
||||
*
|
||||
* <p> Every native library requires a particular version of JNI. This is
|
||||
* denoted by the private <tt>jniVersion</tt> field. This field is set by
|
||||
* denoted by the private {@code jniVersion} field. This field is set by
|
||||
* the VM when it loads the library, and used by the VM to pass the correct
|
||||
* version of JNI to the native methods. </p>
|
||||
*
|
||||
@ -2592,8 +2592,8 @@ public abstract class ClassLoader {
|
||||
* #setClassAssertionStatus(String, boolean)}.
|
||||
*
|
||||
* @param enabled
|
||||
* <tt>true</tt> if classes loaded by this class loader will
|
||||
* henceforth have assertions enabled by default, <tt>false</tt>
|
||||
* {@code true} if classes loaded by this class loader will
|
||||
* henceforth have assertions enabled by default, {@code false}
|
||||
* if they will have assertions disabled by default.
|
||||
*
|
||||
* @since 1.4
|
||||
@ -2614,16 +2614,16 @@ public abstract class ClassLoader {
|
||||
* any of its "subpackages".
|
||||
*
|
||||
* <p> A subpackage of a package named p is any package whose name begins
|
||||
* with "<tt>p.</tt>". For example, <tt>javax.swing.text</tt> is a
|
||||
* subpackage of <tt>javax.swing</tt>, and both <tt>java.util</tt> and
|
||||
* <tt>java.lang.reflect</tt> are subpackages of <tt>java</tt>.
|
||||
* with "{@code p.}". For example, {@code javax.swing.text} is a
|
||||
* subpackage of {@code javax.swing}, and both {@code java.util} and
|
||||
* {@code java.lang.reflect} are subpackages of {@code java}.
|
||||
*
|
||||
* <p> In the event that multiple package defaults apply to a given class,
|
||||
* the package default pertaining to the most specific package takes
|
||||
* precedence over the others. For example, if <tt>javax.lang</tt> and
|
||||
* <tt>javax.lang.reflect</tt> both have package defaults associated with
|
||||
* precedence over the others. For example, if {@code javax.lang} and
|
||||
* {@code javax.lang.reflect} both have package defaults associated with
|
||||
* them, the latter package default applies to classes in
|
||||
* <tt>javax.lang.reflect</tt>.
|
||||
* {@code javax.lang.reflect}.
|
||||
*
|
||||
* <p> Package defaults take precedence over the class loader's default
|
||||
* assertion status, and may be overridden on a per-class basis by invoking
|
||||
@ -2631,15 +2631,15 @@ public abstract class ClassLoader {
|
||||
*
|
||||
* @param packageName
|
||||
* The name of the package whose package default assertion status
|
||||
* is to be set. A <tt>null</tt> value indicates the unnamed
|
||||
* is to be set. A {@code null} value indicates the unnamed
|
||||
* package that is "current"
|
||||
* (see section 7.4.2 of
|
||||
* <cite>The Java™ Language Specification</cite>.)
|
||||
*
|
||||
* @param enabled
|
||||
* <tt>true</tt> if classes loaded by this classloader and
|
||||
* {@code true} if classes loaded by this classloader and
|
||||
* belonging to the named package or any of its subpackages will
|
||||
* have assertions enabled by default, <tt>false</tt> if they will
|
||||
* have assertions enabled by default, {@code false} if they will
|
||||
* have assertions disabled by default.
|
||||
*
|
||||
* @since 1.4
|
||||
@ -2670,8 +2670,8 @@ public abstract class ClassLoader {
|
||||
* assertion status is to be set.
|
||||
*
|
||||
* @param enabled
|
||||
* <tt>true</tt> if the named class is to have assertions
|
||||
* enabled when (and if) it is initialized, <tt>false</tt> if the
|
||||
* {@code true} if the named class is to have assertions
|
||||
* enabled when (and if) it is initialized, {@code false} if the
|
||||
* class is to have assertions disabled.
|
||||
*
|
||||
* @since 1.4
|
||||
@ -2687,7 +2687,7 @@ public abstract class ClassLoader {
|
||||
|
||||
/**
|
||||
* Sets the default assertion status for this class loader to
|
||||
* <tt>false</tt> and discards any package defaults or class assertion
|
||||
* {@code false} and discards any package defaults or class assertion
|
||||
* status settings associated with the class loader. This method is
|
||||
* provided so that class loaders can be made to ignore any command line or
|
||||
* persistent assertion status settings and "start with a clean slate."
|
||||
|
@ -30,8 +30,10 @@ import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.security.PrivilegedAction;
|
||||
import java.util.Hashtable;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.ServiceConfigurationError;
|
||||
import java.util.ServiceLoader;
|
||||
@ -231,7 +233,7 @@ public abstract class URLConnection {
|
||||
*/
|
||||
protected boolean allowUserInteraction = defaultAllowUserInteraction;
|
||||
|
||||
private static boolean defaultUseCaches = true;
|
||||
private static volatile boolean defaultUseCaches = true;
|
||||
|
||||
/**
|
||||
* If {@code true}, the protocol is allowed to use caching
|
||||
@ -243,12 +245,18 @@ public abstract class URLConnection {
|
||||
* <p>
|
||||
* Its default value is the value given in the last invocation of the
|
||||
* {@code setDefaultUseCaches} method.
|
||||
* <p>
|
||||
* The default setting may be overridden per protocol with
|
||||
* {@link #setDefaultUseCaches(String,boolean)}.
|
||||
*
|
||||
* @see java.net.URLConnection#setUseCaches(boolean)
|
||||
* @see java.net.URLConnection#getUseCaches()
|
||||
* @see java.net.URLConnection#setDefaultUseCaches(boolean)
|
||||
*/
|
||||
protected boolean useCaches = defaultUseCaches;
|
||||
protected boolean useCaches;
|
||||
|
||||
private static final ConcurrentHashMap<String,Boolean> defaultCaching =
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* Some protocols support skipping the fetching of the object unless
|
||||
@ -460,6 +468,11 @@ public abstract class URLConnection {
|
||||
*/
|
||||
protected URLConnection(URL url) {
|
||||
this.url = url;
|
||||
if (url == null) {
|
||||
this.useCaches = defaultUseCaches;
|
||||
} else {
|
||||
this.useCaches = getDefaultUseCaches(url.getProtocol());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -981,7 +994,8 @@ public abstract class URLConnection {
|
||||
* is true, the connection is allowed to use whatever caches it can.
|
||||
* If false, caches are to be ignored.
|
||||
* The default value comes from DefaultUseCaches, which defaults to
|
||||
* true.
|
||||
* true. A default value can also be set per-protocol using
|
||||
* {@link #setDefaultUseCaches(String,boolean)}.
|
||||
*
|
||||
* @param usecaches a {@code boolean} indicating whether
|
||||
* or not to allow caching
|
||||
@ -1032,9 +1046,10 @@ public abstract class URLConnection {
|
||||
* Returns the default value of a {@code URLConnection}'s
|
||||
* {@code useCaches} flag.
|
||||
* <p>
|
||||
* Ths default is "sticky", being a part of the static state of all
|
||||
* This default is "sticky", being a part of the static state of all
|
||||
* URLConnections. This flag applies to the next, and all following
|
||||
* URLConnections that are created.
|
||||
* URLConnections that are created. This default value can be over-ridden
|
||||
* per protocol using {@link #setDefaultUseCaches(String,boolean)}
|
||||
*
|
||||
* @return the default value of a {@code URLConnection}'s
|
||||
* {@code useCaches} flag.
|
||||
@ -1046,7 +1061,8 @@ public abstract class URLConnection {
|
||||
|
||||
/**
|
||||
* Sets the default value of the {@code useCaches} field to the
|
||||
* specified value.
|
||||
* specified value. This default value can be over-ridden
|
||||
* per protocol using {@link #setDefaultUseCaches(String,boolean)}
|
||||
*
|
||||
* @param defaultusecaches the new value.
|
||||
* @see #getDefaultUseCaches()
|
||||
@ -1055,6 +1071,43 @@ public abstract class URLConnection {
|
||||
defaultUseCaches = defaultusecaches;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the default value of the {@code useCaches} field for the named
|
||||
* protocol to the given value. This value overrides any default setting
|
||||
* set by {@link #setDefaultUseCaches(boolean)} for the given protocol.
|
||||
* Successive calls to this method change the setting and affect the
|
||||
* default value for all future connections of that protocol. The protocol
|
||||
* name is case insensitive.
|
||||
*
|
||||
* @param protocol the protocol to set the default for
|
||||
* @param defaultVal whether caching is enabled by default for the given protocol
|
||||
* @since 9
|
||||
*/
|
||||
public static void setDefaultUseCaches(String protocol, boolean defaultVal) {
|
||||
protocol = protocol.toLowerCase(Locale.US);
|
||||
defaultCaching.put(protocol, defaultVal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default value of the {@code useCaches} flag for the given protocol. If
|
||||
* {@link #setDefaultUseCaches(String,boolean)} was called for the given protocol,
|
||||
* then that value is returned. Otherwise, if {@link #setDefaultUseCaches(boolean)}
|
||||
* was called, then that value is returned. If neither method was called,
|
||||
* the return value is {@code true}. The protocol name is case insensitive.
|
||||
*
|
||||
* @param protocol the protocol whose defaultUseCaches setting is required
|
||||
* @return the default value of the {@code useCaches} flag for the given protocol.
|
||||
* @since 9
|
||||
*/
|
||||
public static boolean getDefaultUseCaches(String protocol) {
|
||||
Boolean protoDefault = defaultCaching.get(protocol.toLowerCase(Locale.US));
|
||||
if (protoDefault != null) {
|
||||
return protoDefault.booleanValue();
|
||||
} else {
|
||||
return defaultUseCaches;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the general request property. If a property with the key already
|
||||
* exists, overwrite its value with the new value.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -4354,6 +4354,11 @@ public class Collections {
|
||||
private Object readResolve() {
|
||||
return EMPTY_SET;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -4786,6 +4791,10 @@ public class Collections {
|
||||
public boolean removeIf(Predicate<? super E> filter) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(element);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -4848,6 +4857,10 @@ public class Collections {
|
||||
public Spliterator<E> spliterator() {
|
||||
return singletonSpliterator(element);
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 31 + Objects.hashCode(element);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -4970,6 +4983,11 @@ public class Collections {
|
||||
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(k) ^ Objects.hashCode(v);
|
||||
}
|
||||
}
|
||||
|
||||
// Miscellaneous
|
||||
|
@ -82,17 +82,19 @@ import sun.util.calendar.ZoneInfo;
|
||||
* well; for example, the time scale used by the satellite-based
|
||||
* global positioning system (GPS) is synchronized to UTC but is
|
||||
* <i>not</i> adjusted for leap seconds. An interesting source of
|
||||
* further information is the U.S. Naval Observatory, particularly
|
||||
* the Directorate of Time at:
|
||||
* further information is the United States Naval Observatory (USNO):
|
||||
* <blockquote><pre>
|
||||
* <a href="http://www.usno.navy.mil">http://www.usno.navy.mil</a>
|
||||
* <a href="http://www.usno.navy.mil/USNO">http://www.usno.navy.mil/USNO</a>
|
||||
* </pre></blockquote>
|
||||
* <p>
|
||||
* and their definitions of "Systems of Time" at:
|
||||
* and the material regarding "Systems of Time" at:
|
||||
* <blockquote><pre>
|
||||
* <a href="http://www.usno.navy.mil/USNO/time/master-clock/systems-of-time">http://www.usno.navy.mil/USNO/time/master-clock/systems-of-time</a>
|
||||
* </pre></blockquote>
|
||||
* <p>
|
||||
* which has descriptions of various different time systems including
|
||||
* UT, UT1, and UTC.
|
||||
* <p>
|
||||
* In all methods of class {@code Date} that accept or return
|
||||
* year, month, date, hours, minutes, and seconds values, the
|
||||
* following representations are used:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -35,6 +35,7 @@ import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.UnaryOperator;
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
/**
|
||||
* Container class for immutable collections. Not part of the public API.
|
||||
@ -105,6 +106,11 @@ class ImmutableCollections {
|
||||
return null; // but the compiler doesn't know this
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<E> iterator() {
|
||||
return Collections.emptyIterator();
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
|
||||
throw new InvalidObjectException("not serial proxy");
|
||||
}
|
||||
@ -112,9 +118,26 @@ class ImmutableCollections {
|
||||
private Object writeReplace() {
|
||||
return new CollSer(CollSer.IMM_LIST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
Objects.requireNonNull(o);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsAll(Collection<?> o) {
|
||||
return o.isEmpty(); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static final class List1<E> extends AbstractImmutableList<E> {
|
||||
@Stable
|
||||
private final E e0;
|
||||
|
||||
List1(E e0) {
|
||||
@ -129,7 +152,6 @@ class ImmutableCollections {
|
||||
@Override
|
||||
public E get(int index) {
|
||||
Objects.checkIndex(index, 1);
|
||||
// assert index == 0
|
||||
return e0;
|
||||
}
|
||||
|
||||
@ -140,10 +162,22 @@ class ImmutableCollections {
|
||||
private Object writeReplace() {
|
||||
return new CollSer(CollSer.IMM_LIST, e0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
return o.equals(e0); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 31 + e0.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
static final class List2<E> extends AbstractImmutableList<E> {
|
||||
@Stable
|
||||
private final E e0;
|
||||
@Stable
|
||||
private final E e1;
|
||||
|
||||
List2(E e0, E e1) {
|
||||
@ -166,6 +200,17 @@ class ImmutableCollections {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
return o.equals(e0) || o.equals(e1); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 31 + e0.hashCode();
|
||||
return 31 * hash + e1.hashCode();
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
|
||||
throw new InvalidObjectException("not serial proxy");
|
||||
}
|
||||
@ -176,6 +221,7 @@ class ImmutableCollections {
|
||||
}
|
||||
|
||||
static final class ListN<E> extends AbstractImmutableList<E> {
|
||||
@Stable
|
||||
private final E[] elements;
|
||||
|
||||
@SafeVarargs
|
||||
@ -200,6 +246,25 @@ class ImmutableCollections {
|
||||
return elements[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
for (E e : elements) {
|
||||
if (o.equals(e)) { // implicit nullcheck of o
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 1;
|
||||
for (E e : elements) {
|
||||
hash = 31 * hash + e.hashCode();
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
|
||||
throw new InvalidObjectException("not serial proxy");
|
||||
}
|
||||
@ -238,7 +303,13 @@ class ImmutableCollections {
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
return super.contains(Objects.requireNonNull(o));
|
||||
Objects.requireNonNull(o);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsAll(Collection<?> o) {
|
||||
return o.isEmpty(); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -253,9 +324,15 @@ class ImmutableCollections {
|
||||
private Object writeReplace() {
|
||||
return new CollSer(CollSer.IMM_SET);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static final class Set1<E> extends AbstractImmutableSet<E> {
|
||||
@Stable
|
||||
private final E e0;
|
||||
|
||||
Set1(E e0) {
|
||||
@ -269,7 +346,7 @@ class ImmutableCollections {
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
return super.contains(Objects.requireNonNull(o));
|
||||
return o.equals(e0); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -284,17 +361,21 @@ class ImmutableCollections {
|
||||
private Object writeReplace() {
|
||||
return new CollSer(CollSer.IMM_SET, e0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return e0.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
static final class Set2<E> extends AbstractImmutableSet<E> {
|
||||
private final E e0;
|
||||
private final E e1;
|
||||
@Stable
|
||||
final E e0;
|
||||
@Stable
|
||||
final E e1;
|
||||
|
||||
Set2(E e0, E e1) {
|
||||
Objects.requireNonNull(e0);
|
||||
Objects.requireNonNull(e1);
|
||||
|
||||
if (e0.equals(e1)) {
|
||||
if (e0.equals(Objects.requireNonNull(e1))) { // implicit nullcheck of e0
|
||||
throw new IllegalArgumentException("duplicate element: " + e0);
|
||||
}
|
||||
|
||||
@ -314,7 +395,12 @@ class ImmutableCollections {
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
return super.contains(Objects.requireNonNull(o));
|
||||
return o.equals(e0) || o.equals(e1); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return e0.hashCode() + e1.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -358,8 +444,10 @@ class ImmutableCollections {
|
||||
* @param <E> the element type
|
||||
*/
|
||||
static final class SetN<E> extends AbstractImmutableSet<E> {
|
||||
private final E[] elements;
|
||||
private final int size;
|
||||
@Stable
|
||||
final E[] elements;
|
||||
@Stable
|
||||
final int size;
|
||||
|
||||
@SafeVarargs
|
||||
@SuppressWarnings("unchecked")
|
||||
@ -368,8 +456,8 @@ class ImmutableCollections {
|
||||
|
||||
elements = (E[])new Object[EXPAND_FACTOR * input.length];
|
||||
for (int i = 0; i < input.length; i++) {
|
||||
E e = Objects.requireNonNull(input[i]);
|
||||
int idx = probe(e);
|
||||
E e = input[i];
|
||||
int idx = probe(e); // implicit nullcheck of e
|
||||
if (idx >= 0) {
|
||||
throw new IllegalArgumentException("duplicate element: " + e);
|
||||
} else {
|
||||
@ -385,8 +473,7 @@ class ImmutableCollections {
|
||||
|
||||
@Override
|
||||
public boolean contains(Object o) {
|
||||
Objects.requireNonNull(o);
|
||||
return probe(o) >= 0;
|
||||
return probe(o) >= 0; // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -414,8 +501,21 @@ class ImmutableCollections {
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int h = 0;
|
||||
for (E e : elements) {
|
||||
if (e != null) {
|
||||
h += e.hashCode();
|
||||
}
|
||||
}
|
||||
return h;
|
||||
}
|
||||
|
||||
// returns index at which element is present; or if absent,
|
||||
// (-i - 1) where i is location where element should be inserted
|
||||
// (-i - 1) where i is location where element should be inserted.
|
||||
// Callers are relying on this method to perform an implicit nullcheck
|
||||
// of pe
|
||||
private int probe(Object pe) {
|
||||
int idx = Math.floorMod(pe.hashCode() ^ SALT, elements.length);
|
||||
while (true) {
|
||||
@ -481,12 +581,14 @@ class ImmutableCollections {
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object o) {
|
||||
return super.containsKey(Objects.requireNonNull(o));
|
||||
Objects.requireNonNull(o);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsValue(Object o) {
|
||||
return super.containsValue(Objects.requireNonNull(o));
|
||||
Objects.requireNonNull(o);
|
||||
return false;
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
|
||||
@ -496,10 +598,17 @@ class ImmutableCollections {
|
||||
private Object writeReplace() {
|
||||
return new CollSer(CollSer.IMM_MAP);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static final class Map1<K,V> extends AbstractImmutableMap<K,V> {
|
||||
@Stable
|
||||
private final K k0;
|
||||
@Stable
|
||||
private final V v0;
|
||||
|
||||
Map1(K k0, V v0) {
|
||||
@ -514,12 +623,12 @@ class ImmutableCollections {
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object o) {
|
||||
return super.containsKey(Objects.requireNonNull(o));
|
||||
return o.equals(k0); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsValue(Object o) {
|
||||
return super.containsValue(Objects.requireNonNull(o));
|
||||
return o.equals(v0); // implicit nullcheck of o
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
|
||||
@ -529,6 +638,11 @@ class ImmutableCollections {
|
||||
private Object writeReplace() {
|
||||
return new CollSer(CollSer.IMM_MAP, k0, v0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return k0.hashCode() ^ v0.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -541,12 +655,13 @@ class ImmutableCollections {
|
||||
* @param <V> the value type
|
||||
*/
|
||||
static final class MapN<K,V> extends AbstractImmutableMap<K,V> {
|
||||
private final Object[] table; // pairs of key, value
|
||||
private final int size; // number of pairs
|
||||
@Stable
|
||||
final Object[] table; // pairs of key, value
|
||||
@Stable
|
||||
final int size; // number of pairs
|
||||
|
||||
MapN(Object... input) {
|
||||
Objects.requireNonNull(input);
|
||||
if ((input.length & 1) != 0) {
|
||||
if ((input.length & 1) != 0) { // implicit nullcheck of input
|
||||
throw new InternalError("length is odd");
|
||||
}
|
||||
size = input.length >> 1;
|
||||
@ -573,12 +688,30 @@ class ImmutableCollections {
|
||||
|
||||
@Override
|
||||
public boolean containsKey(Object o) {
|
||||
return probe(Objects.requireNonNull(o)) >= 0;
|
||||
return probe(o) >= 0; // implicit nullcheck of o
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsValue(Object o) {
|
||||
return super.containsValue(Objects.requireNonNull(o));
|
||||
for (int i = 1; i < table.length; i += 2) {
|
||||
Object v = table[i];
|
||||
if (v != null && o.equals(v)) { // implicit nullcheck of o
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 0;
|
||||
for (int i = 0; i < table.length; i += 2) {
|
||||
Object k = table[i];
|
||||
if (k != null) {
|
||||
hash += k.hashCode() ^ table[i + 1].hashCode();
|
||||
}
|
||||
}
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -638,7 +771,9 @@ class ImmutableCollections {
|
||||
}
|
||||
|
||||
// returns index at which the probe key is present; or if absent,
|
||||
// (-i - 1) where i is location where element should be inserted
|
||||
// (-i - 1) where i is location where element should be inserted.
|
||||
// Callers are relying on this method to perform an implicit nullcheck
|
||||
// of pk.
|
||||
private int probe(Object pk) {
|
||||
int idx = Math.floorMod(pk.hashCode() ^ SALT, table.length >> 1) << 1;
|
||||
while (true) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* 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,6 +25,8 @@
|
||||
|
||||
package java.util;
|
||||
|
||||
import jdk.internal.vm.annotation.Stable;
|
||||
|
||||
/**
|
||||
* An immutable container for a key and a value, suitable for use
|
||||
* in creating and populating {@code Map} instances.
|
||||
@ -48,7 +50,9 @@ package java.util;
|
||||
* @since 9
|
||||
*/
|
||||
final class KeyValueHolder<K,V> implements Map.Entry<K,V> {
|
||||
@Stable
|
||||
final K key;
|
||||
@Stable
|
||||
final V value;
|
||||
|
||||
KeyValueHolder(K k, V v) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1027,8 +1027,7 @@ public interface List<E> extends Collection<E> {
|
||||
@SafeVarargs
|
||||
@SuppressWarnings("varargs")
|
||||
static <E> List<E> of(E... elements) {
|
||||
Objects.requireNonNull(elements);
|
||||
switch (elements.length) {
|
||||
switch (elements.length) { // implicit null check of elements
|
||||
case 0:
|
||||
return ImmutableCollections.List0.instance();
|
||||
case 1:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1602,8 +1602,7 @@ public interface Map<K, V> {
|
||||
@SafeVarargs
|
||||
@SuppressWarnings("varargs")
|
||||
static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>... entries) {
|
||||
Objects.requireNonNull(entries);
|
||||
if (entries.length == 0) {
|
||||
if (entries.length == 0) { // implicit null check of entries
|
||||
return ImmutableCollections.Map0.instance();
|
||||
} else if (entries.length == 1) {
|
||||
return new ImmutableCollections.Map1<>(entries[0].getKey(),
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -689,8 +689,7 @@ public interface Set<E> extends Collection<E> {
|
||||
@SafeVarargs
|
||||
@SuppressWarnings("varargs")
|
||||
static <E> Set<E> of(E... elements) {
|
||||
Objects.requireNonNull(elements);
|
||||
switch (elements.length) {
|
||||
switch (elements.length) { // implicit null check of elements
|
||||
case 0:
|
||||
return ImmutableCollections.Set0.instance();
|
||||
case 1:
|
||||
|
@ -0,0 +1,312 @@
|
||||
/*
|
||||
* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
package jdk.internal.module;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import java.lang.module.Configuration;
|
||||
import java.lang.module.ResolvedModule;
|
||||
import java.net.URI;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Collections;
|
||||
import java.util.Deque;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Stream;
|
||||
import static java.util.stream.Collectors.*;
|
||||
|
||||
/**
|
||||
* A Builder to compute ModuleHashes from a given configuration
|
||||
*/
|
||||
public class ModuleHashesBuilder {
|
||||
private final Configuration configuration;
|
||||
private final Set<String> hashModuleCandidates;
|
||||
|
||||
/**
|
||||
* Constructs a ModuleHashesBuilder that finds the packaged modules
|
||||
* from the location of ModuleReference found from the given Configuration.
|
||||
*
|
||||
* @param config Configuration for building module hashes
|
||||
* @param modules the candidate modules to be hashed
|
||||
*/
|
||||
public ModuleHashesBuilder(Configuration config, Set<String> modules) {
|
||||
this.configuration = config;
|
||||
this.hashModuleCandidates = modules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map of a module M to ModuleHashes for the modules
|
||||
* that depend upon M directly or indirectly.
|
||||
*
|
||||
* The key for each entry in the returned map is a module M that has
|
||||
* no outgoing edges to any of the candidate modules to be hashed
|
||||
* i.e. M is a leaf node in a connected subgraph containing M and
|
||||
* other candidate modules from the module graph filtering
|
||||
* the outgoing edges from M to non-candidate modules.
|
||||
*/
|
||||
public Map<String, ModuleHashes> computeHashes(Set<String> roots) {
|
||||
// build a graph containing the the packaged modules and
|
||||
// its transitive dependences matching --hash-modules
|
||||
Graph.Builder<String> builder = new Graph.Builder<>();
|
||||
Deque<ResolvedModule> deque = new ArrayDeque<>(configuration.modules());
|
||||
Set<ResolvedModule> visited = new HashSet<>();
|
||||
while (!deque.isEmpty()) {
|
||||
ResolvedModule rm = deque.pop();
|
||||
if (!visited.contains(rm)) {
|
||||
visited.add(rm);
|
||||
builder.addNode(rm.name());
|
||||
for (ResolvedModule dm : rm.reads()) {
|
||||
if (!visited.contains(dm)) {
|
||||
deque.push(dm);
|
||||
}
|
||||
builder.addEdge(rm.name(), dm.name());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// each node in a transposed graph is a matching packaged module
|
||||
// in which the hash of the modules that depend upon it is recorded
|
||||
Graph<String> transposedGraph = builder.build().transpose();
|
||||
|
||||
// traverse the modules in topological order that will identify
|
||||
// the modules to record the hashes - it is the first matching
|
||||
// module and has not been hashed during the traversal.
|
||||
Set<String> mods = new HashSet<>();
|
||||
Map<String, ModuleHashes> hashes = new HashMap<>();
|
||||
builder.build()
|
||||
.orderedNodes()
|
||||
.filter(mn -> roots.contains(mn) && !mods.contains(mn))
|
||||
.forEach(mn -> {
|
||||
// Compute hashes of the modules that depend on mn directly and
|
||||
// indirectly excluding itself.
|
||||
Set<String> ns = transposedGraph.dfs(mn)
|
||||
.stream()
|
||||
.filter(n -> !n.equals(mn) && hashModuleCandidates.contains(n))
|
||||
.collect(toSet());
|
||||
mods.add(mn);
|
||||
mods.addAll(ns);
|
||||
|
||||
if (!ns.isEmpty()) {
|
||||
Map<String, Path> moduleToPath = ns.stream()
|
||||
.collect(toMap(Function.identity(), this::moduleToPath));
|
||||
hashes.put(mn, ModuleHashes.generate(moduleToPath, "SHA-256"));
|
||||
}
|
||||
});
|
||||
return hashes;
|
||||
}
|
||||
|
||||
private Path moduleToPath(String name) {
|
||||
ResolvedModule rm = configuration.findModule(name).orElseThrow(
|
||||
() -> new InternalError("Selected module " + name + " not on module path"));
|
||||
|
||||
URI uri = rm.reference().location().get();
|
||||
Path path = Paths.get(uri);
|
||||
String fn = path.getFileName().toString();
|
||||
if (!fn.endsWith(".jar") && !fn.endsWith(".jmod")) {
|
||||
throw new UnsupportedOperationException(path + " is not a modular JAR or jmod file");
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
/*
|
||||
* Utilty class
|
||||
*/
|
||||
static class Graph<T> {
|
||||
private final Set<T> nodes;
|
||||
private final Map<T, Set<T>> edges;
|
||||
|
||||
public Graph(Set<T> nodes, Map<T, Set<T>> edges) {
|
||||
this.nodes = Collections.unmodifiableSet(nodes);
|
||||
this.edges = Collections.unmodifiableMap(edges);
|
||||
}
|
||||
|
||||
public Set<T> nodes() {
|
||||
return nodes;
|
||||
}
|
||||
|
||||
public Map<T, Set<T>> edges() {
|
||||
return edges;
|
||||
}
|
||||
|
||||
public Set<T> adjacentNodes(T u) {
|
||||
return edges.get(u);
|
||||
}
|
||||
|
||||
public boolean contains(T u) {
|
||||
return nodes.contains(u);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns nodes sorted in topological order.
|
||||
*/
|
||||
public Stream<T> orderedNodes() {
|
||||
TopoSorter<T> sorter = new TopoSorter<>(this);
|
||||
return sorter.result.stream();
|
||||
}
|
||||
|
||||
/**
|
||||
* Traverse this graph and performs the given action in topological order
|
||||
*/
|
||||
public void ordered(Consumer<T> action) {
|
||||
TopoSorter<T> sorter = new TopoSorter<>(this);
|
||||
sorter.ordered(action);
|
||||
}
|
||||
|
||||
/**
|
||||
* Traverses this graph and performs the given action in reverse topological order
|
||||
*/
|
||||
public void reverse(Consumer<T> action) {
|
||||
TopoSorter<T> sorter = new TopoSorter<>(this);
|
||||
sorter.reverse(action);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a transposed graph from this graph
|
||||
*/
|
||||
public Graph<T> transpose() {
|
||||
Builder<T> builder = new Builder<>();
|
||||
nodes.stream().forEach(builder::addNode);
|
||||
// reverse edges
|
||||
edges.keySet().forEach(u -> {
|
||||
edges.get(u).stream()
|
||||
.forEach(v -> builder.addEdge(v, u));
|
||||
});
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all nodes reachable from the given root.
|
||||
*/
|
||||
public Set<T> dfs(T root) {
|
||||
return dfs(Set.of(root));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all nodes reachable from the given set of roots.
|
||||
*/
|
||||
public Set<T> dfs(Set<T> roots) {
|
||||
Deque<T> deque = new LinkedList<>(roots);
|
||||
Set<T> visited = new HashSet<>();
|
||||
while (!deque.isEmpty()) {
|
||||
T u = deque.pop();
|
||||
if (!visited.contains(u)) {
|
||||
visited.add(u);
|
||||
if (contains(u)) {
|
||||
adjacentNodes(u).stream()
|
||||
.filter(v -> !visited.contains(v))
|
||||
.forEach(deque::push);
|
||||
}
|
||||
}
|
||||
}
|
||||
return visited;
|
||||
}
|
||||
|
||||
public void printGraph(PrintStream out) {
|
||||
out.println("graph for " + nodes);
|
||||
nodes.stream()
|
||||
.forEach(u -> adjacentNodes(u).stream()
|
||||
.forEach(v -> out.format(" %s -> %s%n", u, v)));
|
||||
}
|
||||
|
||||
static class Builder<T> {
|
||||
final Set<T> nodes = new HashSet<>();
|
||||
final Map<T, Set<T>> edges = new HashMap<>();
|
||||
|
||||
public void addNode(T node) {
|
||||
if (nodes.contains(node)) {
|
||||
return;
|
||||
}
|
||||
nodes.add(node);
|
||||
edges.computeIfAbsent(node, _e -> new HashSet<>());
|
||||
}
|
||||
|
||||
public void addEdge(T u, T v) {
|
||||
addNode(u);
|
||||
addNode(v);
|
||||
edges.get(u).add(v);
|
||||
}
|
||||
|
||||
public Graph<T> build() {
|
||||
return new Graph<T>(nodes, edges);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Topological sort
|
||||
*/
|
||||
private static class TopoSorter<T> {
|
||||
final Deque<T> result = new LinkedList<>();
|
||||
final Deque<T> nodes;
|
||||
final Graph<T> graph;
|
||||
|
||||
TopoSorter(Graph<T> graph) {
|
||||
this.graph = graph;
|
||||
this.nodes = new LinkedList<>(graph.nodes);
|
||||
sort();
|
||||
}
|
||||
|
||||
public void ordered(Consumer<T> action) {
|
||||
result.iterator().forEachRemaining(action);
|
||||
}
|
||||
|
||||
public void reverse(Consumer<T> action) {
|
||||
result.descendingIterator().forEachRemaining(action);
|
||||
}
|
||||
|
||||
private void sort() {
|
||||
Deque<T> visited = new LinkedList<>();
|
||||
Deque<T> done = new LinkedList<>();
|
||||
T node;
|
||||
while ((node = nodes.poll()) != null) {
|
||||
if (!visited.contains(node)) {
|
||||
visit(node, visited, done);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void visit(T node, Deque<T> visited, Deque<T> done) {
|
||||
if (visited.contains(node)) {
|
||||
if (!done.contains(node)) {
|
||||
throw new IllegalArgumentException("Cyclic detected: " +
|
||||
node + " " + graph.edges().get(node));
|
||||
}
|
||||
return;
|
||||
}
|
||||
visited.add(node);
|
||||
graph.edges().get(node).stream()
|
||||
.forEach(x -> visit(x, visited, done));
|
||||
done.add(node);
|
||||
result.addLast(node);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -64,10 +64,10 @@ DEF_JNI_OnLoad(JavaVM *vm, void *reserved)
|
||||
preferIPv4Stack = (*env)->CallStaticBooleanMethod(env, iCls, mid, s);
|
||||
|
||||
/*
|
||||
Since we have initialized and loaded the Socket library we will
|
||||
check now to whether we have IPv6 on this platform and if the
|
||||
supporting socket APIs are available
|
||||
*/
|
||||
* Since we have initialized and loaded the socket library we will
|
||||
* check now whether we have IPv6 on this platform and if the
|
||||
* supporting socket APIs are available
|
||||
*/
|
||||
IPv6_available = IPv6_supported() & (!preferIPv4Stack);
|
||||
|
||||
/* check if SO_REUSEPORT is supported on this platform */
|
||||
@ -120,16 +120,16 @@ jboolean setInet6Address_scopeifname(JNIEnv *env, jobject iaObj, jobject scopeif
|
||||
return JNI_TRUE;
|
||||
}
|
||||
|
||||
int getInet6Address_scopeid_set(JNIEnv *env, jobject iaObj) {
|
||||
jboolean getInet6Address_scopeid_set(JNIEnv *env, jobject iaObj) {
|
||||
jobject holder = (*env)->GetObjectField(env, iaObj, ia6_holder6ID);
|
||||
CHECK_NULL_RETURN(holder, -1);
|
||||
CHECK_NULL_RETURN(holder, JNI_FALSE);
|
||||
return (*env)->GetBooleanField(env, holder, ia6_scopeidsetID);
|
||||
}
|
||||
|
||||
int getInet6Address_scopeid(JNIEnv *env, jobject iaObj) {
|
||||
unsigned int getInet6Address_scopeid(JNIEnv *env, jobject iaObj) {
|
||||
jobject holder = (*env)->GetObjectField(env, iaObj, ia6_holder6ID);
|
||||
CHECK_NULL_RETURN(holder, -1);
|
||||
return (*env)->GetIntField(env, holder, ia6_scopeidID);
|
||||
CHECK_NULL_RETURN(holder, 0);
|
||||
return (unsigned int)(*env)->GetIntField(env, holder, ia6_scopeidID);
|
||||
}
|
||||
|
||||
jboolean setInet6Address_scopeid(JNIEnv *env, jobject iaObj, int scopeid) {
|
||||
@ -201,11 +201,10 @@ jobject getInetAddress_hostName(JNIEnv *env, jobject iaObj) {
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
|
||||
NET_SockaddrToInetAddress(JNIEnv *env, SOCKETADDRESS *sa, int *port) {
|
||||
jobject iaObj;
|
||||
if (him->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
jbyte *caddr = (jbyte *)&(him6->sin6_addr);
|
||||
if (sa->sa.sa_family == AF_INET6) {
|
||||
jbyte *caddr = (jbyte *)&sa->sa6.sin6_addr;
|
||||
if (NET_IsIPv4Mapped(caddr)) {
|
||||
int address;
|
||||
iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
|
||||
@ -214,42 +213,35 @@ NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port) {
|
||||
setInetAddress_addr(env, iaObj, address);
|
||||
setInetAddress_family(env, iaObj, java_net_InetAddress_IPv4);
|
||||
} else {
|
||||
jint scope;
|
||||
jboolean ret;
|
||||
iaObj = (*env)->NewObject(env, ia6_class, ia6_ctrID);
|
||||
CHECK_NULL_RETURN(iaObj, NULL);
|
||||
ret = setInet6Address_ipaddress(env, iaObj, (char *)&(him6->sin6_addr));
|
||||
ret = setInet6Address_ipaddress(env, iaObj, (char *)&sa->sa6.sin6_addr);
|
||||
if (ret == JNI_FALSE)
|
||||
return NULL;
|
||||
setInetAddress_family(env, iaObj, java_net_InetAddress_IPv6);
|
||||
scope = getScopeID(him);
|
||||
setInet6Address_scopeid(env, iaObj, scope);
|
||||
setInet6Address_scopeid(env, iaObj, sa->sa6.sin6_scope_id);
|
||||
}
|
||||
*port = ntohs(him6->sin6_port);
|
||||
*port = ntohs(sa->sa6.sin6_port);
|
||||
} else {
|
||||
struct sockaddr_in *him4 = (struct sockaddr_in *)him;
|
||||
iaObj = (*env)->NewObject(env, ia4_class, ia4_ctrID);
|
||||
CHECK_NULL_RETURN(iaObj, NULL);
|
||||
setInetAddress_family(env, iaObj, java_net_InetAddress_IPv4);
|
||||
setInetAddress_addr(env, iaObj, ntohl(him4->sin_addr.s_addr));
|
||||
*port = ntohs(him4->sin_port);
|
||||
setInetAddress_addr(env, iaObj, ntohl(sa->sa4.sin_addr.s_addr));
|
||||
*port = ntohs(sa->sa4.sin_port);
|
||||
}
|
||||
return iaObj;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
|
||||
JNIEXPORT jboolean JNICALL
|
||||
NET_SockaddrEqualsInetAddress(JNIEnv *env, SOCKETADDRESS *sa, jobject iaObj)
|
||||
{
|
||||
jint family = AF_INET;
|
||||
|
||||
family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ?
|
||||
AF_INET : AF_INET6;
|
||||
if (him->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
jbyte *caddrNew = (jbyte *)&(him6->sin6_addr);
|
||||
jint family = getInetAddress_family(env, iaObj) ==
|
||||
java_net_InetAddress_IPv4 ? AF_INET : AF_INET6;
|
||||
if (sa->sa.sa_family == AF_INET6) {
|
||||
jbyte *caddrNew = (jbyte *)&sa->sa6.sin6_addr;
|
||||
if (NET_IsIPv4Mapped(caddrNew)) {
|
||||
int addrNew;
|
||||
int addrCur;
|
||||
int addrNew, addrCur;
|
||||
if (family == AF_INET6) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
@ -262,26 +254,24 @@ NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
|
||||
}
|
||||
} else {
|
||||
jbyte caddrCur[16];
|
||||
int scope;
|
||||
|
||||
if (family == AF_INET) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
scope = getInet6Address_scopeid(env, iaObj);
|
||||
getInet6Address_ipaddress(env, iaObj, (char *)caddrCur);
|
||||
if (NET_IsEqual(caddrNew, caddrCur) && cmpScopeID(scope, him)) {
|
||||
if (NET_IsEqual(caddrNew, caddrCur) &&
|
||||
sa->sa6.sin6_scope_id == getInet6Address_scopeid(env, iaObj))
|
||||
{
|
||||
return JNI_TRUE;
|
||||
} else {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
struct sockaddr_in *him4 = (struct sockaddr_in *)him;
|
||||
int addrNew, addrCur;
|
||||
if (family != AF_INET) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
addrNew = ntohl(him4->sin_addr.s_addr);
|
||||
addrNew = ntohl(sa->sa4.sin_addr.s_addr);
|
||||
addrCur = getInetAddress_addr(env, iaObj);
|
||||
if (addrNew == addrCur) {
|
||||
return JNI_TRUE;
|
||||
@ -291,6 +281,15 @@ NET_SockaddrEqualsInetAddress(JNIEnv *env, struct sockaddr *him, jobject iaObj)
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
NET_GetPortFromSockaddr(SOCKETADDRESS *sa) {
|
||||
if (sa->sa.sa_family == AF_INET6) {
|
||||
return ntohs(sa->sa6.sin6_port);
|
||||
} else {
|
||||
return ntohs(sa->sa4.sin_port);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned short
|
||||
in_cksum(unsigned short *addr, int len) {
|
||||
int nleft = len;
|
||||
|
@ -63,8 +63,8 @@ JNIEXPORT void JNICALL initInetAddressIDs(JNIEnv *env);
|
||||
*/
|
||||
extern jobject getInet6Address_scopeifname(JNIEnv *env, jobject ia6Obj);
|
||||
extern jboolean setInet6Address_scopeifname(JNIEnv *env, jobject ia6Obj, jobject scopeifname);
|
||||
extern int getInet6Address_scopeid_set(JNIEnv *env, jobject ia6Obj);
|
||||
extern int getInet6Address_scopeid(JNIEnv *env, jobject ia6Obj);
|
||||
extern jboolean getInet6Address_scopeid_set(JNIEnv *env, jobject ia6Obj);
|
||||
extern unsigned int getInet6Address_scopeid(JNIEnv *env, jobject ia6Obj);
|
||||
extern jboolean setInet6Address_scopeid(JNIEnv *env, jobject ia6Obj, int scopeid);
|
||||
extern jboolean getInet6Address_ipaddress(JNIEnv *env, jobject ia6Obj, char *dest);
|
||||
extern jboolean setInet6Address_ipaddress(JNIEnv *env, jobject ia6Obj, char *address);
|
||||
@ -132,24 +132,41 @@ JNIEXPORT jint JNICALL ipv6_available();
|
||||
|
||||
JNIEXPORT jint JNICALL reuseport_available();
|
||||
|
||||
/**
|
||||
* This function will fill a SOCKETADDRESS structure from an InetAddress
|
||||
* object.
|
||||
*
|
||||
* The parameter 'sa' must point to valid storage of size
|
||||
* 'sizeof(SOCKETADDRESS)'.
|
||||
*
|
||||
* The parameter 'len' is a pointer to an int and is used for returning
|
||||
* the actual sockaddr length, e.g. 'sizeof(struct sockaddr_in)' or
|
||||
* 'sizeof(struct sockaddr_in6)'.
|
||||
*
|
||||
* If the type of the InetAddress object is IPv6, the function will fill a
|
||||
* sockaddr_in6 structure. IPv6 must be available in that case, otherwise an
|
||||
* exception is thrown.
|
||||
* In the case of an IPv4 InetAddress, when IPv6 is available and
|
||||
* v4MappedAddress is TRUE, this method will fill a sockaddr_in6 structure
|
||||
* containing an IPv4 mapped IPv6 address. Otherwise a sockaddr_in
|
||||
* structure will be filled.
|
||||
*/
|
||||
JNIEXPORT int JNICALL
|
||||
NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
|
||||
struct sockaddr *him, int *len,
|
||||
SOCKETADDRESS *sa, int *len,
|
||||
jboolean v4MappedAddress);
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
NET_SockaddrToInetAddress(JNIEnv *env, struct sockaddr *him, int *port);
|
||||
NET_SockaddrToInetAddress(JNIEnv *env, SOCKETADDRESS *sa, int *port);
|
||||
|
||||
void platformInit();
|
||||
|
||||
void parseExclusiveBindProperty(JNIEnv *env);
|
||||
|
||||
void NET_SetTrafficClass(struct sockaddr *him, int trafficClass);
|
||||
JNIEXPORT jint JNICALL NET_GetPortFromSockaddr(SOCKETADDRESS *sa);
|
||||
|
||||
JNIEXPORT jint JNICALL NET_GetPortFromSockaddr(struct sockaddr *him);
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
NET_SockaddrEqualsInetAddress(JNIEnv *env,struct sockaddr *him, jobject iaObj);
|
||||
JNIEXPORT jboolean JNICALL
|
||||
NET_SockaddrEqualsInetAddress(JNIEnv *env, SOCKETADDRESS *sa, jobject iaObj);
|
||||
|
||||
int NET_IsIPv4Mapped(jbyte* caddr);
|
||||
|
||||
@ -172,7 +189,7 @@ JNIEXPORT int JNICALL
|
||||
NET_SetSockOpt(int fd, int level, int opt, const void *arg, int len);
|
||||
|
||||
JNIEXPORT int JNICALL
|
||||
NET_Bind(int fd, struct sockaddr *him, int len);
|
||||
NET_Bind(int fd, SOCKETADDRESS *sa, int len);
|
||||
|
||||
JNIEXPORT int JNICALL
|
||||
NET_MapSocketOption(jint cmd, int *level, int *optname);
|
||||
@ -183,10 +200,6 @@ NET_MapSocketOptionV6(jint cmd, int *level, int *optname);
|
||||
JNIEXPORT jint JNICALL
|
||||
NET_EnableFastTcpLoopback(int fd);
|
||||
|
||||
int getScopeID(struct sockaddr *);
|
||||
|
||||
int cmpScopeID(unsigned int, struct sockaddr *);
|
||||
|
||||
unsigned short in_cksum(unsigned short *addr, int len);
|
||||
|
||||
jint NET_Wait(JNIEnv *env, jint fd, jint flags, jint timeout);
|
||||
|
@ -211,7 +211,8 @@ lookupIfLocalhost(JNIEnv *env, const char *hostname, jboolean includeV6)
|
||||
{
|
||||
int port;
|
||||
int index = (family == AF_INET) ? i++ : j++;
|
||||
jobject o = NET_SockaddrToInetAddress(env, iter->ifa_addr, &port);
|
||||
jobject o = NET_SockaddrToInetAddress(env,
|
||||
(SOCKETADDRESS *)iter->ifa_addr, &port);
|
||||
if (!o) {
|
||||
freeifaddrs(ifa);
|
||||
if (!(*env)->ExceptionCheck(env))
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -791,7 +791,7 @@ static netif *enumInterfaces(JNIEnv *env) {
|
||||
int sock;
|
||||
|
||||
sock = openSocket(env, AF_INET);
|
||||
if (sock < 0 && (*env)->ExceptionOccurred(env)) {
|
||||
if (sock < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -809,7 +809,7 @@ static netif *enumInterfaces(JNIEnv *env) {
|
||||
// so we have to call ipv6_available()
|
||||
if (ipv6_available()) {
|
||||
sock = openSocket(env, AF_INET6);
|
||||
if (sock < 0 && (*env)->ExceptionOccurred(env)) {
|
||||
if (sock < 0) {
|
||||
freeif(ifs);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -99,7 +99,7 @@ static jobject createInteger(JNIEnv *env, int i) {
|
||||
CHECK_NULL_RETURN(i_class, NULL);
|
||||
}
|
||||
|
||||
return ( (*env)->NewObject(env, i_class, i_ctrID, i) );
|
||||
return (*env)->NewObject(env, i_class, i_ctrID, i);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -118,10 +118,9 @@ static jobject createBoolean(JNIEnv *env, int b) {
|
||||
CHECK_NULL_RETURN(b_class, NULL);
|
||||
}
|
||||
|
||||
return( (*env)->NewObject(env, b_class, b_ctrID, (jboolean)(b!=0)) );
|
||||
return (*env)->NewObject(env, b_class, b_ctrID, (jboolean)(b != 0));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns the fd for a PlainDatagramSocketImpl or -1
|
||||
* if closed.
|
||||
@ -134,7 +133,6 @@ static int getFD(JNIEnv *env, jobject this) {
|
||||
return (*env)->GetIntField(env, fdObj, IO_fd_fdID);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class: java_net_PlainDatagramSocketImpl
|
||||
* Method: init
|
||||
@ -166,7 +164,6 @@ Java_java_net_PlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
|
||||
initInetAddressIDs(env);
|
||||
JNU_CHECK_EXCEPTION(env);
|
||||
Java_java_net_NetworkInterface_init(env, 0);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -176,13 +173,13 @@ Java_java_net_PlainDatagramSocketImpl_init(JNIEnv *env, jclass cls) {
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_net_PlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
jint localport, jobject iaObj) {
|
||||
jint localport, jobject iaObj) {
|
||||
/* fdObj is the FileDescriptor field on this */
|
||||
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
|
||||
/* fd is an int field on fdObj */
|
||||
int fd;
|
||||
int len = 0;
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
socklen_t slen = sizeof(SOCKETADDRESS);
|
||||
|
||||
if (IS_NULL(fdObj)) {
|
||||
@ -199,12 +196,13 @@ Java_java_net_PlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
}
|
||||
|
||||
/* bind */
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, localport, &him.sa, &len, JNI_TRUE) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, localport, &sa, &len,
|
||||
JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
setDefaultScopeID(env, &him.sa);
|
||||
setDefaultScopeID(env, &sa.sa);
|
||||
|
||||
if (NET_Bind(fd, &him.sa, len) < 0) {
|
||||
if (NET_Bind(fd, &sa, len) < 0) {
|
||||
if (errno == EADDRINUSE || errno == EADDRNOTAVAIL ||
|
||||
errno == EPERM || errno == EACCES) {
|
||||
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "BindException",
|
||||
@ -221,13 +219,13 @@ Java_java_net_PlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
/* Now that we're a connected socket, let's extract the port number
|
||||
* that the system chose for us and store it in the Socket object.
|
||||
*/
|
||||
if (getsockname(fd, &him.sa, &slen) == -1) {
|
||||
if (getsockname(fd, &sa.sa, &slen) == -1) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
|
||||
return;
|
||||
}
|
||||
|
||||
localport = NET_GetPortFromSockaddr(&him.sa);
|
||||
localport = NET_GetPortFromSockaddr(&sa);
|
||||
|
||||
(*env)->SetIntField(env, this, pdsi_localPortID, localport);
|
||||
} else {
|
||||
@ -263,7 +261,8 @@ Java_java_net_PlainDatagramSocketImpl_connect0(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, address, port, &rmtaddr.sa, &len, JNI_TRUE) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, address, port, &rmtaddr, &len,
|
||||
JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -290,6 +289,9 @@ Java_java_net_PlainDatagramSocketImpl_disconnect0(JNIEnv *env, jobject this, jin
|
||||
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
|
||||
SOCKETADDRESS addr;
|
||||
socklen_t len;
|
||||
#if defined(__linux__)
|
||||
int localPort = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (IS_NULL(fdObj)) {
|
||||
@ -298,32 +300,31 @@ Java_java_net_PlainDatagramSocketImpl_disconnect0(JNIEnv *env, jobject this, jin
|
||||
fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
|
||||
|
||||
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
if (ipv6_available()) {
|
||||
addr.sa6.sin6_family = AF_UNSPEC;
|
||||
len = sizeof(struct sockaddr_in6);
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
if (ipv6_available()) {
|
||||
addr.sa6.sin6_family = AF_UNSPEC;
|
||||
len = sizeof(struct sockaddr_in6);
|
||||
} else {
|
||||
addr.sa4.sin_family = AF_UNSPEC;
|
||||
len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
NET_Connect(fd, &addr.sa, len);
|
||||
|
||||
#if defined(__linux__)
|
||||
if (getsockname(fd, &addr.sa, &len) == -1)
|
||||
return;
|
||||
|
||||
localPort = NET_GetPortFromSockaddr(&addr);
|
||||
if (localPort == 0) {
|
||||
localPort = (*env)->GetIntField(env, this, pdsi_localPortID);
|
||||
if (addr.sa.sa_family == AF_INET6) {
|
||||
addr.sa6.sin6_port = htons(localPort);
|
||||
} else {
|
||||
addr.sa4.sin_family = AF_UNSPEC;
|
||||
len = sizeof(struct sockaddr_in);
|
||||
addr.sa4.sin_port = htons(localPort);
|
||||
}
|
||||
NET_Connect(fd, &addr.sa, len);
|
||||
|
||||
#ifdef __linux__
|
||||
int localPort = 0;
|
||||
if (getsockname(fd, &addr.sa, &len) == -1)
|
||||
return;
|
||||
|
||||
localPort = NET_GetPortFromSockaddr(&addr.sa);
|
||||
if (localPort == 0) {
|
||||
localPort = (*env)->GetIntField(env, this, pdsi_localPortID);
|
||||
if (addr.sa.sa_family == AF_INET6) {
|
||||
addr.sa6.sin6_port = htons(localPort);
|
||||
} else {
|
||||
addr.sa4.sin_port = htons(localPort);
|
||||
}
|
||||
|
||||
NET_Bind(fd, &addr.sa, len);
|
||||
}
|
||||
NET_Bind(fd, &addr, len);
|
||||
}
|
||||
|
||||
#endif
|
||||
#else
|
||||
@ -355,8 +356,9 @@ Java_java_net_PlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
/* The fdObj'fd */
|
||||
jint fd;
|
||||
|
||||
SOCKETADDRESS rmtaddr, *rmtaddrP = &rmtaddr;
|
||||
int len;
|
||||
SOCKETADDRESS rmtaddr;
|
||||
struct sockaddr *rmtaddrP = 0;
|
||||
int len = 0;
|
||||
|
||||
if (IS_NULL(fdObj)) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
@ -382,15 +384,14 @@ Java_java_net_PlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
packetBufferOffset = (*env)->GetIntField(env, packet, dp_offsetID);
|
||||
packetBufferLen = (*env)->GetIntField(env, packet, dp_lengthID);
|
||||
|
||||
if (connected) {
|
||||
/* arg to NET_Sendto () null in this case */
|
||||
len = 0;
|
||||
rmtaddrP = 0;
|
||||
} else {
|
||||
// arg to NET_Sendto() null, if connected
|
||||
if (!connected) {
|
||||
packetPort = (*env)->GetIntField(env, packet, dp_portID);
|
||||
if (NET_InetAddressToSockaddr(env, packetAddress, packetPort, &rmtaddr.sa, &len, JNI_TRUE) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, packetAddress, packetPort, &rmtaddr,
|
||||
&len, JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
rmtaddrP = &rmtaddr.sa;
|
||||
}
|
||||
setDefaultScopeID(env, &rmtaddr.sa);
|
||||
|
||||
@ -427,7 +428,7 @@ Java_java_net_PlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
(*env)->GetByteArrayRegion(env, packetBuffer, packetBufferOffset, packetBufferLen,
|
||||
(jbyte *)fullPacket);
|
||||
if (trafficClass != 0 && ipv6_available()) {
|
||||
NET_SetTrafficClass(&rmtaddr.sa, trafficClass);
|
||||
NET_SetTrafficClass(&rmtaddr, trafficClass);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -437,8 +438,7 @@ Java_java_net_PlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
* ECONNREFUSED indicating that an ICMP port unreachable has
|
||||
* received.
|
||||
*/
|
||||
ret = NET_SendTo(fd, fullPacket, packetBufferLen, 0,
|
||||
(struct sockaddr *)rmtaddrP, len);
|
||||
ret = NET_SendTo(fd, fullPacket, packetBufferLen, 0, rmtaddrP, len);
|
||||
|
||||
if (ret < 0) {
|
||||
if (errno == ECONNREFUSED) {
|
||||
@ -510,7 +510,7 @@ Java_java_net_PlainDatagramSocketImpl_peek(JNIEnv *env, jobject this,
|
||||
#ifdef __solaris__
|
||||
if (errno == ECONNREFUSED) {
|
||||
int orig_errno = errno;
|
||||
(void) recv(fd, buf, 1, 0);
|
||||
recv(fd, buf, 1, 0);
|
||||
errno = orig_errno;
|
||||
}
|
||||
#endif
|
||||
@ -528,7 +528,7 @@ Java_java_net_PlainDatagramSocketImpl_peek(JNIEnv *env, jobject this,
|
||||
return 0;
|
||||
}
|
||||
|
||||
iaObj = NET_SockaddrToInetAddress(env, &rmtaddr.sa, &port);
|
||||
iaObj = NET_SockaddrToInetAddress(env, &rmtaddr, &port);
|
||||
family = getInetAddress_family(env, iaObj) == java_net_InetAddress_IPv4 ?
|
||||
AF_INET : AF_INET6;
|
||||
if (family == AF_INET) { /* this API can't handle IPV6 addresses */
|
||||
@ -676,18 +676,18 @@ Java_java_net_PlainDatagramSocketImpl_peekData(JNIEnv *env, jobject this,
|
||||
*/
|
||||
packetAddress = (*env)->GetObjectField(env, packet, dp_addressID);
|
||||
if (packetAddress != NULL) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr.sa, packetAddress)) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr, packetAddress)) {
|
||||
/* force a new InetAddress to be created */
|
||||
packetAddress = NULL;
|
||||
}
|
||||
}
|
||||
if (packetAddress == NULL) {
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr.sa, &port);
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr, &port);
|
||||
/* stuff the new Inetaddress in the packet */
|
||||
(*env)->SetObjectField(env, packet, dp_addressID, packetAddress);
|
||||
} else {
|
||||
/* only get the new port number */
|
||||
port = NET_GetPortFromSockaddr(&rmtaddr.sa);
|
||||
port = NET_GetPortFromSockaddr(&rmtaddr);
|
||||
}
|
||||
/* and fill in the data, remote address/port and such */
|
||||
(*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, n,
|
||||
@ -857,18 +857,19 @@ Java_java_net_PlainDatagramSocketImpl_receive0(JNIEnv *env, jobject this,
|
||||
*/
|
||||
packetAddress = (*env)->GetObjectField(env, packet, dp_addressID);
|
||||
if (packetAddress != NULL) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr.sa, packetAddress)) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &rmtaddr,
|
||||
packetAddress)) {
|
||||
/* force a new InetAddress to be created */
|
||||
packetAddress = NULL;
|
||||
}
|
||||
}
|
||||
if (packetAddress == NULL) {
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr.sa, &port);
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &rmtaddr, &port);
|
||||
/* stuff the new Inetaddress in the packet */
|
||||
(*env)->SetObjectField(env, packet, dp_addressID, packetAddress);
|
||||
} else {
|
||||
/* only get the new port number */
|
||||
port = NET_GetPortFromSockaddr(&rmtaddr.sa);
|
||||
port = NET_GetPortFromSockaddr(&rmtaddr);
|
||||
}
|
||||
/* and fill in the data, remote address/port and such */
|
||||
(*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, n,
|
||||
@ -1040,6 +1041,7 @@ static void mcast_set_if_by_if_v4(JNIEnv *env, jobject this, int fd, jobject val
|
||||
/*
|
||||
* We need an ipv4 address here
|
||||
*/
|
||||
in.s_addr = 0;
|
||||
for (i = 0; i < len; i++) {
|
||||
addr = (*env)->GetObjectArrayElement(env, addrArray, i);
|
||||
if (getInetAddress_family(env, addr) == java_net_InetAddress_IPv4) {
|
||||
@ -1049,7 +1051,7 @@ static void mcast_set_if_by_if_v4(JNIEnv *env, jobject this, int fd, jobject val
|
||||
}
|
||||
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
|
||||
(const char*)&in, sizeof(in)) < 0) {
|
||||
(const char *)&in, sizeof(in)) < 0) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
|
||||
}
|
||||
@ -1670,17 +1672,17 @@ Java_java_net_PlainDatagramSocketImpl_socketGetOption
|
||||
*/
|
||||
if (opt == java_net_SocketOptions_SO_BINDADDR) {
|
||||
/* find out local IP address */
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
socklen_t len = sizeof(SOCKETADDRESS);
|
||||
int port;
|
||||
jobject iaObj;
|
||||
|
||||
if (getsockname(fd, &him.sa, &len) == -1) {
|
||||
if (getsockname(fd, &sa.sa, &len) == -1) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
|
||||
return NULL;
|
||||
}
|
||||
iaObj = NET_SockaddrToInetAddress(env, &him.sa, &port);
|
||||
iaObj = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
|
||||
return iaObj;
|
||||
}
|
||||
@ -1969,6 +1971,7 @@ static void mcast_join_leave(JNIEnv *env, jobject this,
|
||||
mname.imr_multiaddr.s_addr = htonl(getInetAddress_addr(env, iaObj));
|
||||
#ifdef __linux__
|
||||
mname.imr_address.s_addr = htonl(getInetAddress_addr(env, addr));
|
||||
mname.imr_ifindex = 0;
|
||||
#else
|
||||
mname.imr_interface.s_addr = htonl(getInetAddress_addr(env, addr));
|
||||
#endif
|
||||
@ -2023,7 +2026,7 @@ static void mcast_join_leave(JNIEnv *env, jobject this,
|
||||
|
||||
#ifdef __linux__
|
||||
mname.imr_address.s_addr = in.s_addr;
|
||||
|
||||
mname.imr_ifindex = 0;
|
||||
#else
|
||||
mname.imr_interface.s_addr = in.s_addr;
|
||||
#endif
|
||||
|
@ -244,7 +244,7 @@ Java_java_net_PlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
/* fd is an int field on iaObj */
|
||||
jint fd;
|
||||
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
/* The result of the connection */
|
||||
int connect_rv = -1;
|
||||
|
||||
@ -260,17 +260,18 @@ Java_java_net_PlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
}
|
||||
|
||||
/* connect */
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &him.sa, &len, JNI_TRUE) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &sa, &len,
|
||||
JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
setDefaultScopeID(env, &him.sa);
|
||||
setDefaultScopeID(env, &sa.sa);
|
||||
|
||||
if (trafficClass != 0 && ipv6_available()) {
|
||||
NET_SetTrafficClass(&him.sa, trafficClass);
|
||||
NET_SetTrafficClass(&sa, trafficClass);
|
||||
}
|
||||
|
||||
if (timeout <= 0) {
|
||||
connect_rv = NET_Connect(fd, &him.sa, len);
|
||||
connect_rv = NET_Connect(fd, &sa.sa, len);
|
||||
#ifdef __solaris__
|
||||
if (connect_rv == -1 && errno == EINPROGRESS ) {
|
||||
|
||||
@ -319,7 +320,7 @@ Java_java_net_PlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
SET_NONBLOCKING(fd);
|
||||
|
||||
/* no need to use NET_Connect as non-blocking */
|
||||
connect_rv = connect(fd, &him.sa, len);
|
||||
connect_rv = connect(fd, &sa.sa, len);
|
||||
|
||||
/* connection not established immediately */
|
||||
if (connect_rv != 0) {
|
||||
@ -467,11 +468,11 @@ Java_java_net_PlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
* that the system chose for us and store it in the Socket object.
|
||||
*/
|
||||
socklen_t slen = sizeof(SOCKETADDRESS);
|
||||
if (getsockname(fd, &him.sa, &slen) == -1) {
|
||||
if (getsockname(fd, &sa.sa, &slen) == -1) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
|
||||
} else {
|
||||
localport = NET_GetPortFromSockaddr(&him.sa);
|
||||
localport = NET_GetPortFromSockaddr(&sa);
|
||||
(*env)->SetIntField(env, this, psi_localportID, localport);
|
||||
}
|
||||
}
|
||||
@ -490,8 +491,8 @@ Java_java_net_PlainSocketImpl_socketBind(JNIEnv *env, jobject this,
|
||||
jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
|
||||
/* fd is an int field on fdObj */
|
||||
int fd;
|
||||
int len;
|
||||
SOCKETADDRESS him;
|
||||
int len = 0;
|
||||
SOCKETADDRESS sa;
|
||||
|
||||
if (IS_NULL(fdObj)) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
@ -506,13 +507,13 @@ Java_java_net_PlainSocketImpl_socketBind(JNIEnv *env, jobject this,
|
||||
}
|
||||
|
||||
/* bind */
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, localport, &him.sa,
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, localport, &sa,
|
||||
&len, JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
setDefaultScopeID(env, &him.sa);
|
||||
setDefaultScopeID(env, &sa.sa);
|
||||
|
||||
if (NET_Bind(fd, &him.sa, len) < 0) {
|
||||
if (NET_Bind(fd, &sa, len) < 0) {
|
||||
if (errno == EADDRINUSE || errno == EADDRNOTAVAIL ||
|
||||
errno == EPERM || errno == EACCES) {
|
||||
NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "BindException",
|
||||
@ -533,12 +534,12 @@ Java_java_net_PlainSocketImpl_socketBind(JNIEnv *env, jobject this,
|
||||
/* Now that we're a connected socket, let's extract the port number
|
||||
* that the system chose for us and store it in the Socket object.
|
||||
*/
|
||||
if (getsockname(fd, &him.sa, &slen) == -1) {
|
||||
if (getsockname(fd, &sa.sa, &slen) == -1) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
|
||||
return;
|
||||
}
|
||||
localport = NET_GetPortFromSockaddr(&him.sa);
|
||||
localport = NET_GetPortFromSockaddr(&sa);
|
||||
(*env)->SetIntField(env, this, psi_localportID, localport);
|
||||
} else {
|
||||
(*env)->SetIntField(env, this, psi_localportID, localport);
|
||||
@ -606,7 +607,7 @@ Java_java_net_PlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
/* accepted fd */
|
||||
jint newfd;
|
||||
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
socklen_t slen = sizeof(SOCKETADDRESS);
|
||||
|
||||
if (IS_NULL(fdObj)) {
|
||||
@ -661,7 +662,7 @@ Java_java_net_PlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
|
||||
newfd = NET_Accept(fd, &him.sa, &slen);
|
||||
newfd = NET_Accept(fd, &sa.sa, &slen);
|
||||
|
||||
/* connection accepted */
|
||||
if (newfd >= 0) {
|
||||
@ -709,7 +710,7 @@ Java_java_net_PlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
/*
|
||||
* fill up the remote peer port and address in the new socket structure.
|
||||
*/
|
||||
socketAddressObj = NET_SockaddrToInetAddress(env, &him.sa, &port);
|
||||
socketAddressObj = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
if (socketAddressObj == NULL) {
|
||||
/* should be pending exception */
|
||||
close(newfd);
|
||||
@ -944,19 +945,19 @@ Java_java_net_PlainSocketImpl_socketGetOption
|
||||
* SO_BINDADDR isn't a socket option
|
||||
*/
|
||||
if (cmd == java_net_SocketOptions_SO_BINDADDR) {
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
socklen_t len = sizeof(SOCKETADDRESS);
|
||||
int port;
|
||||
jobject iaObj;
|
||||
jclass iaCntrClass;
|
||||
jfieldID iaFieldID;
|
||||
|
||||
if (getsockname(fd, &him.sa, &len) < 0) {
|
||||
if (getsockname(fd, &sa.sa, &len) < 0) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
|
||||
return -1;
|
||||
}
|
||||
iaObj = NET_SockaddrToInetAddress(env, &him.sa, &port);
|
||||
iaObj = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
CHECK_NULL_RETURN(iaObj, -1);
|
||||
|
||||
iaCntrClass = (*env)->GetObjectClass(env, iaContainerObj);
|
||||
|
@ -234,29 +234,6 @@ int kernelIsV24 () {
|
||||
}
|
||||
return kernelV24;
|
||||
}
|
||||
|
||||
int getScopeID (struct sockaddr *him) {
|
||||
struct sockaddr_in6 *hext = (struct sockaddr_in6 *)him;
|
||||
return hext->sin6_scope_id;
|
||||
}
|
||||
|
||||
int cmpScopeID (unsigned int scope, struct sockaddr *him) {
|
||||
struct sockaddr_in6 *hext = (struct sockaddr_in6 *)him;
|
||||
return hext->sin6_scope_id == scope;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
int getScopeID (struct sockaddr *him) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
return him6->sin6_scope_id;
|
||||
}
|
||||
|
||||
int cmpScopeID (unsigned int scope, struct sockaddr *him) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
return him6->sin6_scope_id == scope;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
@ -775,30 +752,32 @@ NET_EnableFastTcpLoopback(int fd) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* In the case of an IPv4 Inetaddress this method will return an
|
||||
* IPv4 mapped address where IPv6 is available and v4MappedAddress is TRUE.
|
||||
* Otherwise it will return a sockaddr_in structure for an IPv4 InetAddress.
|
||||
*/
|
||||
/**
|
||||
* See net_util.h for documentation
|
||||
*/
|
||||
JNIEXPORT int JNICALL
|
||||
NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him,
|
||||
int *len, jboolean v4MappedAddress) {
|
||||
jint family;
|
||||
family = getInetAddress_family(env, iaObj);
|
||||
/* needs work. 1. family 2. clean up him6 etc deallocate memory */
|
||||
if (ipv6_available() && !(family == java_net_InetAddress_IPv4 &&
|
||||
v4MappedAddress == JNI_FALSE)) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
|
||||
SOCKETADDRESS *sa, int *len,
|
||||
jboolean v4MappedAddress)
|
||||
{
|
||||
jint family = getInetAddress_family(env, iaObj);
|
||||
memset((char *)sa, 0, sizeof(SOCKETADDRESS));
|
||||
|
||||
if (ipv6_available() &&
|
||||
!(family == java_net_InetAddress_IPv4 &&
|
||||
v4MappedAddress == JNI_FALSE))
|
||||
{
|
||||
jbyte caddr[16];
|
||||
jint address;
|
||||
|
||||
if (family == java_net_InetAddress_IPv4) {
|
||||
// convert to IPv4-mapped address
|
||||
memset((char *) caddr, 0, 16);
|
||||
memset((char *)caddr, 0, 16);
|
||||
address = getInetAddress_addr(env, iaObj);
|
||||
if (address == INADDR_ANY) {
|
||||
/* we would always prefer IPv6 wildcard address
|
||||
caddr[10] = 0xff;
|
||||
caddr[11] = 0xff; */
|
||||
* caddr[10] = 0xff;
|
||||
* caddr[11] = 0xff; */
|
||||
} else {
|
||||
caddr[10] = 0xff;
|
||||
caddr[11] = 0xff;
|
||||
@ -810,22 +789,19 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr
|
||||
} else {
|
||||
getInet6Address_ipaddress(env, iaObj, (char *)caddr);
|
||||
}
|
||||
memset((char *)him6, 0, sizeof(struct sockaddr_in6));
|
||||
him6->sin6_port = htons(port);
|
||||
memcpy((void *)&(him6->sin6_addr), caddr, sizeof(struct in6_addr) );
|
||||
him6->sin6_family = AF_INET6;
|
||||
*len = sizeof(struct sockaddr_in6);
|
||||
|
||||
#if defined(_ALLBSD_SOURCE)
|
||||
// XXXBSD: should we do something with scope id here ? see below linux comment
|
||||
/* MMM: Come back to this! */
|
||||
#endif
|
||||
sa->sa6.sin6_port = htons(port);
|
||||
memcpy((void *)&sa->sa6.sin6_addr, caddr, sizeof(struct in6_addr));
|
||||
sa->sa6.sin6_family = AF_INET6;
|
||||
if (len != NULL) {
|
||||
*len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
/*
|
||||
* On Linux if we are connecting to a link-local address
|
||||
* we need to specify the interface in the scope_id (2.4 kernel only)
|
||||
*
|
||||
* If the scope was cached the we use the cached value. If not cached but
|
||||
* If the scope was cached then we use the cached value. If not cached but
|
||||
* specified in the Inet6Address we use that, but we first check if the
|
||||
* address needs to be routed via the loopback interface. In this case,
|
||||
* we override the specified value with that of the loopback interface.
|
||||
@ -833,9 +809,8 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr
|
||||
* we try to determine a value from the routing table. In all these
|
||||
* cases the used value is cached for further use.
|
||||
*/
|
||||
#ifdef __linux__
|
||||
if (IN6_IS_ADDR_LINKLOCAL(&(him6->sin6_addr))) {
|
||||
int cached_scope_id = 0, scope_id = 0;
|
||||
if (IN6_IS_ADDR_LINKLOCAL(&sa->sa6.sin6_addr)) {
|
||||
unsigned int cached_scope_id = 0, scope_id = 0;
|
||||
|
||||
if (ia6_cachedscopeidID) {
|
||||
cached_scope_id = (int)(*env)->GetIntField(env, iaObj, ia6_cachedscopeidID);
|
||||
@ -850,7 +825,7 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr
|
||||
/* check user-specified value for loopback case
|
||||
* that needs to be overridden
|
||||
*/
|
||||
if (kernelIsV24() && needsLoopbackRoute (&him6->sin6_addr)) {
|
||||
if (kernelIsV24() && needsLoopbackRoute(&sa->sa6.sin6_addr)) {
|
||||
cached_scope_id = lo_scope_id;
|
||||
(*env)->SetIntField(env, iaObj, ia6_cachedscopeidID, cached_scope_id);
|
||||
}
|
||||
@ -860,11 +835,11 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr
|
||||
* try determine the appropriate interface.
|
||||
*/
|
||||
if (kernelIsV24()) {
|
||||
cached_scope_id = getDefaultIPv6Interface(&(him6->sin6_addr));
|
||||
cached_scope_id = getDefaultIPv6Interface(&sa->sa6.sin6_addr);
|
||||
} else {
|
||||
cached_scope_id = getLocalScopeID((char *)&(him6->sin6_addr));
|
||||
cached_scope_id = getLocalScopeID((char *)&(sa->sa6.sin6_addr));
|
||||
if (cached_scope_id == 0) {
|
||||
cached_scope_id = getDefaultIPv6Interface(&(him6->sin6_addr));
|
||||
cached_scope_id = getDefaultIPv6Interface(&sa->sa6.sin6_addr);
|
||||
}
|
||||
}
|
||||
(*env)->SetIntField(env, iaObj, ia6_cachedscopeidID, cached_scope_id);
|
||||
@ -876,53 +851,37 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr
|
||||
* If we have a scope_id use the extended form
|
||||
* of sockaddr_in6.
|
||||
*/
|
||||
|
||||
struct sockaddr_in6 *him6 =
|
||||
(struct sockaddr_in6 *)him;
|
||||
him6->sin6_scope_id = cached_scope_id != 0 ?
|
||||
cached_scope_id : scope_id;
|
||||
*len = sizeof(struct sockaddr_in6);
|
||||
sa->sa6.sin6_scope_id = cached_scope_id == 0 ? scope_id : cached_scope_id;
|
||||
}
|
||||
#else
|
||||
/* handle scope_id for solaris */
|
||||
|
||||
/* handle scope_id */
|
||||
if (family != java_net_InetAddress_IPv4) {
|
||||
if (ia6_scopeidID) {
|
||||
him6->sin6_scope_id = getInet6Address_scopeid(env, iaObj);
|
||||
sa->sa6.sin6_scope_id = getInet6Address_scopeid(env, iaObj);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
struct sockaddr_in *him4 = (struct sockaddr_in *)him;
|
||||
jint address;
|
||||
if (family == java_net_InetAddress_IPv6) {
|
||||
if (family != java_net_InetAddress_IPv4) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Protocol family unavailable");
|
||||
return -1;
|
||||
}
|
||||
memset((char *)him4, 0, sizeof(struct sockaddr_in));
|
||||
address = getInetAddress_addr(env, iaObj);
|
||||
him4->sin_port = htons((short) port);
|
||||
him4->sin_addr.s_addr = htonl(address);
|
||||
him4->sin_family = AF_INET;
|
||||
*len = sizeof(struct sockaddr_in);
|
||||
sa->sa4.sin_port = htons(port);
|
||||
sa->sa4.sin_addr.s_addr = htonl(address);
|
||||
sa->sa4.sin_family = AF_INET;
|
||||
if (len != NULL) {
|
||||
*len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
NET_SetTrafficClass(struct sockaddr *him, int trafficClass) {
|
||||
if (him->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
him6->sin6_flowinfo = htonl((trafficClass & 0xff) << 20);
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
NET_GetPortFromSockaddr(struct sockaddr *him) {
|
||||
if (him->sa_family == AF_INET6) {
|
||||
return ntohs(((struct sockaddr_in6*)him)->sin6_port);
|
||||
} else {
|
||||
return ntohs(((struct sockaddr_in*)him)->sin_port);
|
||||
NET_SetTrafficClass(SOCKETADDRESS *sa, int trafficClass) {
|
||||
if (sa->sa.sa_family == AF_INET6) {
|
||||
sa->sa6.sin6_flowinfo = htonl((trafficClass & 0xff) << 20);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1488,7 +1447,7 @@ NET_SetSockOpt(int fd, int level, int opt, const void *arg,
|
||||
*
|
||||
*/
|
||||
int
|
||||
NET_Bind(int fd, struct sockaddr *him, int len)
|
||||
NET_Bind(int fd, SOCKETADDRESS *sa, int len)
|
||||
{
|
||||
#if defined(__solaris__)
|
||||
int level = -1;
|
||||
@ -1503,9 +1462,8 @@ NET_Bind(int fd, struct sockaddr *him, int len)
|
||||
* ## When IPv6 is enabled this will be an IPv4-mapped
|
||||
* ## with family set to AF_INET6
|
||||
*/
|
||||
if (him->sa_family == AF_INET) {
|
||||
struct sockaddr_in *sa = (struct sockaddr_in *)him;
|
||||
if ((ntohl(sa->sin_addr.s_addr) & 0x7f0000ff) == 0x7f0000ff) {
|
||||
if (sa->sa.sa_family == AF_INET) {
|
||||
if ((ntohl(sa->sa4.sin_addr.s_addr) & 0x7f0000ff) == 0x7f0000ff) {
|
||||
errno = EADDRNOTAVAIL;
|
||||
return -1;
|
||||
}
|
||||
@ -1524,8 +1482,9 @@ NET_Bind(int fd, struct sockaddr *him, int len)
|
||||
*/
|
||||
alen = sizeof(arg);
|
||||
|
||||
if (useExclBind || getsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
|
||||
(char *)&arg, &alen) == 0) {
|
||||
if (useExclBind ||
|
||||
getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&arg, &alen) == 0)
|
||||
{
|
||||
if (useExclBind || arg == 0) {
|
||||
/*
|
||||
* SO_REUSEADDR is disabled or sun.net.useExclusiveBind
|
||||
@ -1533,8 +1492,8 @@ NET_Bind(int fd, struct sockaddr *him, int len)
|
||||
* UDP_EXCLBIND
|
||||
*/
|
||||
alen = sizeof(arg);
|
||||
if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&arg,
|
||||
&alen) == 0) {
|
||||
if (getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&arg, &alen) == 0)
|
||||
{
|
||||
if (arg == SOCK_STREAM) {
|
||||
level = IPPROTO_TCP;
|
||||
exclbind = TCP_EXCLBIND;
|
||||
@ -1545,14 +1504,13 @@ NET_Bind(int fd, struct sockaddr *him, int len)
|
||||
}
|
||||
|
||||
arg = 1;
|
||||
setsockopt(fd, level, exclbind, (char *)&arg,
|
||||
sizeof(arg));
|
||||
setsockopt(fd, level, exclbind, (char *)&arg, sizeof(arg));
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
rv = bind(fd, him, len);
|
||||
rv = bind(fd, &sa->sa, len);
|
||||
|
||||
#if defined(__solaris__)
|
||||
if (rv < 0) {
|
||||
|
@ -30,32 +30,6 @@
|
||||
#include <sys/poll.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
int NET_Timeout(int s, long timeout);
|
||||
int NET_Timeout0(int s, long timeout, long currentTime);
|
||||
int NET_Read(int s, void* buf, size_t len);
|
||||
int NET_NonBlockingRead(int s, void* buf, size_t len);
|
||||
int NET_TimeoutWithCurrentTime(int s, long timeout, long currentTime);
|
||||
long NET_GetCurrentTime();
|
||||
int NET_RecvFrom(int s, void *buf, int len, unsigned int flags,
|
||||
struct sockaddr *from, socklen_t *fromlen);
|
||||
int NET_ReadV(int s, const struct iovec * vector, int count);
|
||||
int NET_Send(int s, void *msg, int len, unsigned int flags);
|
||||
int NET_SendTo(int s, const void *msg, int len, unsigned int
|
||||
flags, const struct sockaddr *to, int tolen);
|
||||
int NET_Writev(int s, const struct iovec * vector, int count);
|
||||
int NET_Connect(int s, struct sockaddr *addr, int addrlen);
|
||||
int NET_Accept(int s, struct sockaddr *addr, socklen_t *addrlen);
|
||||
int NET_SocketClose(int s);
|
||||
int NET_Dup2(int oldfd, int newfd);
|
||||
int NET_Poll(struct pollfd *ufds, unsigned int nfds, int timeout);
|
||||
int NET_SocketAvailable(int s, jint *pbytes);
|
||||
|
||||
void NET_ThrowUnknownHostExceptionWithGaiError(JNIEnv *env,
|
||||
const char* hostname,
|
||||
int gai_error);
|
||||
void NET_ThrowByNameWithLastError(JNIEnv *env, const char *name,
|
||||
const char *defaultDetail);
|
||||
|
||||
/************************************************************************
|
||||
* Macros and constants
|
||||
*/
|
||||
@ -91,9 +65,36 @@ typedef union {
|
||||
} SOCKETADDRESS;
|
||||
|
||||
/************************************************************************
|
||||
* Utilities
|
||||
* Functions
|
||||
*/
|
||||
|
||||
int NET_Timeout(int s, long timeout);
|
||||
int NET_Timeout0(int s, long timeout, long currentTime);
|
||||
int NET_Read(int s, void* buf, size_t len);
|
||||
int NET_NonBlockingRead(int s, void* buf, size_t len);
|
||||
int NET_TimeoutWithCurrentTime(int s, long timeout, long currentTime);
|
||||
long NET_GetCurrentTime();
|
||||
int NET_RecvFrom(int s, void *buf, int len, unsigned int flags,
|
||||
struct sockaddr *from, socklen_t *fromlen);
|
||||
int NET_ReadV(int s, const struct iovec * vector, int count);
|
||||
int NET_Send(int s, void *msg, int len, unsigned int flags);
|
||||
int NET_SendTo(int s, const void *msg, int len, unsigned int
|
||||
flags, const struct sockaddr *to, int tolen);
|
||||
int NET_Writev(int s, const struct iovec * vector, int count);
|
||||
int NET_Connect(int s, struct sockaddr *addr, int addrlen);
|
||||
int NET_Accept(int s, struct sockaddr *addr, socklen_t *addrlen);
|
||||
int NET_SocketClose(int s);
|
||||
int NET_Dup2(int oldfd, int newfd);
|
||||
int NET_Poll(struct pollfd *ufds, unsigned int nfds, int timeout);
|
||||
int NET_SocketAvailable(int s, jint *pbytes);
|
||||
|
||||
void NET_ThrowUnknownHostExceptionWithGaiError(JNIEnv *env,
|
||||
const char* hostname,
|
||||
int gai_error);
|
||||
void NET_ThrowByNameWithLastError(JNIEnv *env, const char *name,
|
||||
const char *defaultDetail);
|
||||
void NET_SetTrafficClass(SOCKETADDRESS *sa, int trafficClass);
|
||||
|
||||
#ifdef __linux__
|
||||
int kernelIsV24();
|
||||
int getDefaultIPv6Interface(struct in6_addr *target_addr);
|
||||
|
@ -181,11 +181,11 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
*/
|
||||
senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
|
||||
if (senderAddr != NULL) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &sa.sa, senderAddr)) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
|
||||
senderAddr = NULL;
|
||||
} else {
|
||||
jint port = (*env)->GetIntField(env, this, dci_senderPortID);
|
||||
if (port != NET_GetPortFromSockaddr(&sa.sa)) {
|
||||
if (port != NET_GetPortFromSockaddr(&sa)) {
|
||||
senderAddr = NULL;
|
||||
}
|
||||
}
|
||||
@ -193,7 +193,7 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
if (senderAddr == NULL) {
|
||||
jobject isa = NULL;
|
||||
int port = 0;
|
||||
jobject ia = NET_SockaddrToInetAddress(env, &sa.sa, &port);
|
||||
jobject ia = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
if (ia != NULL) {
|
||||
isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
|
||||
}
|
||||
@ -201,7 +201,7 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
|
||||
(*env)->SetObjectField(env, this, dci_senderAddrID, ia);
|
||||
(*env)->SetIntField(env, this, dci_senderPortID,
|
||||
NET_GetPortFromSockaddr(&sa.sa));
|
||||
NET_GetPortFromSockaddr(&sa));
|
||||
(*env)->SetObjectField(env, this, dci_senderID, isa);
|
||||
}
|
||||
return n;
|
||||
@ -215,14 +215,14 @@ Java_sun_nio_ch_DatagramChannelImpl_send0(JNIEnv *env, jobject this,
|
||||
jint fd = fdval(env, fdo);
|
||||
void *buf = (void *)jlong_to_ptr(address);
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len = sizeof(SOCKETADDRESS);
|
||||
int sa_len = 0;
|
||||
jint n = 0;
|
||||
|
||||
if (len > MAX_PACKET_LEN) {
|
||||
len = MAX_PACKET_LEN;
|
||||
}
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa.sa,
|
||||
if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
|
||||
&sa_len, preferIPv6) != 0) {
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ Java_sun_nio_ch_InheritedChannel_peerAddress0(JNIEnv *env, jclass cla, jint fd)
|
||||
|
||||
if (getpeername(fd, &sa.sa, &len) == 0) {
|
||||
if (matchFamily(&sa.sa)) {
|
||||
remote_ia = NET_SockaddrToInetAddress(env, &sa.sa, (int *)&remote_port);
|
||||
remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
|
||||
}
|
||||
}
|
||||
|
||||
@ -81,7 +81,7 @@ Java_sun_nio_ch_InheritedChannel_peerPort0(JNIEnv *env, jclass cla, jint fd)
|
||||
|
||||
if (getpeername(fd, &sa.sa, &len) == 0) {
|
||||
if (matchFamily(&sa.sa)) {
|
||||
NET_SockaddrToInetAddress(env, &sa.sa, (int *)&remote_port);
|
||||
NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -274,15 +274,15 @@ Java_sun_nio_ch_Net_bind0(JNIEnv *env, jclass clazz, jobject fdo, jboolean prefe
|
||||
jboolean useExclBind, jobject iao, int port)
|
||||
{
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len = sizeof(SOCKETADDRESS);
|
||||
int sa_len = 0;
|
||||
int rv = 0;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, &sa.sa, &sa_len,
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len,
|
||||
preferIPv6) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
rv = NET_Bind(fdval(env, fdo), &sa.sa, sa_len);
|
||||
rv = NET_Bind(fdval(env, fdo), &sa, sa_len);
|
||||
if (rv != 0) {
|
||||
handleSocketError(env, errno);
|
||||
}
|
||||
@ -300,10 +300,10 @@ Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6,
|
||||
jobject fdo, jobject iao, jint port)
|
||||
{
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len = sizeof(SOCKETADDRESS);
|
||||
int sa_len = 0;
|
||||
int rv;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, &sa.sa, &sa_len,
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len,
|
||||
preferIPv6) != 0) {
|
||||
return IOS_THROWN;
|
||||
}
|
||||
@ -349,7 +349,7 @@ Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
return -1;
|
||||
#endif /* _ALLBSD_SOURCE */
|
||||
}
|
||||
return NET_GetPortFromSockaddr(&sa.sa);
|
||||
return NET_GetPortFromSockaddr(&sa);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
@ -382,7 +382,7 @@ Java_sun_nio_ch_Net_localInetAddress(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
return NULL;
|
||||
#endif /* _ALLBSD_SOURCE */
|
||||
}
|
||||
return NET_SockaddrToInetAddress(env, &sa.sa, &port);
|
||||
return NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
|
@ -112,7 +112,7 @@ Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv *env, jobject this,
|
||||
}
|
||||
|
||||
(*env)->SetIntField(env, newfdo, fd_fdID, newfd);
|
||||
remote_ia = NET_SockaddrToInetAddress(env, &sa.sa, (int *)&remote_port);
|
||||
remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
|
||||
CHECK_NULL_RETURN(remote_ia, IOS_THROWN);
|
||||
isa = (*env)->NewObject(env, isa_class, isa_ctorID, remote_ia, remote_port);
|
||||
CHECK_NULL_RETURN(isa, IOS_THROWN);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -233,11 +233,14 @@ class WinNTFileSystem extends FileSystem {
|
||||
int childStart = 0;
|
||||
int parentEnd = pn;
|
||||
|
||||
boolean isDirectoryRelative =
|
||||
pn == 2 && isLetter(parent.charAt(0)) && parent.charAt(1) == ':';
|
||||
|
||||
if ((cn > 1) && (c.charAt(0) == slash)) {
|
||||
if (c.charAt(1) == slash) {
|
||||
/* Drop prefix when child is a UNC pathname */
|
||||
childStart = 2;
|
||||
} else {
|
||||
} else if (!isDirectoryRelative) {
|
||||
/* Drop prefix when child is drive-relative */
|
||||
childStart = 1;
|
||||
|
||||
@ -254,7 +257,7 @@ class WinNTFileSystem extends FileSystem {
|
||||
|
||||
int strlen = parentEnd + cn - childStart;
|
||||
char[] theChars = null;
|
||||
if (child.charAt(childStart) == slash) {
|
||||
if (child.charAt(childStart) == slash || isDirectoryRelative) {
|
||||
theChars = new char[strlen];
|
||||
parent.getChars(0, parentEnd, theChars, 0);
|
||||
child.getChars(childStart, cn, theChars, parentEnd);
|
||||
|
@ -53,7 +53,7 @@ static jboolean purgeOutstandingICMP(JNIEnv *env, jint fd)
|
||||
break;
|
||||
}
|
||||
if (recvfrom(fd, buf, 1, MSG_PEEK,
|
||||
(struct sockaddr *)&rmtaddr, &addrlen) != SOCKET_ERROR) {
|
||||
&rmtaddr.sa, &addrlen) != SOCKET_ERROR) {
|
||||
break;
|
||||
}
|
||||
if (WSAGetLastError() != WSAECONNRESET) {
|
||||
@ -61,7 +61,7 @@ static jboolean purgeOutstandingICMP(JNIEnv *env, jint fd)
|
||||
break;
|
||||
}
|
||||
|
||||
recvfrom(fd, buf, 1, 0, (struct sockaddr *)&rmtaddr, &addrlen);
|
||||
recvfrom(fd, buf, 1, 0, &rmtaddr.sa, &addrlen);
|
||||
got_icmp = JNI_TRUE;
|
||||
}
|
||||
|
||||
@ -134,14 +134,13 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketCrea
|
||||
JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketBind
|
||||
(JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port, jboolean exclBind) {
|
||||
SOCKETADDRESS sa;
|
||||
int rv;
|
||||
int sa_len = sizeof(sa);
|
||||
int rv, sa_len = 0;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa,
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
rv = NET_WinBind(fd, (struct sockaddr *)&sa, sa_len, exclBind);
|
||||
rv = NET_WinBind(fd, &sa, sa_len, exclBind);
|
||||
|
||||
if (rv == SOCKET_ERROR) {
|
||||
if (WSAGetLastError() == WSAEACCES) {
|
||||
@ -159,17 +158,15 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketBind
|
||||
JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketConnect
|
||||
(JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port) {
|
||||
SOCKETADDRESS sa;
|
||||
int rv;
|
||||
int sa_len = sizeof(sa);
|
||||
int rv, sa_len = 0, t = TRUE;
|
||||
DWORD x1, x2; /* ignored result codes */
|
||||
int t = TRUE;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa,
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
rv = connect(fd, (struct sockaddr *)&sa, sa_len);
|
||||
rv = connect(fd, &sa.sa, sa_len);
|
||||
if (rv == SOCKET_ERROR) {
|
||||
NET_ThrowNew(env, WSAGetLastError(), "connect");
|
||||
return;
|
||||
@ -192,7 +189,7 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketDisc
|
||||
int t = FALSE;
|
||||
|
||||
memset(&sa, 0, sa_len);
|
||||
connect(fd, (struct sockaddr *)&sa, sa_len);
|
||||
connect(fd, &sa.sa, sa_len);
|
||||
|
||||
/* see comment in socketCreate */
|
||||
WSAIoctl(fd, SIO_UDP_CONNRESET, &t, sizeof(t), &x1, sizeof(x1), &x2, 0, 0);
|
||||
@ -219,7 +216,7 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketLoca
|
||||
SOCKETADDRESS sa;
|
||||
int len = sizeof(sa);
|
||||
|
||||
if (getsockname(fd, (struct sockaddr *)&sa, &len) == SOCKET_ERROR) {
|
||||
if (getsockname(fd, &sa.sa, &len) == SOCKET_ERROR) {
|
||||
NET_ThrowNew(env, WSAGetLastError(), "getsockname");
|
||||
return -1;
|
||||
}
|
||||
@ -238,12 +235,12 @@ JNIEXPORT jobject JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketL
|
||||
jobject iaObj;
|
||||
int port;
|
||||
|
||||
if (getsockname(fd, (struct sockaddr *)&sa, &len) == SOCKET_ERROR) {
|
||||
if (getsockname(fd, &sa.sa, &len) == SOCKET_ERROR) {
|
||||
NET_ThrowNew(env, WSAGetLastError(), "Error getting socket name");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
|
||||
iaObj = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
return iaObj;
|
||||
}
|
||||
|
||||
@ -316,7 +313,7 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketRece
|
||||
|
||||
/* receive the packet */
|
||||
rv = recvfrom(fd, fullPacket, packetBufferLen, flags,
|
||||
(struct sockaddr *)&sa, &sa_len);
|
||||
&sa.sa, &sa_len);
|
||||
|
||||
if (rv == SOCKET_ERROR && (WSAGetLastError() == WSAECONNRESET)) {
|
||||
/* An icmp port unreachable - we must receive this as Windows
|
||||
@ -383,15 +380,13 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketRece
|
||||
*/
|
||||
packetAddress = (*env)->GetObjectField(env, dpObj, dp_addressID);
|
||||
if (packetAddress != NULL) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, (struct sockaddr *)&sa,
|
||||
packetAddress)) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &sa, packetAddress)) {
|
||||
/* force a new InetAddress to be created */
|
||||
packetAddress = NULL;
|
||||
}
|
||||
}
|
||||
if (packetAddress == NULL) {
|
||||
packetAddress = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa,
|
||||
&port);
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
if (packetAddress != NULL) {
|
||||
/* stuff the new Inetaddress into the packet */
|
||||
(*env)->SetObjectField(env, dpObj, dp_addressID, packetAddress);
|
||||
@ -422,20 +417,18 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketSend
|
||||
(JNIEnv *env, jclass clazz, jint fd, jbyteArray data, jint offset, jint length,
|
||||
jobject iaObj, jint port, jboolean connected) {
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len = sizeof(sa);
|
||||
SOCKETADDRESS *sap = &sa;
|
||||
int rv, sa_len = 0;
|
||||
struct sockaddr *sap = 0;
|
||||
char BUF[MAX_BUFFER_LEN];
|
||||
char *fullPacket;
|
||||
int rv;
|
||||
|
||||
if (connected) {
|
||||
sap = 0; /* arg to sendto () null in this case */
|
||||
sa_len = 0;
|
||||
} else {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
// if already connected, sap arg to sendto() is null
|
||||
if (!connected) {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
sap = &sa.sa;
|
||||
}
|
||||
|
||||
if (length > MAX_BUFFER_LEN) {
|
||||
@ -456,7 +449,7 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainDatagramSocketImpl_socketSend
|
||||
|
||||
(*env)->GetByteArrayRegion(env, data, offset, length,
|
||||
(jbyte *)fullPacket);
|
||||
rv = sendto(fd, fullPacket, length, 0, (struct sockaddr *)sap, sa_len);
|
||||
rv = sendto(fd, fullPacket, length, 0, sap, sa_len);
|
||||
if (rv == SOCKET_ERROR) {
|
||||
if (rv == -1) {
|
||||
NET_ThrowNew(env, WSAGetLastError(), "Datagram send failed");
|
||||
|
@ -89,15 +89,14 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_bind0
|
||||
jboolean exclBind)
|
||||
{
|
||||
SOCKETADDRESS sa;
|
||||
int rv;
|
||||
int sa_len = sizeof(sa);
|
||||
int rv, sa_len = 0;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
rv = NET_WinBind(fd, (struct sockaddr *)&sa, sa_len, exclBind);
|
||||
rv = NET_WinBind(fd, &sa, sa_len, exclBind);
|
||||
|
||||
if (rv == SOCKET_ERROR)
|
||||
NET_ThrowNew(env, WSAGetLastError(), "NET_Bind");
|
||||
@ -111,15 +110,14 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_bind0
|
||||
JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_connect0
|
||||
(JNIEnv *env, jclass clazz, jint fd, jobject iaObj, jint port) {
|
||||
SOCKETADDRESS sa;
|
||||
int rv;
|
||||
int sa_len = sizeof(sa);
|
||||
int rv, sa_len = 0;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, (struct sockaddr *)&sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &sa,
|
||||
&sa_len, JNI_TRUE) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
rv = connect(fd, (struct sockaddr *)&sa, sa_len);
|
||||
rv = connect(fd, &sa.sa, sa_len);
|
||||
if (rv == SOCKET_ERROR) {
|
||||
int err = WSAGetLastError();
|
||||
if (err == WSAEWOULDBLOCK) {
|
||||
@ -217,7 +215,7 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_localPort0
|
||||
SOCKETADDRESS sa;
|
||||
int len = sizeof(sa);
|
||||
|
||||
if (getsockname(fd, (struct sockaddr *)&sa, &len) == SOCKET_ERROR) {
|
||||
if (getsockname(fd, &sa.sa, &len) == SOCKET_ERROR) {
|
||||
if (WSAGetLastError() == WSAENOTSOCK) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
"Socket closed");
|
||||
@ -243,11 +241,11 @@ JNIEXPORT void JNICALL Java_java_net_DualStackPlainSocketImpl_localAddress
|
||||
jclass iaContainerClass;
|
||||
jfieldID iaFieldID;
|
||||
|
||||
if (getsockname(fd, (struct sockaddr *)&sa, &len) == SOCKET_ERROR) {
|
||||
if (getsockname(fd, &sa.sa, &len) == SOCKET_ERROR) {
|
||||
NET_ThrowNew(env, WSAGetLastError(), "Error getting socket name");
|
||||
return;
|
||||
}
|
||||
iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
|
||||
iaObj = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
CHECK_NULL(iaObj);
|
||||
|
||||
iaContainerClass = (*env)->GetObjectClass(env, iaContainerObj);
|
||||
@ -283,7 +281,7 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_accept0
|
||||
int len = sizeof(sa);
|
||||
|
||||
memset((char *)&sa, 0, len);
|
||||
newfd = accept(fd, (struct sockaddr *)&sa, &len);
|
||||
newfd = accept(fd, &sa.sa, &len);
|
||||
|
||||
if (newfd == INVALID_SOCKET) {
|
||||
if (WSAGetLastError() == -2) {
|
||||
@ -298,7 +296,7 @@ JNIEXPORT jint JNICALL Java_java_net_DualStackPlainSocketImpl_accept0
|
||||
|
||||
SetHandleInformation((HANDLE)(UINT_PTR)newfd, HANDLE_FLAG_INHERIT, 0);
|
||||
|
||||
ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
|
||||
ia = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
|
||||
(*env)->SetObjectArrayElement(env, isaa, 0, isa);
|
||||
|
||||
|
@ -420,18 +420,13 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
jboolean exclBind) {
|
||||
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
|
||||
jobject fd1Obj = (*env)->GetObjectField(env, this, pdsi_fd1ID);
|
||||
|
||||
int fd, fd1 = -1, family;
|
||||
int ipv6_supported = ipv6_available();
|
||||
|
||||
int fd, fd1 = -1, lcladdrlen = 0;
|
||||
SOCKETADDRESS lcladdr;
|
||||
int lcladdrlen = sizeof(SOCKETADDRESS);
|
||||
int address;
|
||||
|
||||
memset((char *)&lcladdr, 0, sizeof(lcladdr));
|
||||
|
||||
family = getInetAddress_family(env, addressObj);
|
||||
if (family == java_net_InetAddress_IPv6 && !ipv6_supported) {
|
||||
if (getInetAddress_family(env, addressObj) == java_net_InetAddress_IPv6 &&
|
||||
!ipv6_supported)
|
||||
{
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
"Protocol family not supported");
|
||||
return;
|
||||
@ -446,14 +441,13 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
fd1 = (*env)->GetIntField(env, fd1Obj, IO_fd_fdID);
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_NULL(addressObj)) {
|
||||
JNU_ThrowNullPointerException(env, "argument address");
|
||||
return;
|
||||
} else {
|
||||
address = getInetAddress_addr(env, addressObj);
|
||||
}
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, addressObj, port, &lcladdr.sa,
|
||||
if (NET_InetAddressToSockaddr(env, addressObj, port, &lcladdr,
|
||||
&lcladdrlen, JNI_FALSE) != 0) {
|
||||
return;
|
||||
}
|
||||
@ -493,7 +487,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (NET_WinBind(fd, &lcladdr.sa, lcladdrlen, exclBind) == -1) {
|
||||
if (NET_WinBind(fd, &lcladdr, lcladdrlen, exclBind) == -1) {
|
||||
if (WSAGetLastError() == WSAEACCES) {
|
||||
WSASetLastError(WSAEADDRINUSE);
|
||||
}
|
||||
@ -507,7 +501,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
NET_ThrowCurrent(env, "getsockname");
|
||||
return;
|
||||
}
|
||||
port = ntohs((u_short) GET_PORT (&lcladdr));
|
||||
port = ntohs((u_short)GET_PORT(&lcladdr));
|
||||
}
|
||||
(*env)->SetIntField(env, this, pdsi_localPortID, port);
|
||||
}
|
||||
@ -520,27 +514,25 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_bind0(JNIEnv *env, jobject this,
|
||||
*/
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_net_TwoStacksPlainDatagramSocketImpl_connect0(JNIEnv *env, jobject this,
|
||||
jobject address, jint port) {
|
||||
/* The object's field */
|
||||
Java_java_net_TwoStacksPlainDatagramSocketImpl_connect0
|
||||
(JNIEnv *env, jobject this, jobject address, jint port)
|
||||
{
|
||||
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
|
||||
jobject fd1Obj = (*env)->GetObjectField(env, this, pdsi_fd1ID);
|
||||
/* The fdObj'fd */
|
||||
jint fd=-1, fd1=-1, fdc;
|
||||
/* The packetAddress address, family and port */
|
||||
jint addr, family;
|
||||
jint fd = -1, fd1 = -1, fdc, family;
|
||||
SOCKETADDRESS rmtaddr;
|
||||
int rmtaddrlen;
|
||||
int ipv6_supported = ipv6_available();
|
||||
int rmtaddrlen = 0;
|
||||
|
||||
if (IS_NULL(fdObj) && IS_NULL(fd1Obj)) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
"Socket closed");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!IS_NULL(fdObj)) {
|
||||
fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
|
||||
}
|
||||
|
||||
if (!IS_NULL(fd1Obj)) {
|
||||
fd1 = (*env)->GetIntField(env, fd1Obj, IO_fd_fdID);
|
||||
}
|
||||
@ -550,10 +542,8 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_connect0(JNIEnv *env, jobject thi
|
||||
return;
|
||||
}
|
||||
|
||||
addr = getInetAddress_addr(env, address);
|
||||
|
||||
family = getInetAddress_family(env, address);
|
||||
if (family == java_net_InetAddress_IPv6 && !ipv6_supported) {
|
||||
if (family == java_net_InetAddress_IPv6 && !ipv6_available()) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
"Protocol family not supported");
|
||||
return;
|
||||
@ -572,12 +562,12 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_connect0(JNIEnv *env, jobject thi
|
||||
res = WSAIoctl(fdc,SIO_UDP_CONNRESET,&t,sizeof(t),&x1,sizeof(x1),&x2,0,0);
|
||||
}
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, address, port, &rmtaddr.sa,
|
||||
if (NET_InetAddressToSockaddr(env, address, port, &rmtaddr,
|
||||
&rmtaddrlen, JNI_FALSE) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (connect(fdc, &rmtaddr.sa, sizeof(rmtaddr)) == -1) {
|
||||
if (connect(fdc, &rmtaddr.sa, rmtaddrlen) == -1) {
|
||||
NET_ThrowCurrent(env, "connect");
|
||||
return;
|
||||
}
|
||||
@ -631,9 +621,9 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_disconnect0(JNIEnv *env, jobject
|
||||
* Signature: (Ljava/net/DatagramPacket;)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_net_TwoStacksPlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
jobject packet) {
|
||||
|
||||
Java_java_net_TwoStacksPlainDatagramSocketImpl_send
|
||||
(JNIEnv *env, jobject this, jobject packet)
|
||||
{
|
||||
char BUF[MAX_BUFFER_LEN];
|
||||
char *fullPacket;
|
||||
jobject fdObj;
|
||||
@ -647,11 +637,10 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
jbyteArray packetBuffer;
|
||||
jboolean connected;
|
||||
|
||||
SOCKETADDRESS rmtaddr, *addrp = &rmtaddr;
|
||||
SOCKETADDRESS rmtaddr;
|
||||
struct sockaddr *addrp = 0;
|
||||
int addrlen = 0;
|
||||
|
||||
memset((char *)&rmtaddr, 0, sizeof(rmtaddr));
|
||||
|
||||
if (IS_NULL(packet)) {
|
||||
JNU_ThrowNullPointerException(env, "null packet");
|
||||
return;
|
||||
@ -696,14 +685,13 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
packetBufferLen = MAX_PACKET_LEN;
|
||||
}
|
||||
|
||||
if (connected) {
|
||||
addrp = 0; /* arg to sendto () null in this case */
|
||||
addrlen = 0;
|
||||
} else {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, packetPort, &rmtaddr.sa,
|
||||
// sockaddr arg to sendto() is null if already connected
|
||||
if (!connected) {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, packetPort, &rmtaddr,
|
||||
&addrlen, JNI_FALSE) != 0) {
|
||||
return;
|
||||
}
|
||||
addrp = &rmtaddr.sa;
|
||||
}
|
||||
|
||||
if (packetBufferLen > MAX_BUFFER_LEN) {
|
||||
@ -753,11 +741,12 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_send(JNIEnv *env, jobject this,
|
||||
fullPacket = &(BUF[0]);
|
||||
}
|
||||
|
||||
(*env)->GetByteArrayRegion(env, packetBuffer, packetBufferOffset, packetBufferLen,
|
||||
(jbyte *)fullPacket);
|
||||
if (sendto(fd, fullPacket, packetBufferLen, 0,
|
||||
(struct sockaddr *)addrp, addrlen) == SOCKET_ERROR) {
|
||||
NET_ThrowCurrent(env, "Datagram send failed");
|
||||
(*env)->GetByteArrayRegion(env, packetBuffer, packetBufferOffset,
|
||||
packetBufferLen, (jbyte *)fullPacket);
|
||||
if (sendto(fd, fullPacket, packetBufferLen, 0, addrp,
|
||||
addrlen) == SOCKET_ERROR)
|
||||
{
|
||||
NET_ThrowCurrent(env, "Datagram send failed");
|
||||
}
|
||||
|
||||
if (packetBufferLen > MAX_BUFFER_LEN) {
|
||||
@ -1147,14 +1136,14 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_peekData(JNIEnv *env, jobject thi
|
||||
*/
|
||||
packetAddress = (*env)->GetObjectField(env, packet, dp_addressID);
|
||||
if (packetAddress != NULL) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &remote_addr.sa,
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &remote_addr,
|
||||
packetAddress)) {
|
||||
/* force a new InetAddress to be created */
|
||||
packetAddress = NULL;
|
||||
}
|
||||
}
|
||||
if (packetAddress == NULL) {
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &remote_addr.sa,
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &remote_addr,
|
||||
&port);
|
||||
/* stuff the new Inetaddress in the packet */
|
||||
(*env)->SetObjectField(env, packet, dp_addressID, packetAddress);
|
||||
@ -1431,20 +1420,21 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_receive0(JNIEnv *env, jobject thi
|
||||
* can't update any existing InetAddress because it is immutable
|
||||
*/
|
||||
packetAddress = (*env)->GetObjectField(env, packet, dp_addressID);
|
||||
|
||||
if (packetAddress != NULL) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &remote_addr.sa, packetAddress)) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &remote_addr,
|
||||
packetAddress)) {
|
||||
/* force a new InetAddress to be created */
|
||||
packetAddress = NULL;
|
||||
}
|
||||
}
|
||||
if (packetAddress == NULL) {
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &remote_addr.sa, &port);
|
||||
packetAddress = NET_SockaddrToInetAddress(env, &remote_addr,
|
||||
&port);
|
||||
/* stuff the new Inetaddress in the packet */
|
||||
(*env)->SetObjectField(env, packet, dp_addressID, packetAddress);
|
||||
} else {
|
||||
/* only get the new port number */
|
||||
port = NET_GetPortFromSockaddr(&remote_addr.sa);
|
||||
port = NET_GetPortFromSockaddr(&remote_addr);
|
||||
}
|
||||
/* populate the packet */
|
||||
(*env)->SetByteArrayRegion(env, packetBuffer, packetBufferOffset, n,
|
||||
@ -1528,7 +1518,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_datagramSocketClose(JNIEnv *env,
|
||||
jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID);
|
||||
jobject fd1Obj = (*env)->GetObjectField(env, this, pdsi_fd1ID);
|
||||
int ipv6_supported = ipv6_available();
|
||||
int fd=-1, fd1=-1;
|
||||
int fd = -1, fd1 = -1;
|
||||
|
||||
if (IS_NULL(fdObj) && (!ipv6_supported || IS_NULL(fd1Obj))) {
|
||||
return;
|
||||
@ -1799,7 +1789,7 @@ JNIEXPORT void JNICALL
|
||||
Java_java_net_TwoStacksPlainDatagramSocketImpl_socketNativeSetOption
|
||||
(JNIEnv *env,jobject this, jint opt,jobject value)
|
||||
{
|
||||
int fd=-1, fd1=-1;
|
||||
int fd = -1, fd1 = -1;
|
||||
int levelv4 = 0, levelv6 = 0, optnamev4 = 0, optnamev6 = 0, optlen = 0;
|
||||
union {
|
||||
int i;
|
||||
@ -2167,7 +2157,7 @@ JNIEXPORT jobject JNICALL
|
||||
Java_java_net_TwoStacksPlainDatagramSocketImpl_socketGetOption
|
||||
(JNIEnv *env, jobject this, jint opt)
|
||||
{
|
||||
int fd=-1, fd1=-1;
|
||||
int fd = -1, fd1 = -1;
|
||||
int level, optname, optlen;
|
||||
union {
|
||||
int i;
|
||||
@ -2255,7 +2245,7 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_socketLocalAddress
|
||||
(JNIEnv *env, jobject this, jint family)
|
||||
{
|
||||
int fd = -1, fd1 = -1;
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
int len = 0;
|
||||
int port;
|
||||
jobject iaObj;
|
||||
@ -2288,12 +2278,12 @@ Java_java_net_TwoStacksPlainDatagramSocketImpl_socketLocalAddress
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (getsockname(fd, &him.sa, &len) == -1) {
|
||||
if (getsockname(fd, &sa.sa, &len) == -1) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
|
||||
return NULL;
|
||||
}
|
||||
iaObj = NET_SockaddrToInetAddress(env, &him.sa, &port);
|
||||
iaObj = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
|
||||
return iaObj;
|
||||
}
|
||||
@ -2430,7 +2420,7 @@ static void mcast_join_leave(JNIEnv *env, jobject this,
|
||||
|
||||
int len, family;
|
||||
int ipv6_supported = ipv6_available();
|
||||
int cmd ;
|
||||
int cmd;
|
||||
|
||||
memset((char *)&in, 0, sizeof(in));
|
||||
memset((char *)&name, 0, sizeof(name));
|
||||
@ -2452,7 +2442,7 @@ static void mcast_join_leave(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, 0, &name.sa, &len, JNI_FALSE) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, 0, &name, &len, JNI_FALSE) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2473,7 +2463,7 @@ static void mcast_join_leave(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
if (IS_NULL(niObj)) {
|
||||
len = sizeof (in);
|
||||
len = sizeof(in);
|
||||
if (NET_GetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_IF,
|
||||
(char *)&in, &len) < 0) {
|
||||
NET_ThrowCurrent(env, "get IP_MULTICAST_IF failed");
|
||||
|
@ -175,8 +175,8 @@ Java_java_net_TwoStacksPlainSocketImpl_socketCreate(JNIEnv *env, jobject this,
|
||||
*/
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_net_TwoStacksPlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
jobject iaObj, jint port,
|
||||
jint timeout)
|
||||
jobject iaObj, jint port,
|
||||
jint timeout)
|
||||
{
|
||||
jint localport = (*env)->GetIntField(env, this, psi_localportID);
|
||||
|
||||
@ -193,11 +193,11 @@ Java_java_net_TwoStacksPlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
jobject fdObj = (*env)->GetObjectField(env, this, psi_fdID);
|
||||
jobject fd1Obj = (*env)->GetObjectField(env, this, psi_fd1ID);
|
||||
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
|
||||
/* The result of the connection */
|
||||
int connect_res;
|
||||
memset((char *)&him, 0, sizeof(him));
|
||||
memset((char *)&sa, 0, sizeof(sa));
|
||||
|
||||
if (!IS_NULL(fdObj)) {
|
||||
fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID);
|
||||
@ -212,11 +212,12 @@ Java_java_net_TwoStacksPlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &him.sa, &len, JNI_FALSE) != 0) {
|
||||
return;
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, port, &sa, &len,
|
||||
JNI_FALSE) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
family = him.sa.sa_family;
|
||||
family = sa.sa.sa_family;
|
||||
if (family == AF_INET6) {
|
||||
if (!ipv6_supported) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
@ -248,7 +249,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
(*env)->SetObjectField(env, this, psi_fd1ID, NULL);
|
||||
|
||||
if (timeout <= 0) {
|
||||
connect_res = connect(fd, &him.sa, sizeof(SOCKETADDRESS));
|
||||
connect_res = connect(fd, &sa.sa, sizeof(SOCKETADDRESS));
|
||||
if (connect_res == SOCKET_ERROR) {
|
||||
connect_res = WSAGetLastError();
|
||||
}
|
||||
@ -261,7 +262,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
ioctlsocket(fd, FIONBIO, &optval);
|
||||
|
||||
/* initiate the connect */
|
||||
connect_res = connect(fd, &him.sa, sizeof(SOCKETADDRESS));
|
||||
connect_res = connect(fd, &sa.sa, sizeof(SOCKETADDRESS));
|
||||
if (connect_res == SOCKET_ERROR) {
|
||||
if (WSAGetLastError() != WSAEWOULDBLOCK) {
|
||||
connect_res = WSAGetLastError();
|
||||
@ -362,7 +363,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
*/
|
||||
u_short port;
|
||||
int len = sizeof(SOCKETADDRESS);
|
||||
if (getsockname(fd, &him.sa, &len) == -1) {
|
||||
if (getsockname(fd, &sa.sa, &len) == -1) {
|
||||
if (WSAGetLastError() == WSAENOTSOCK) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
|
||||
"Socket closed");
|
||||
@ -371,7 +372,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketConnect(JNIEnv *env, jobject this,
|
||||
}
|
||||
return;
|
||||
}
|
||||
port = ntohs((u_short)GET_PORT(&him));
|
||||
port = ntohs((u_short)GET_PORT(&sa));
|
||||
(*env)->SetIntField(env, this, psi_localportID, (int) port);
|
||||
}
|
||||
}
|
||||
@ -396,7 +397,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketBind(JNIEnv *env, jobject this,
|
||||
int family;
|
||||
int rv;
|
||||
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
|
||||
fdObj = (*env)->GetObjectField(env, this, psi_fdID);
|
||||
fd1Obj = (*env)->GetObjectField(env, this, psi_fd1ID);
|
||||
@ -424,13 +425,13 @@ Java_java_net_TwoStacksPlainSocketImpl_socketBind(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, localport, &him.sa, &len,
|
||||
if (NET_InetAddressToSockaddr(env, iaObj, localport, &sa, &len,
|
||||
JNI_FALSE) != 0) {
|
||||
return;
|
||||
}
|
||||
if (ipv6_supported) {
|
||||
struct ipv6bind v6bind;
|
||||
v6bind.addr = &him;
|
||||
v6bind.addr = &sa.sa;
|
||||
v6bind.ipv4_fd = fd;
|
||||
v6bind.ipv6_fd = fd1;
|
||||
rv = NET_BindV6(&v6bind, exclBind);
|
||||
@ -462,7 +463,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketBind(JNIEnv *env, jobject this,
|
||||
(*env)->SetObjectField(env, this, psi_fd1ID, NULL);
|
||||
}
|
||||
} else {
|
||||
rv = NET_WinBind(fd, &him.sa, len, exclBind);
|
||||
rv = NET_WinBind(fd, &sa, len, exclBind);
|
||||
}
|
||||
|
||||
if (rv == -1) {
|
||||
@ -481,11 +482,11 @@ Java_java_net_TwoStacksPlainSocketImpl_socketBind(JNIEnv *env, jobject this,
|
||||
int len = sizeof(SOCKETADDRESS);
|
||||
u_short port;
|
||||
|
||||
if (getsockname(him.sa.sa_family == AF_INET ? fd: fd1, &him.sa, &len) == -1) {
|
||||
if (getsockname(sa.sa.sa_family == AF_INET ? fd : fd1, &sa.sa, &len) == -1) {
|
||||
NET_ThrowCurrent(env, "getsockname in plain socketBind");
|
||||
return;
|
||||
}
|
||||
port = ntohs((u_short) GET_PORT (&him));
|
||||
port = ntohs((u_short) GET_PORT (&sa));
|
||||
|
||||
(*env)->SetIntField(env, this, psi_localportID, (int)port);
|
||||
} else {
|
||||
@ -529,7 +530,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketListen
|
||||
JNU_ThrowNullPointerException(env, "socket address");
|
||||
return;
|
||||
}
|
||||
if (NET_InetAddressToSockaddr(env, address, 0, &addr.sa, &addrlen,
|
||||
if (NET_InetAddressToSockaddr(env, address, 0, &addr, &addrlen,
|
||||
JNI_FALSE) != 0) {
|
||||
return;
|
||||
}
|
||||
@ -585,7 +586,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
/* the fd int field on fdObj */
|
||||
jint fd=-1, fd1=-1;
|
||||
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
jint len;
|
||||
|
||||
if (IS_NULL(fdObj) && IS_NULL(fd1Obj)) {
|
||||
@ -676,7 +677,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
}
|
||||
}
|
||||
}
|
||||
fd = accept(fd, &him.sa, &len);
|
||||
fd = accept(fd, &sa.sa, &len);
|
||||
if (fd < 0) {
|
||||
/* REMIND: SOCKET CLOSED PROBLEM */
|
||||
if (fd == -2) {
|
||||
@ -691,7 +692,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
SetHandleInformation((HANDLE)(UINT_PTR)fd, HANDLE_FLAG_INHERIT, 0);
|
||||
(*env)->SetIntField(env, socketFdObj, IO_fd_fdID, fd);
|
||||
|
||||
if (him.sa.sa_family == AF_INET) {
|
||||
if (sa.sa.sa_family == AF_INET) {
|
||||
if (inet4Cls == NULL) {
|
||||
jclass c = (*env)->FindClass(env, "java/net/Inet4Address");
|
||||
if (c != NULL) {
|
||||
@ -717,7 +718,7 @@ Java_java_net_TwoStacksPlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
|
||||
setInetAddress_addr(env, socketAddressObj, ntohl(him.sa4.sin_addr.s_addr));
|
||||
setInetAddress_addr(env, socketAddressObj, ntohl(sa.sa4.sin_addr.s_addr));
|
||||
setInetAddress_family(env, socketAddressObj, java_net_InetAddress_IPv4);
|
||||
(*env)->SetObjectField(env, socket, psi_addressID, socketAddressObj);
|
||||
} else {
|
||||
@ -743,14 +744,14 @@ Java_java_net_TwoStacksPlainSocketImpl_socketAccept(JNIEnv *env, jobject this,
|
||||
NET_SocketClose(fd);
|
||||
return;
|
||||
}
|
||||
setInet6Address_ipaddress(env, socketAddressObj, (char *)&him.sa6.sin6_addr);
|
||||
setInet6Address_ipaddress(env, socketAddressObj, (char *)&sa.sa6.sin6_addr);
|
||||
setInetAddress_family(env, socketAddressObj, java_net_InetAddress_IPv6);
|
||||
setInet6Address_scopeid(env, socketAddressObj, him.sa6.sin6_scope_id);
|
||||
setInet6Address_scopeid(env, socketAddressObj, sa.sa6.sin6_scope_id);
|
||||
|
||||
}
|
||||
/* fields common to AF_INET and AF_INET6 */
|
||||
|
||||
port = ntohs ((u_short) GET_PORT (&him));
|
||||
port = ntohs ((u_short)GET_PORT(&sa));
|
||||
(*env)->SetIntField(env, socket, psi_portID, (int)port);
|
||||
port = (*env)->GetIntField(env, this, psi_localportID);
|
||||
(*env)->SetIntField(env, socket, psi_localportID, port);
|
||||
@ -1025,14 +1026,14 @@ Java_java_net_TwoStacksPlainSocketImpl_socketGetOption
|
||||
* SO_BINDADDR isn't a socket option
|
||||
*/
|
||||
if (opt == java_net_SocketOptions_SO_BINDADDR) {
|
||||
SOCKETADDRESS him;
|
||||
SOCKETADDRESS sa;
|
||||
int len = sizeof(SOCKETADDRESS);
|
||||
int port;
|
||||
jobject iaObj;
|
||||
jclass iaCntrClass;
|
||||
jfieldID iaFieldID;
|
||||
|
||||
memset((char *)&him, 0, len);
|
||||
memset((char *)&sa, 0, len);
|
||||
|
||||
if (fd == -1) {
|
||||
/* must be an IPV6 only socket. Case where both sockets are != -1
|
||||
@ -1041,12 +1042,12 @@ Java_java_net_TwoStacksPlainSocketImpl_socketGetOption
|
||||
fd = getFD1 (env, this);
|
||||
}
|
||||
|
||||
if (getsockname(fd, &him.sa, &len) < 0) {
|
||||
if (getsockname(fd, &sa.sa, &len) < 0) {
|
||||
JNU_ThrowByNameWithMessageAndLastError
|
||||
(env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
|
||||
return -1;
|
||||
}
|
||||
iaObj = NET_SockaddrToInetAddress(env, &him.sa, &port);
|
||||
iaObj = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
CHECK_NULL_RETURN(iaObj, -1);
|
||||
|
||||
iaCntrClass = (*env)->GetObjectClass(env, iaContainerObj);
|
||||
|
@ -488,10 +488,10 @@ void setExclusiveBind(int fd) {
|
||||
* Should be only called by the wrapper method NET_WinBind
|
||||
*/
|
||||
JNIEXPORT int JNICALL
|
||||
NET_Bind(int s, struct sockaddr *him, int len)
|
||||
NET_Bind(int s, SOCKETADDRESS *sa, int len)
|
||||
{
|
||||
int rv = 0;
|
||||
rv = bind(s, him, len);
|
||||
rv = bind(s, &sa->sa, len);
|
||||
|
||||
if (rv == SOCKET_ERROR) {
|
||||
/*
|
||||
@ -511,11 +511,11 @@ NET_Bind(int s, struct sockaddr *him, int len)
|
||||
* if required, and then calls NET_BIND
|
||||
*/
|
||||
JNIEXPORT int JNICALL
|
||||
NET_WinBind(int s, struct sockaddr *him, int len, jboolean exclBind)
|
||||
NET_WinBind(int s, SOCKETADDRESS *sa, int len, jboolean exclBind)
|
||||
{
|
||||
if (exclBind == JNI_TRUE)
|
||||
setExclusiveBind(s);
|
||||
return NET_Bind(s, him, len);
|
||||
return NET_Bind(s, sa, len);
|
||||
}
|
||||
|
||||
JNIEXPORT int JNICALL
|
||||
@ -677,8 +677,8 @@ NET_BindV6(struct ipv6bind *b, jboolean exclBind) {
|
||||
if (family == AF_INET && (b->addr->sa4.sin_addr.s_addr != INADDR_ANY)) {
|
||||
/* bind to v4 only */
|
||||
int ret;
|
||||
ret = NET_WinBind((int)b->ipv4_fd, (struct sockaddr *)b->addr,
|
||||
sizeof(SOCKETADDRESS), exclBind);
|
||||
ret = NET_WinBind((int)b->ipv4_fd, b->addr,
|
||||
sizeof(SOCKETADDRESS), exclBind);
|
||||
if (ret == SOCKET_ERROR) {
|
||||
CLOSE_SOCKETS_AND_RETURN;
|
||||
}
|
||||
@ -689,7 +689,7 @@ NET_BindV6(struct ipv6bind *b, jboolean exclBind) {
|
||||
if (family == AF_INET6 && (!IN6_IS_ADDR_ANY(&b->addr->sa6.sin6_addr))) {
|
||||
/* bind to v6 only */
|
||||
int ret;
|
||||
ret = NET_WinBind((int)b->ipv6_fd, (struct sockaddr *)b->addr,
|
||||
ret = NET_WinBind((int)b->ipv6_fd, b->addr,
|
||||
sizeof(SOCKETADDRESS), exclBind);
|
||||
if (ret == SOCKET_ERROR) {
|
||||
CLOSE_SOCKETS_AND_RETURN;
|
||||
@ -719,7 +719,7 @@ NET_BindV6(struct ipv6bind *b, jboolean exclBind) {
|
||||
oaddr.sa4.sin_addr.s_addr = INADDR_ANY;
|
||||
}
|
||||
|
||||
rv = NET_WinBind(fd, (struct sockaddr *)b->addr, sizeof(SOCKETADDRESS), exclBind);
|
||||
rv = NET_WinBind(fd, b->addr, sizeof(SOCKETADDRESS), exclBind);
|
||||
if (rv == SOCKET_ERROR) {
|
||||
CLOSE_SOCKETS_AND_RETURN;
|
||||
}
|
||||
@ -731,7 +731,7 @@ NET_BindV6(struct ipv6bind *b, jboolean exclBind) {
|
||||
}
|
||||
bound_port = GET_PORT (b->addr);
|
||||
SET_PORT (&oaddr, bound_port);
|
||||
if ((rv = NET_WinBind(ofd, &oaddr.sa,
|
||||
if ((rv = NET_WinBind(ofd, &oaddr,
|
||||
sizeof(SOCKETADDRESS), exclBind)) == SOCKET_ERROR) {
|
||||
int retries;
|
||||
int sotype, arglen=sizeof(sotype);
|
||||
@ -768,7 +768,7 @@ NET_BindV6(struct ipv6bind *b, jboolean exclBind) {
|
||||
|
||||
/* bind random port on first socket */
|
||||
SET_PORT (&oaddr, 0);
|
||||
rv = NET_WinBind(ofd, &oaddr.sa, sizeof(SOCKETADDRESS), exclBind);
|
||||
rv = NET_WinBind(ofd, &oaddr, sizeof(SOCKETADDRESS), exclBind);
|
||||
if (rv == SOCKET_ERROR) {
|
||||
CLOSE_SOCKETS_AND_RETURN;
|
||||
}
|
||||
@ -784,8 +784,7 @@ NET_BindV6(struct ipv6bind *b, jboolean exclBind) {
|
||||
}
|
||||
bound_port = GET_PORT (&oaddr);
|
||||
SET_PORT (b->addr, bound_port);
|
||||
rv = NET_WinBind(fd, (struct sockaddr *)b->addr,
|
||||
sizeof(SOCKETADDRESS), exclBind);
|
||||
rv = NET_WinBind(fd, b->addr, sizeof(SOCKETADDRESS), exclBind);
|
||||
|
||||
if (rv != SOCKET_ERROR) {
|
||||
if (family == AF_INET) {
|
||||
@ -853,31 +852,33 @@ NET_EnableFastTcpLoopback(int fd) {
|
||||
return result == SOCKET_ERROR ? WSAGetLastError() : 0;
|
||||
}
|
||||
|
||||
/* If address types is IPv6, then IPv6 must be available. Otherwise
|
||||
* no address can be generated. In the case of an IPv4 Inetaddress this
|
||||
* method will return an IPv4 mapped address where IPv6 is available and
|
||||
* v4MappedAddress is TRUE. Otherwise it will return a sockaddr_in
|
||||
* structure for an IPv4 InetAddress.
|
||||
*/
|
||||
/**
|
||||
* See net_util.h for documentation
|
||||
*/
|
||||
JNIEXPORT int JNICALL
|
||||
NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr *him,
|
||||
int *len, jboolean v4MappedAddress) {
|
||||
jint family, iafam;
|
||||
iafam = getInetAddress_family(env, iaObj);
|
||||
family = (iafam == java_net_InetAddress_IPv4)? AF_INET : AF_INET6;
|
||||
if (ipv6_available() && !(family == AF_INET && v4MappedAddress == JNI_FALSE)) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
jbyte caddr[16];
|
||||
jint address, scopeid = 0;
|
||||
jint cached_scope_id = 0;
|
||||
NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port,
|
||||
SOCKETADDRESS *sa, int *len,
|
||||
jboolean v4MappedAddress)
|
||||
{
|
||||
jint family = getInetAddress_family(env, iaObj);
|
||||
memset((char *)sa, 0, sizeof(SOCKETADDRESS));
|
||||
|
||||
if (family == AF_INET) { /* will convert to IPv4-mapped address */
|
||||
memset((char *) caddr, 0, 16);
|
||||
if (ipv6_available() &&
|
||||
!(family == java_net_InetAddress_IPv4 &&
|
||||
v4MappedAddress == JNI_FALSE))
|
||||
{
|
||||
jbyte caddr[16];
|
||||
jint address;
|
||||
unsigned int scopeid = 0, cached_scope_id = 0;
|
||||
|
||||
if (family == java_net_InetAddress_IPv4) {
|
||||
// convert to IPv4-mapped address
|
||||
memset((char *)caddr, 0, 16);
|
||||
address = getInetAddress_addr(env, iaObj);
|
||||
if (address == INADDR_ANY) {
|
||||
/* we would always prefer IPv6 wildcard address
|
||||
caddr[10] = 0xff;
|
||||
caddr[11] = 0xff; */
|
||||
* caddr[10] = 0xff;
|
||||
* caddr[11] = 0xff; */
|
||||
} else {
|
||||
caddr[10] = 0xff;
|
||||
caddr[11] = 0xff;
|
||||
@ -889,46 +890,39 @@ NET_InetAddressToSockaddr(JNIEnv *env, jobject iaObj, int port, struct sockaddr
|
||||
} else {
|
||||
getInet6Address_ipaddress(env, iaObj, (char *)caddr);
|
||||
scopeid = getInet6Address_scopeid(env, iaObj);
|
||||
cached_scope_id = (jint)(*env)->GetIntField(env, iaObj, ia6_cachedscopeidID);
|
||||
cached_scope_id = (unsigned int)(*env)->GetIntField(env, iaObj, ia6_cachedscopeidID);
|
||||
}
|
||||
|
||||
memset((char *)him6, 0, sizeof(struct sockaddr_in6));
|
||||
him6->sin6_port = (u_short) htons((u_short)port);
|
||||
memcpy((void *)&(him6->sin6_addr), caddr, sizeof(struct in6_addr) );
|
||||
him6->sin6_family = AF_INET6;
|
||||
if ((family == AF_INET6) && IN6_IS_ADDR_LINKLOCAL( &(him6->sin6_addr) )
|
||||
&& (!scopeid && !cached_scope_id)) {
|
||||
cached_scope_id = getDefaultIPv6Interface(env, him6);
|
||||
sa->sa6.sin6_port = (u_short)htons((u_short)port);
|
||||
memcpy((void *)&sa->sa6.sin6_addr, caddr, sizeof(struct in6_addr));
|
||||
sa->sa6.sin6_family = AF_INET6;
|
||||
if ((family == java_net_InetAddress_IPv6) &&
|
||||
IN6_IS_ADDR_LINKLOCAL(&sa->sa6.sin6_addr) &&
|
||||
(!scopeid && !cached_scope_id))
|
||||
{
|
||||
cached_scope_id = getDefaultIPv6Interface(env, &sa->sa6);
|
||||
(*env)->SetIntField(env, iaObj, ia6_cachedscopeidID, cached_scope_id);
|
||||
}
|
||||
him6->sin6_scope_id = scopeid != 0 ? scopeid : cached_scope_id;
|
||||
*len = sizeof(struct sockaddr_in6) ;
|
||||
} else {
|
||||
struct sockaddr_in *him4 = (struct sockaddr_in *)him;
|
||||
jint address;
|
||||
if (family != AF_INET) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Protocol family unavailable");
|
||||
return -1;
|
||||
sa->sa6.sin6_scope_id = scopeid == 0 ? cached_scope_id : scopeid;
|
||||
if (len != NULL) {
|
||||
*len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
} else {
|
||||
jint address;
|
||||
if (family != java_net_InetAddress_IPv4) {
|
||||
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Protocol family unavailable");
|
||||
return -1;
|
||||
}
|
||||
memset((char *)him4, 0, sizeof(struct sockaddr_in));
|
||||
address = getInetAddress_addr(env, iaObj);
|
||||
him4->sin_port = htons((short) port);
|
||||
him4->sin_addr.s_addr = (u_long) htonl(address);
|
||||
him4->sin_family = AF_INET;
|
||||
*len = sizeof(struct sockaddr_in);
|
||||
sa->sa4.sin_port = htons((short)port);
|
||||
sa->sa4.sin_addr.s_addr = (u_long)htonl(address);
|
||||
sa->sa4.sin_family = AF_INET;
|
||||
if (len != NULL) {
|
||||
*len = sizeof(struct sockaddr_in);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
NET_GetPortFromSockaddr(struct sockaddr *him) {
|
||||
if (him->sa_family == AF_INET6) {
|
||||
return ntohs(((struct sockaddr_in6 *)him)->sin6_port);
|
||||
} else {
|
||||
return ntohs(((struct sockaddr_in *)him)->sin_port);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
NET_IsIPv4Mapped(jbyte* caddr) {
|
||||
int i;
|
||||
@ -961,16 +955,6 @@ NET_IsEqual(jbyte* caddr1, jbyte* caddr2) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int getScopeID(struct sockaddr *him) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
return him6->sin6_scope_id;
|
||||
}
|
||||
|
||||
int cmpScopeID(unsigned int scope, struct sockaddr *him) {
|
||||
struct sockaddr_in6 *him6 = (struct sockaddr_in6 *)him;
|
||||
return him6->sin6_scope_id == scope;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper for select/poll with timeout on a single file descriptor.
|
||||
*
|
||||
|
@ -121,7 +121,7 @@ JNIEXPORT int JNICALL NET_Timeout2(int fd, int fd1, long timeout, int *fdret);
|
||||
|
||||
JNIEXPORT int JNICALL NET_BindV6(struct ipv6bind *b, jboolean exclBind);
|
||||
|
||||
JNIEXPORT int JNICALL NET_WinBind(int s, struct sockaddr *him, int len,
|
||||
JNIEXPORT int JNICALL NET_WinBind(int s, SOCKETADDRESS *sa, int len,
|
||||
jboolean exclBind);
|
||||
|
||||
/* XP versions of the native routines */
|
||||
|
@ -96,7 +96,7 @@ jboolean purgeOutstandingICMP(JNIEnv *env, jclass clazz, jint fd)
|
||||
break;
|
||||
}
|
||||
if (recvfrom(fd, buf, 1, MSG_PEEK,
|
||||
(struct sockaddr *)&sa, &addrlen) != SOCKET_ERROR) {
|
||||
&sa.sa, &addrlen) != SOCKET_ERROR) {
|
||||
break;
|
||||
}
|
||||
if (WSAGetLastError() != WSAECONNRESET) {
|
||||
@ -104,7 +104,7 @@ jboolean purgeOutstandingICMP(JNIEnv *env, jclass clazz, jint fd)
|
||||
break;
|
||||
}
|
||||
|
||||
recvfrom(fd, buf, 1, 0, (struct sockaddr *)&sa, &addrlen);
|
||||
recvfrom(fd, buf, 1, 0, &sa.sa, &addrlen);
|
||||
got_icmp = JNI_TRUE;
|
||||
}
|
||||
|
||||
@ -122,7 +122,7 @@ Java_sun_nio_ch_DatagramChannelImpl_disconnect0(JNIEnv *env, jobject this,
|
||||
|
||||
memset(&sa, 0, sa_len);
|
||||
|
||||
rv = connect((SOCKET)fd, (struct sockaddr *)&sa, sa_len);
|
||||
rv = connect((SOCKET)fd, &sa.sa, sa_len);
|
||||
if (rv == SOCKET_ERROR) {
|
||||
handleSocketError(env, WSAGetLastError());
|
||||
} else {
|
||||
@ -153,7 +153,7 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
(char *)buf,
|
||||
len,
|
||||
0,
|
||||
(struct sockaddr *)&sa,
|
||||
&sa.sa,
|
||||
&sa_len);
|
||||
|
||||
if (n == SOCKET_ERROR) {
|
||||
@ -182,12 +182,11 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
*/
|
||||
senderAddr = (*env)->GetObjectField(env, this, dci_senderAddrID);
|
||||
if (senderAddr != NULL) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, (struct sockaddr *)&sa,
|
||||
senderAddr)) {
|
||||
if (!NET_SockaddrEqualsInetAddress(env, &sa, senderAddr)) {
|
||||
senderAddr = NULL;
|
||||
} else {
|
||||
jint port = (*env)->GetIntField(env, this, dci_senderPortID);
|
||||
if (port != NET_GetPortFromSockaddr((struct sockaddr *)&sa)) {
|
||||
if (port != NET_GetPortFromSockaddr(&sa)) {
|
||||
senderAddr = NULL;
|
||||
}
|
||||
}
|
||||
@ -195,7 +194,7 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
if (senderAddr == NULL) {
|
||||
jobject isa = NULL;
|
||||
int port;
|
||||
jobject ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
|
||||
jobject ia = NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
if (ia != NULL) {
|
||||
isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
|
||||
}
|
||||
@ -204,7 +203,7 @@ Java_sun_nio_ch_DatagramChannelImpl_receive0(JNIEnv *env, jobject this,
|
||||
// update cachedSenderInetAddress/cachedSenderPort
|
||||
(*env)->SetObjectField(env, this, dci_senderAddrID, ia);
|
||||
(*env)->SetIntField(env, this, dci_senderPortID,
|
||||
NET_GetPortFromSockaddr((struct sockaddr *)&sa));
|
||||
NET_GetPortFromSockaddr(&sa));
|
||||
(*env)->SetObjectField(env, this, dci_senderID, isa);
|
||||
}
|
||||
return n;
|
||||
@ -219,21 +218,15 @@ Java_sun_nio_ch_DatagramChannelImpl_send0(JNIEnv *env, jobject this,
|
||||
jint fd = fdval(env, fdo);
|
||||
void *buf = (void *)jlong_to_ptr(address);
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len;
|
||||
int sa_len = 0;
|
||||
jint rv = 0;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, destAddress, destPort,
|
||||
(struct sockaddr *)&sa,
|
||||
&sa_len, preferIPv6) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
|
||||
&sa_len, preferIPv6) != 0) {
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
rv = sendto((SOCKET)fd,
|
||||
buf,
|
||||
len,
|
||||
0,
|
||||
(struct sockaddr *)&sa,
|
||||
sa_len);
|
||||
rv = sendto((SOCKET)fd, buf, len, 0, &sa.sa, sa_len);
|
||||
if (rv == SOCKET_ERROR) {
|
||||
int theErr = (jint)WSAGetLastError();
|
||||
if (theErr == WSAEWOULDBLOCK) {
|
||||
|
@ -168,13 +168,13 @@ Java_sun_nio_ch_Net_bind0(JNIEnv *env, jclass clazz, jobject fdo, jboolean prefe
|
||||
{
|
||||
SOCKETADDRESS sa;
|
||||
int rv;
|
||||
int sa_len;
|
||||
int sa_len = 0;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) {
|
||||
return;
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len, preferIPv6) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
rv = NET_WinBind(fdval(env, fdo), (struct sockaddr *)&sa, sa_len, isExclBind);
|
||||
rv = NET_WinBind(fdval(env, fdo), &sa, sa_len, isExclBind);
|
||||
if (rv == SOCKET_ERROR)
|
||||
NET_ThrowNew(env, WSAGetLastError(), "bind");
|
||||
}
|
||||
@ -194,14 +194,14 @@ Java_sun_nio_ch_Net_connect0(JNIEnv *env, jclass clazz, jboolean preferIPv6, job
|
||||
{
|
||||
SOCKETADDRESS sa;
|
||||
int rv;
|
||||
int sa_len;
|
||||
int sa_len = 0;
|
||||
SOCKET s = (SOCKET)fdval(env, fdo);
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len, preferIPv6) != 0) {
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
rv = connect(s, (struct sockaddr *)&sa, sa_len);
|
||||
rv = connect(s, &sa.sa, sa_len);
|
||||
if (rv != 0) {
|
||||
int err = WSAGetLastError();
|
||||
if (err == WSAEINPROGRESS || err == WSAEWOULDBLOCK) {
|
||||
@ -226,7 +226,7 @@ Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len = sizeof(sa);
|
||||
|
||||
if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
|
||||
if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
|
||||
int error = WSAGetLastError();
|
||||
if (error == WSAEINVAL) {
|
||||
return 0;
|
||||
@ -234,7 +234,7 @@ Java_sun_nio_ch_Net_localPort(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
NET_ThrowNew(env, error, "getsockname");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
return NET_GetPortFromSockaddr((struct sockaddr *)&sa);
|
||||
return NET_GetPortFromSockaddr(&sa);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
@ -244,11 +244,11 @@ Java_sun_nio_ch_Net_localInetAddress(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
int sa_len = sizeof(sa);
|
||||
int port;
|
||||
|
||||
if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
|
||||
if (getsockname(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
|
||||
NET_ThrowNew(env, WSAGetLastError(), "getsockname");
|
||||
return NULL;
|
||||
}
|
||||
return NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
|
||||
return NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
@ -257,7 +257,7 @@ Java_sun_nio_ch_Net_remotePort(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len = sizeof(sa);
|
||||
|
||||
if (getpeername(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
|
||||
if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
|
||||
int error = WSAGetLastError();
|
||||
if (error == WSAEINVAL) {
|
||||
return 0;
|
||||
@ -265,7 +265,7 @@ Java_sun_nio_ch_Net_remotePort(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
NET_ThrowNew(env, error, "getsockname");
|
||||
return IOS_THROWN;
|
||||
}
|
||||
return NET_GetPortFromSockaddr((struct sockaddr *)&sa);
|
||||
return NET_GetPortFromSockaddr(&sa);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
@ -275,11 +275,11 @@ Java_sun_nio_ch_Net_remoteInetAddress(JNIEnv *env, jclass clazz, jobject fdo)
|
||||
int sa_len = sizeof(sa);
|
||||
int port;
|
||||
|
||||
if (getpeername(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
|
||||
if (getpeername(fdval(env, fdo), &sa.sa, &sa_len) < 0) {
|
||||
NET_ThrowNew(env, WSAGetLastError(), "getsockname");
|
||||
return NULL;
|
||||
}
|
||||
return NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, &port);
|
||||
return NET_SockaddrToInetAddress(env, &sa, &port);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
|
@ -95,7 +95,7 @@ Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv *env, jobject this,
|
||||
int addrlen = sizeof(sa);
|
||||
|
||||
memset((char *)&sa, 0, sizeof(sa));
|
||||
newfd = (jint)accept(ssfd, (struct sockaddr *)&sa, &addrlen);
|
||||
newfd = (jint)accept(ssfd, &sa.sa, &addrlen);
|
||||
if (newfd == INVALID_SOCKET) {
|
||||
int theErr = (jint)WSAGetLastError();
|
||||
if (theErr == WSAEWOULDBLOCK) {
|
||||
@ -107,7 +107,7 @@ Java_sun_nio_ch_ServerSocketChannelImpl_accept0(JNIEnv *env, jobject this,
|
||||
|
||||
SetHandleInformation((HANDLE)(UINT_PTR)newfd, HANDLE_FLAG_INHERIT, 0);
|
||||
(*env)->SetIntField(env, newfdo, fd_fdID, newfd);
|
||||
remote_ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, (int *)&remote_port);
|
||||
remote_ia = NET_SockaddrToInetAddress(env, &sa, (int *)&remote_port);
|
||||
CHECK_NULL_RETURN(remote_ia, IOS_THROWN);
|
||||
|
||||
isa = (*env)->NewObject(env, isa_class, isa_ctorID, remote_ia, remote_port);
|
||||
|
@ -88,26 +88,21 @@ JNIEXPORT jint JNICALL
|
||||
Java_sun_nio_ch_WindowsAsynchronousSocketChannelImpl_connect0(JNIEnv* env, jclass this,
|
||||
jlong socket, jboolean preferIPv6, jobject iao, jint port, jlong ov)
|
||||
{
|
||||
SOCKET s = (SOCKET) jlong_to_ptr(socket);
|
||||
OVERLAPPED* lpOverlapped = (OVERLAPPED*) jlong_to_ptr(ov);
|
||||
SOCKET s = (SOCKET)jlong_to_ptr(socket);
|
||||
OVERLAPPED *lpOverlapped = (OVERLAPPED *)jlong_to_ptr(ov);
|
||||
|
||||
SOCKETADDRESS sa;
|
||||
int sa_len;
|
||||
int sa_len = 0;
|
||||
BOOL res;
|
||||
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, (struct sockaddr *)&sa, &sa_len, preferIPv6) != 0) {
|
||||
if (NET_InetAddressToSockaddr(env, iao, port, &sa, &sa_len,
|
||||
preferIPv6) != 0) {
|
||||
return IOS_THROWN;
|
||||
}
|
||||
|
||||
ZeroMemory((PVOID)lpOverlapped, sizeof(OVERLAPPED));
|
||||
|
||||
res = (*ConnectEx_func)(s,
|
||||
(struct sockaddr *)&sa,
|
||||
sa_len,
|
||||
NULL,
|
||||
0,
|
||||
NULL,
|
||||
lpOverlapped);
|
||||
res = (*ConnectEx_func)(s, &sa.sa, sa_len, NULL, 0, NULL, lpOverlapped);
|
||||
if (res == 0) {
|
||||
int error = GetLastError();
|
||||
if (error == ERROR_IO_PENDING) {
|
||||
|
@ -231,6 +231,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
private boolean isFullScreenAnimationOn;
|
||||
|
||||
private volatile boolean isInFullScreen;
|
||||
private volatile boolean isIconifyAnimationActive;
|
||||
|
||||
private Window target;
|
||||
private LWWindowPeer peer;
|
||||
@ -997,6 +998,9 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
if (peer != null) {
|
||||
peer.notifyIconify(iconify);
|
||||
}
|
||||
if (iconify) {
|
||||
isIconifyAnimationActive = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void deliverZoom(final boolean isZoomed) {
|
||||
@ -1071,6 +1075,17 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean isIconified() {
|
||||
boolean isIconified = false;
|
||||
if (target instanceof Frame) {
|
||||
int state = ((Frame)target).getExtendedState();
|
||||
if ((state & Frame.ICONIFIED) != 0) {
|
||||
isIconified = true;
|
||||
}
|
||||
}
|
||||
return isIconifyAnimationActive || isIconified;
|
||||
}
|
||||
|
||||
private boolean isOneOfOwnersOrSelf(CPlatformWindow window) {
|
||||
while (window != null) {
|
||||
if (this == window) {
|
||||
@ -1094,11 +1109,14 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
// the windows are ordered above their nearest owner; ancestors of the window,
|
||||
// which is going to become 'main window', are placed above their siblings.
|
||||
CPlatformWindow rootOwner = getRootOwner();
|
||||
if (rootOwner.isVisible()) {
|
||||
if (rootOwner.isVisible() && !rootOwner.isIconified()) {
|
||||
CWrapper.NSWindow.orderFront(rootOwner.getNSWindowPtr());
|
||||
}
|
||||
final WindowAccessor windowAccessor = AWTAccessor.getWindowAccessor();
|
||||
orderAboveSiblingsImpl(windowAccessor.getOwnedWindows(rootOwner.target));
|
||||
// Do not order child windows of iconified owner.
|
||||
if (!rootOwner.isIconified()) {
|
||||
final WindowAccessor windowAccessor = AWTAccessor.getWindowAccessor();
|
||||
orderAboveSiblingsImpl(windowAccessor.getOwnedWindows(rootOwner.target));
|
||||
}
|
||||
}
|
||||
|
||||
private void orderAboveSiblingsImpl(Window[] windows) {
|
||||
@ -1109,10 +1127,12 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
|
||||
// Go through the list of windows and perform ordering.
|
||||
for (Window w : windows) {
|
||||
boolean iconified = false;
|
||||
final Object p = componentAccessor.getPeer(w);
|
||||
if (p instanceof LWWindowPeer) {
|
||||
CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow();
|
||||
if (pw != null && pw.isVisible()) {
|
||||
iconified = isIconified();
|
||||
if (pw != null && pw.isVisible() && !iconified) {
|
||||
// If the window is one of ancestors of 'main window' or is going to become main by itself,
|
||||
// the window should be ordered above its siblings; otherwise the window is just ordered
|
||||
// above its nearest parent.
|
||||
@ -1125,10 +1145,13 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
pw.applyWindowLevel(w);
|
||||
}
|
||||
}
|
||||
// Retrieve the child windows for each window from the list and store them for future use.
|
||||
// Retrieve the child windows for each window from the list except iconified ones
|
||||
// and store them for future use.
|
||||
// Note: we collect data about child windows even for invisible owners, since they may have
|
||||
// visible children.
|
||||
childWindows.addAll(Arrays.asList(windowAccessor.getOwnedWindows(w)));
|
||||
if (!iconified) {
|
||||
childWindows.addAll(Arrays.asList(windowAccessor.getOwnedWindows(w)));
|
||||
}
|
||||
}
|
||||
// If some windows, which have just been ordered, have any child windows, let's start new iteration
|
||||
// and order these child windows.
|
||||
@ -1149,6 +1172,10 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
// NATIVE CALLBACKS
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
private void windowWillMiniaturize() {
|
||||
isIconifyAnimationActive = true;
|
||||
}
|
||||
|
||||
private void windowDidBecomeMain() {
|
||||
if (checkBlockingAndOrder()) return;
|
||||
// If it's not blocked, make sure it's above its siblings
|
||||
|
@ -327,10 +327,43 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
return [window isKindOfClass: [AWTWindow_Panel class]] || [window isKindOfClass: [AWTWindow_Normal class]];
|
||||
}
|
||||
|
||||
// Retrieves the list of possible window layers (levels)
|
||||
+ (NSArray*) getWindowLayers {
|
||||
static NSArray *windowLayers;
|
||||
static dispatch_once_t token;
|
||||
|
||||
// Initialize the list of possible window layers
|
||||
dispatch_once(&token, ^{
|
||||
// The layers are ordered from front to back, (i.e. the toppest one is the first)
|
||||
windowLayers = [NSArray arrayWithObjects:
|
||||
[NSNumber numberWithInt:CGWindowLevelForKey(kCGPopUpMenuWindowLevelKey)],
|
||||
[NSNumber numberWithInt:CGWindowLevelForKey(kCGFloatingWindowLevelKey)],
|
||||
[NSNumber numberWithInt:CGWindowLevelForKey(kCGNormalWindowLevelKey)],
|
||||
nil
|
||||
];
|
||||
[windowLayers retain];
|
||||
});
|
||||
return windowLayers;
|
||||
}
|
||||
|
||||
// returns id for the topmost window under mouse
|
||||
+ (NSInteger) getTopmostWindowUnderMouseID {
|
||||
NSInteger result = -1;
|
||||
|
||||
NSArray *windowLayers = [AWTWindow getWindowLayers];
|
||||
// Looking for the window under mouse starting from the toppest layer
|
||||
for (NSNumber *layer in windowLayers) {
|
||||
result = [AWTWindow getTopmostWindowUnderMouseIDImpl:[layer integerValue]];
|
||||
if (result != -1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
+ (NSInteger) getTopmostWindowUnderMouseIDImpl:(NSInteger)windowLayer {
|
||||
NSInteger result = -1;
|
||||
|
||||
NSRect screenRect = [[NSScreen mainScreen] frame];
|
||||
NSPoint nsMouseLocation = [NSEvent mouseLocation];
|
||||
CGPoint cgMouseLocation = CGPointMake(nsMouseLocation.x, screenRect.size.height - nsMouseLocation.y);
|
||||
@ -339,7 +372,7 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
|
||||
for (NSDictionary *window in windows) {
|
||||
NSInteger layer = [[window objectForKey:(id)kCGWindowLayer] integerValue];
|
||||
if (layer == 0) {
|
||||
if (layer == windowLayer) {
|
||||
CGRect rect;
|
||||
CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)[window objectForKey:(id)kCGWindowBounds], &rect);
|
||||
if (CGRectContainsPoint(rect, cgMouseLocation)) {
|
||||
@ -639,6 +672,14 @@ AWT_ASSERT_APPKIT_THREAD;
|
||||
AWT_ASSERT_APPKIT_THREAD;
|
||||
|
||||
self.isMinimizing = YES;
|
||||
|
||||
JNIEnv *env = [ThreadUtilities getJNIEnv];
|
||||
jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env];
|
||||
if (platformWindow != NULL) {
|
||||
static JNF_MEMBER_CACHE(jm_windowWillMiniaturize, jc_CPlatformWindow, "windowWillMiniaturize", "()V");
|
||||
JNFCallVoidMethod(env, platformWindow, jm_windowWillMiniaturize);
|
||||
(*env)->DeleteLocalRef(env, platformWindow);
|
||||
}
|
||||
// Excplicitly make myself a key window to avoid possible
|
||||
// negative visual effects during iconify operation
|
||||
[self.nsWindow makeKeyAndOrderFront:self.nsWindow];
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -730,18 +730,47 @@ public class TIFFImageReader extends ImageReader {
|
||||
// to use it if the data layout is component type.
|
||||
if (iccProfileField != null
|
||||
&& itsRaw.getColorModel() instanceof ComponentColorModel) {
|
||||
// Create a ColorSpace from the profile.
|
||||
byte[] iccProfileValue = iccProfileField.getAsBytes();
|
||||
ICC_Profile iccProfile
|
||||
= ICC_Profile.getInstance(iccProfileValue);
|
||||
ICC_ColorSpace iccColorSpace
|
||||
= new ICC_ColorSpace(iccProfile);
|
||||
|
||||
// Get the raw sample and color information.
|
||||
ColorModel cmRaw = itsRaw.getColorModel();
|
||||
ColorSpace csRaw = cmRaw.getColorSpace();
|
||||
SampleModel smRaw = itsRaw.getSampleModel();
|
||||
|
||||
ColorSpace iccColorSpace = null;
|
||||
try {
|
||||
// Create a ColorSpace from the profile.
|
||||
byte[] iccProfileValue = iccProfileField.getAsBytes();
|
||||
ICC_Profile iccProfile
|
||||
= ICC_Profile.getInstance(iccProfileValue);
|
||||
iccColorSpace = new ICC_ColorSpace(iccProfile);
|
||||
|
||||
// Workaround for JDK-8145241: test a conversion and fall
|
||||
// back to a standard ColorSpace if it fails. This
|
||||
// workaround could be removed if JDK-8145241 is fixed.
|
||||
float[] rgb =
|
||||
iccColorSpace.toRGB(new float[] {1.0F, 1.0F, 1.0F});
|
||||
} catch (Exception iccProfileException) {
|
||||
processWarningOccurred("Superseding bad ICC profile: "
|
||||
+ iccProfileException.getMessage());
|
||||
|
||||
if (iccColorSpace != null) {
|
||||
switch (iccColorSpace.getType()) {
|
||||
case ColorSpace.TYPE_GRAY:
|
||||
iccColorSpace =
|
||||
ColorSpace.getInstance(ColorSpace.CS_GRAY);
|
||||
break;
|
||||
case ColorSpace.TYPE_RGB:
|
||||
iccColorSpace =
|
||||
ColorSpace.getInstance(ColorSpace.CS_sRGB);
|
||||
break;
|
||||
default:
|
||||
iccColorSpace = csRaw;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
iccColorSpace = csRaw;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the number of samples per pixel and the number
|
||||
// of color components.
|
||||
int numBands = smRaw.getNumBands();
|
||||
|
@ -30,21 +30,20 @@ import java.applet.Applet;
|
||||
import java.beans.beancontext.BeanContext;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* This interface is designed to work in collusion with java.beans.Beans.instantiate.
|
||||
* The interface is intended to provide mechanism to allow the proper
|
||||
* initialization of JavaBeans that are also Applets, during their
|
||||
* instantiation by java.beans.Beans.instantiate().
|
||||
* </p>
|
||||
*
|
||||
* @see java.beans.Beans#instantiate
|
||||
*
|
||||
* @since 1.2
|
||||
*
|
||||
* @deprecated The Applet API is deprecated. See the
|
||||
* <a href="../applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Deprecated(since = "9")
|
||||
public interface AppletInitializer {
|
||||
|
||||
/**
|
||||
@ -74,7 +73,6 @@ public interface AppletInitializer {
|
||||
* @param bCtxt The BeanContext intended for this Applet, or
|
||||
* null.
|
||||
*/
|
||||
|
||||
void initialize(Applet newAppletBean, BeanContext bCtxt);
|
||||
|
||||
/**
|
||||
@ -86,6 +84,5 @@ public interface AppletInitializer {
|
||||
*
|
||||
* @param newApplet The newly instantiated JavaBean
|
||||
*/
|
||||
|
||||
void activate(Applet newApplet);
|
||||
}
|
||||
|
@ -97,8 +97,10 @@ public class Beans {
|
||||
* @exception IOException if an I/O error occurs.
|
||||
* @since 1.2
|
||||
*/
|
||||
|
||||
public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext) throws IOException, ClassNotFoundException {
|
||||
@SuppressWarnings("deprecation")
|
||||
public static Object instantiate(ClassLoader cls, String beanName,
|
||||
BeanContext beanContext)
|
||||
throws IOException, ClassNotFoundException {
|
||||
return Beans.instantiate(cls, beanName, beanContext, null);
|
||||
}
|
||||
|
||||
@ -153,10 +155,18 @@ public class Beans {
|
||||
* object could not be found.
|
||||
* @exception IOException if an I/O error occurs.
|
||||
* @since 1.2
|
||||
*
|
||||
* @deprecated It is recommended to use
|
||||
* {@link #instantiate(ClassLoader, String, BeanContext)},
|
||||
* because the Applet API is deprecated. See the
|
||||
* <a href="../../java/applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public static Object instantiate(ClassLoader cls, String beanName, BeanContext beanContext, AppletInitializer initializer)
|
||||
throws IOException, ClassNotFoundException {
|
||||
@Deprecated(since = "9")
|
||||
public static Object instantiate(ClassLoader cls, String beanName,
|
||||
BeanContext beanContext,
|
||||
AppletInitializer initializer)
|
||||
throws IOException, ClassNotFoundException {
|
||||
|
||||
InputStream ins;
|
||||
ObjectInputStream oins = null;
|
||||
@ -501,7 +511,7 @@ class ObjectInputStreamWithLoader extends ObjectInputStream
|
||||
* Package private support class. This provides a default AppletContext
|
||||
* for beans which are applets.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
@Deprecated(since = "9")
|
||||
class BeansAppletContext implements AppletContext {
|
||||
Applet target;
|
||||
Hashtable<URL,Object> imageCache = new Hashtable<>();
|
||||
@ -586,7 +596,7 @@ class BeansAppletContext implements AppletContext {
|
||||
* Package private support class. This provides an AppletStub
|
||||
* for beans which are applets.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
@Deprecated(since = "9")
|
||||
class BeansAppletStub implements AppletStub {
|
||||
transient boolean active;
|
||||
transient Applet target;
|
||||
|
@ -260,6 +260,7 @@ public class PopupFactory {
|
||||
* Obtains the appropriate <code>Popup</code> based on
|
||||
* <code>popupType</code>.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
private Popup getPopup(Component owner, Component contents,
|
||||
int ownerX, int ownerY, int popupType) {
|
||||
if (GraphicsEnvironment.isHeadless()) {
|
||||
|
@ -525,8 +525,12 @@ public class RepaintManager
|
||||
* @param h Height of the region to repaint
|
||||
* @see JApplet#repaint
|
||||
* @since 1.6
|
||||
*
|
||||
* @deprecated The Applet API is deprecated. See the
|
||||
* <a href="../../java/applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
@Deprecated(since = "9")
|
||||
public void addDirtyRegion(Applet applet, int x, int y, int w, int h) {
|
||||
addDirtyRegion0(applet, x, y, w, h);
|
||||
}
|
||||
|
@ -380,6 +380,12 @@ class TablePrintable implements Printable {
|
||||
// print the current section of the table
|
||||
g2d.translate(-clip.x, -clip.y);
|
||||
g2d.clip(clip);
|
||||
|
||||
// set a property so that BasicTableUI#paint can know JTable printMode
|
||||
// is FIT_WIDTH since TablePrintable.printMode is not accessible from BasicTableUI
|
||||
if (printMode == JTable.PrintMode.FIT_WIDTH) {
|
||||
table.putClientProperty("Table.printMode", JTable.PrintMode.FIT_WIDTH);
|
||||
}
|
||||
table.print(g2d);
|
||||
|
||||
// restore the original transform and clip
|
||||
@ -407,8 +413,18 @@ class TablePrintable implements Printable {
|
||||
for(int visrow = rMin; visrow < rMax; visrow++) {
|
||||
rowHeight += table.getRowHeight(visrow);
|
||||
}
|
||||
g2d.drawRect(0, 0, visibleBounds.width, hclip.height + rowHeight);
|
||||
// If PrintMode is FIT_WIDTH, then draw rect for entire column width while
|
||||
// printing irrespective of how many columns are visible in console
|
||||
if (printMode == JTable.PrintMode.FIT_WIDTH) {
|
||||
g2d.drawRect(0, 0, clip.width, hclip.height + rowHeight);
|
||||
} else {
|
||||
g2d.drawRect(0, 0, visibleBounds.width, hclip.height + rowHeight);
|
||||
}
|
||||
|
||||
// clear the property
|
||||
if (printMode == JTable.PrintMode.FIT_WIDTH) {
|
||||
table.putClientProperty("Table.printMode", null);
|
||||
}
|
||||
// dispose the graphics copy
|
||||
g2d.dispose();
|
||||
|
||||
@ -534,5 +550,4 @@ class TablePrintable implements Printable {
|
||||
} while (clip.width + colWidth <= pw);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1812,12 +1812,12 @@ public class BasicTableUI extends TableUI
|
||||
}
|
||||
|
||||
boolean ltr = table.getComponentOrientation().isLeftToRight();
|
||||
|
||||
Point upperLeft, lowerRight;
|
||||
// compute the visible part of table which needs to be painted
|
||||
Rectangle visibleBounds = clip.intersection(bounds);
|
||||
Point upperLeft = visibleBounds.getLocation();
|
||||
Point lowerRight = new Point(visibleBounds.x + visibleBounds.width - 1,
|
||||
visibleBounds.y + visibleBounds.height - 1);
|
||||
upperLeft = visibleBounds.getLocation();
|
||||
lowerRight = new Point(visibleBounds.x + visibleBounds.width - 1,
|
||||
visibleBounds.y + visibleBounds.height - 1);
|
||||
|
||||
int rMin = table.rowAtPoint(upperLeft);
|
||||
int rMax = table.rowAtPoint(lowerRight);
|
||||
@ -1834,6 +1834,18 @@ public class BasicTableUI extends TableUI
|
||||
rMax = table.getRowCount()-1;
|
||||
}
|
||||
|
||||
// For FIT_WIDTH, all columns should be printed irrespective of
|
||||
// how many columns are visible. So, we used clip which is already set to
|
||||
// total col width instead of visible region
|
||||
// Since JTable.PrintMode is not accessible
|
||||
// from here, we aet "Table.printMode" in TablePrintable#print and
|
||||
// access from here.
|
||||
Object printMode = table.getClientProperty("Table.printMode");
|
||||
if ((printMode == JTable.PrintMode.FIT_WIDTH)) {
|
||||
upperLeft = clip.getLocation();
|
||||
lowerRight = new Point(clip.x + clip.width - 1,
|
||||
clip.y + clip.height - 1);
|
||||
}
|
||||
int cMin = table.columnAtPoint(ltr ? upperLeft : lowerRight);
|
||||
int cMax = table.columnAtPoint(ltr ? lowerRight : upperLeft);
|
||||
// This should never happen.
|
||||
@ -2018,7 +2030,7 @@ public class BasicTableUI extends TableUI
|
||||
int y = damagedArea.y;
|
||||
for (int row = rMin; row <= rMax; row++) {
|
||||
y += table.getRowHeight(row);
|
||||
g.drawLine(damagedArea.x, y - 1, tableWidth - 1, y - 1);
|
||||
SwingUtilities2.drawHLine(g, damagedArea.x, tableWidth - 1, y - 1);
|
||||
}
|
||||
}
|
||||
if (table.getShowVerticalLines()) {
|
||||
@ -2030,14 +2042,14 @@ public class BasicTableUI extends TableUI
|
||||
for (int column = cMin; column <= cMax; column++) {
|
||||
int w = cm.getColumn(column).getWidth();
|
||||
x += w;
|
||||
g.drawLine(x - 1, 0, x - 1, tableHeight - 1);
|
||||
SwingUtilities2.drawVLine(g, x - 1, 0, tableHeight - 1);
|
||||
}
|
||||
} else {
|
||||
x = damagedArea.x;
|
||||
for (int column = cMax; column >= cMin; column--) {
|
||||
int w = cm.getColumn(column).getWidth();
|
||||
x += w;
|
||||
g.drawLine(x - 1, 0, x - 1, tableHeight - 1);
|
||||
SwingUtilities2.drawVLine(g, x - 1, 0, tableHeight - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,10 +27,7 @@ package javax.swing.text;
|
||||
import sun.swing.SwingUtilities2;
|
||||
import java.awt.*;
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import javax.swing.JPasswordField;
|
||||
import static javax.swing.text.PlainView.isFPMethodOverriden;
|
||||
|
||||
/**
|
||||
* Implements a View suitable for use in JPasswordField
|
||||
@ -332,22 +329,6 @@ public class PasswordView extends FieldView {
|
||||
|
||||
static char[] ONE = new char[1];
|
||||
|
||||
private final boolean drawEchoCharacterOverridden;
|
||||
|
||||
{
|
||||
final Class<?> CLS = getClass();
|
||||
final Class<?> INT = Integer.TYPE;
|
||||
final Class<?> FP = Float.TYPE;
|
||||
final Class<?> CHAR = Character.TYPE;
|
||||
|
||||
drawEchoCharacterOverridden = AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
Class<?>[] intTypes = {Graphics.class, INT, INT, CHAR};
|
||||
Class<?>[] fpTypes = {Graphics2D.class, FP, FP, CHAR};
|
||||
return isFPMethodOverriden("drawEchoCharacter", CLS, intTypes, fpTypes);
|
||||
}
|
||||
});
|
||||
}
|
||||
private final boolean drawEchoCharacterOverridden =
|
||||
getFPMethodOverridden(getClass(), "drawEchoCharacter", FPMethodArgs.GNNC);
|
||||
}
|
||||
|
@ -32,6 +32,8 @@ import java.security.PrivilegedAction;
|
||||
import java.util.Objects;
|
||||
import javax.swing.event.*;
|
||||
import java.lang.reflect.Module;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Implements View interface for a simple multi-line text view
|
||||
@ -818,10 +820,45 @@ public class PlainView extends View implements TabExpander {
|
||||
return w;
|
||||
}
|
||||
|
||||
static boolean isFPMethodOverriden(String method,
|
||||
Class<?> cls,
|
||||
Class<?>[] intTypes,
|
||||
Class<?>[] fpTypes)
|
||||
static boolean getFPMethodOverridden(Class<?> cls, String method,
|
||||
FPMethodArgs methodArgs) {
|
||||
HashMap<FPMethodItem, Boolean> map = null;
|
||||
boolean initialized = methodsOverriddenMapRef != null
|
||||
&& (map = methodsOverriddenMapRef.get()) != null;
|
||||
|
||||
if (!initialized) {
|
||||
map = new HashMap<>();
|
||||
methodsOverriddenMapRef = new SoftReference<>(map);
|
||||
}
|
||||
|
||||
FPMethodItem key = new FPMethodItem(cls, method);
|
||||
Boolean isFPMethodOverridden = map.get(key);
|
||||
if (isFPMethodOverridden == null) {
|
||||
isFPMethodOverridden = checkFPMethodOverridden(cls, method, methodArgs);
|
||||
map.put(key, isFPMethodOverridden);
|
||||
}
|
||||
return isFPMethodOverridden;
|
||||
}
|
||||
|
||||
private static boolean checkFPMethodOverridden(final Class<?> className,
|
||||
final String methodName,
|
||||
final FPMethodArgs methodArgs) {
|
||||
|
||||
return AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
return isFPMethodOverridden(methodName, className,
|
||||
methodArgs.getMethodArguments(false),
|
||||
methodArgs.getMethodArguments(true));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static boolean isFPMethodOverridden(String method,
|
||||
Class<?> cls,
|
||||
Class<?>[] intTypes,
|
||||
Class<?>[] fpTypes)
|
||||
{
|
||||
Module thisModule = PlainView.class.getModule();
|
||||
while (!thisModule.equals(cls.getModule())) {
|
||||
@ -840,6 +877,57 @@ public class PlainView extends View implements TabExpander {
|
||||
return true;
|
||||
}
|
||||
|
||||
enum FPMethodArgs {
|
||||
|
||||
IGNN,
|
||||
IIGNN,
|
||||
GNNII,
|
||||
GNNC;
|
||||
|
||||
public Class<?>[] getMethodArguments(boolean isFPType) {
|
||||
Class<?> N = (isFPType) ? Float.TYPE : Integer.TYPE;
|
||||
Class<?> G = (isFPType) ? Graphics2D.class : Graphics.class;
|
||||
switch (this) {
|
||||
case IGNN:
|
||||
return new Class<?>[]{Integer.TYPE, G, N, N};
|
||||
case IIGNN:
|
||||
return new Class<?>[]{Integer.TYPE, Integer.TYPE, G, N, N};
|
||||
case GNNII:
|
||||
return new Class<?>[]{G, N, N, Integer.TYPE, Integer.TYPE};
|
||||
case GNNC:
|
||||
return new Class<?>[]{G, N, N, Character.TYPE};
|
||||
default:
|
||||
throw new RuntimeException("Unknown method arguments!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class FPMethodItem {
|
||||
|
||||
final Class<?> className;
|
||||
final String methodName;
|
||||
|
||||
public FPMethodItem(Class<?> className, String methodName) {
|
||||
this.className = className;
|
||||
this.methodName = methodName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof FPMethodItem) {
|
||||
FPMethodItem that = (FPMethodItem) obj;
|
||||
return this.className.equals(that.className)
|
||||
&& this.methodName.equals(that.methodName);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 31 * methodName.hashCode() + className.hashCode();
|
||||
}
|
||||
}
|
||||
|
||||
// --- member variables -----------------------------------------------
|
||||
|
||||
/**
|
||||
@ -878,46 +966,13 @@ public class PlainView extends View implements TabExpander {
|
||||
*/
|
||||
int firstLineOffset;
|
||||
|
||||
final boolean drawLineOverridden;
|
||||
final boolean drawSelectedTextOverridden;
|
||||
final boolean drawUnselectedTextOverridden;
|
||||
final boolean useFloatingPointAPI;
|
||||
|
||||
{
|
||||
final Class<?> CLS = getClass();
|
||||
final Class<?> INT = Integer.TYPE;
|
||||
final Class<?> FP = Float.TYPE;
|
||||
|
||||
drawLineOverridden = AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
Class<?>[] intTypes = {INT, Graphics.class, INT, INT};
|
||||
Class<?>[] fpTypes = {INT, Graphics2D.class, FP, FP};
|
||||
return isFPMethodOverriden("drawLine", CLS, intTypes, fpTypes);
|
||||
}
|
||||
});
|
||||
|
||||
drawUnselectedTextOverridden = AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
Class<?>[] intTypes = {Graphics.class, INT, INT, INT, INT};
|
||||
Class<?>[] fpTypes = {Graphics2D.class, FP, FP, INT, INT};
|
||||
return isFPMethodOverriden("drawUnselectedText", CLS, intTypes, fpTypes);
|
||||
}
|
||||
});
|
||||
|
||||
drawSelectedTextOverridden = AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
Class<?>[] intTypes = {Graphics.class, INT, INT, INT, INT};
|
||||
Class<?>[] fpTypes = {Graphics2D.class, FP, FP, INT, INT};
|
||||
return isFPMethodOverriden("drawSelectedText", CLS, intTypes, fpTypes);
|
||||
}
|
||||
});
|
||||
|
||||
useFloatingPointAPI = drawUnselectedTextOverridden || drawSelectedTextOverridden;
|
||||
}
|
||||
private static SoftReference<HashMap<FPMethodItem, Boolean>> methodsOverriddenMapRef;
|
||||
final boolean drawLineOverridden =
|
||||
getFPMethodOverridden(getClass(), "drawLine", FPMethodArgs.IGNN);
|
||||
final boolean drawSelectedTextOverridden =
|
||||
getFPMethodOverridden(getClass(), "drawSelectedText", FPMethodArgs.GNNII);
|
||||
final boolean drawUnselectedTextOverridden =
|
||||
getFPMethodOverridden(getClass(), "drawUnselectedText", FPMethodArgs.GNNII);
|
||||
final boolean useFloatingPointAPI =
|
||||
drawUnselectedTextOverridden || drawSelectedTextOverridden;
|
||||
}
|
||||
|
@ -28,10 +28,9 @@ import java.awt.*;
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import javax.swing.event.*;
|
||||
import static javax.swing.text.PlainView.isFPMethodOverriden;
|
||||
import static javax.swing.text.PlainView.FPMethodArgs.*;
|
||||
import static javax.swing.text.PlainView.getFPMethodOverridden;
|
||||
|
||||
/**
|
||||
* View of plain text (text with only one font and color)
|
||||
@ -989,46 +988,12 @@ public class WrappedPlainView extends BoxView implements TabExpander {
|
||||
SoftReference<int[]> lineCache = null;
|
||||
}
|
||||
|
||||
private final boolean drawLineOverridden;
|
||||
private final boolean drawSelectedTextOverridden;
|
||||
private final boolean drawUnselectedTextOverridden;
|
||||
private final boolean useFloatingPointAPI;
|
||||
|
||||
{
|
||||
final Class<?> CLS = getClass();
|
||||
final Class<?> INT = Integer.TYPE;
|
||||
final Class<?> FP = Float.TYPE;
|
||||
|
||||
drawLineOverridden = AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
Class<?>[] intTypes = {INT, INT, Graphics.class, INT, INT};
|
||||
Class<?>[] fpTypes = {INT, INT, Graphics2D.class, FP, FP};
|
||||
return isFPMethodOverriden("drawLine", CLS, intTypes, fpTypes);
|
||||
}
|
||||
});
|
||||
|
||||
drawUnselectedTextOverridden = AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
Class<?>[] intTypes = {Graphics.class, INT, INT, INT, INT};
|
||||
Class<?>[] fpTypes = {Graphics2D.class, FP, FP, INT, INT};
|
||||
return isFPMethodOverriden("drawUnselectedText", CLS, intTypes, fpTypes);
|
||||
}
|
||||
});
|
||||
|
||||
drawSelectedTextOverridden = AccessController
|
||||
.doPrivileged(new PrivilegedAction<Boolean>() {
|
||||
@Override
|
||||
public Boolean run() {
|
||||
Class<?>[] intTypes = {Graphics.class, INT, INT, INT, INT};
|
||||
Class<?>[] fpTypes = {Graphics2D.class, FP, FP, INT, INT};
|
||||
return isFPMethodOverriden("drawSelectedText", CLS, intTypes, fpTypes);
|
||||
}
|
||||
});
|
||||
|
||||
useFloatingPointAPI = drawUnselectedTextOverridden || drawSelectedTextOverridden;
|
||||
}
|
||||
private final boolean drawLineOverridden =
|
||||
getFPMethodOverridden(getClass(), "drawLine", IIGNN);
|
||||
private final boolean drawSelectedTextOverridden =
|
||||
getFPMethodOverridden(getClass(), "drawSelectedText", GNNII);
|
||||
private final boolean drawUnselectedTextOverridden =
|
||||
getFPMethodOverridden(getClass(), "drawUnselectedText", GNNII);
|
||||
private final boolean useFloatingPointAPI =
|
||||
drawUnselectedTextOverridden || drawSelectedTextOverridden;
|
||||
}
|
||||
|
@ -32,8 +32,13 @@ import java.util.EventObject;
|
||||
* AppletEvent class.
|
||||
*
|
||||
* @author Sunita Mani
|
||||
*
|
||||
* @deprecated The Applet API is deprecated. See the
|
||||
* <a href="../../java/applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
@SuppressWarnings("serial") // JDK-implementation class
|
||||
@Deprecated(since = "9")
|
||||
public class AppletEvent extends EventObject {
|
||||
|
||||
private Object arg;
|
||||
|
@ -36,7 +36,12 @@ import java.io.IOException;
|
||||
* responsible for dispatching events to them.
|
||||
*
|
||||
* @author Sunita Mani
|
||||
*
|
||||
* @deprecated The Applet API is deprecated. See the
|
||||
* <a href="../../java/applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
@Deprecated(since = "9")
|
||||
public class AppletEventMulticaster implements AppletListener {
|
||||
|
||||
private final AppletListener a, b;
|
||||
|
@ -31,10 +31,14 @@ import java.io.IOException;
|
||||
* An applet IO exception.
|
||||
*
|
||||
* @author Koji Uno
|
||||
*
|
||||
* @deprecated The Applet API is deprecated. See the
|
||||
* <a href="../../java/applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
@SuppressWarnings("serial") // JDK implementation class
|
||||
public
|
||||
class AppletIOException extends IOException {
|
||||
@Deprecated(since = "9")
|
||||
public class AppletIOException extends IOException {
|
||||
private String key = null;
|
||||
private Object msgobj = null;
|
||||
|
||||
|
@ -29,10 +29,14 @@ package sun.applet;
|
||||
* An applet security exception.
|
||||
*
|
||||
* @author Arthur van Hoff
|
||||
*
|
||||
* @deprecated The Applet API is deprecated. See the
|
||||
* <a href="../../java/applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
@SuppressWarnings("serial") // JDK implementation class
|
||||
public
|
||||
class AppletIllegalArgumentException extends IllegalArgumentException {
|
||||
@Deprecated(since = "9")
|
||||
public class AppletIllegalArgumentException extends IllegalArgumentException {
|
||||
private String key = null;
|
||||
|
||||
public AppletIllegalArgumentException(String key) {
|
||||
|
@ -31,6 +31,7 @@ import java.lang.ref.SoftReference;
|
||||
import sun.awt.image.URLImageSource;
|
||||
import java.net.URL;
|
||||
|
||||
@Deprecated(since = "9")
|
||||
class AppletImageRef {
|
||||
private SoftReference<Image> soft = null;
|
||||
|
||||
|
@ -32,8 +32,12 @@ import java.util.EventListener;
|
||||
* by objects interested in AppletEvents.
|
||||
*
|
||||
* @author Sunita Mani
|
||||
*
|
||||
* @deprecated The Applet API is deprecated. See the
|
||||
* <a href="../../java/applet/package-summary.html"> java.applet package
|
||||
* documentation</a> for further information.
|
||||
*/
|
||||
|
||||
@Deprecated(since = "9")
|
||||
public interface AppletListener extends EventListener {
|
||||
public void appletStateChanged(AppletEvent e);
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user